private void GenerateMaterials()
    {
        Scene.Materials.Clear();

        var materialCount = Rand.Range(MaterialCountMinMax);

        for (var i = 0; i < materialCount; i++)
        {
            var material    = new SceneMaterial();
            var color       = Random.ColorHSV();
            var colorVector = new Vector3(color.r, color.g, color.b);
            var isMetallic  = Rand.Chance(MetallicChance);
            var specular    = Rand.Range(SpecularRange);
            if (isMetallic)
            {
                material.Albedo   = colorVector * specular;
                material.Specular = colorVector;
            }
            else
            {
                material.Albedo   = colorVector;
                material.Specular = Vector3.zero;
            }
            Scene.Materials.Add(material);
        }

        if (materialComputeBuffer != null)
        {
            materialComputeBuffer.Release();
        }
        MakeBuffer(ref materialComputeBuffer, materialCount, Scene.Materials[0].Stride, Scene.Materials.ToArray());
    }
Exemple #2
0
		public IMaterial CreateMaterial(BspMaterialKey material)
		{
			var baseFileName = this.GetMaterialFileName(material.Material);
			var imagePath = baseFileName;
			var texture = new FileReferenceImage { Path = imagePath };
			this.Scene.Images.Add(texture);
			var effect = new SceneEffect
				{
					CullMode = CullMode.None,
					//Diffuse = new ImageColorSource { Image = texture }
				};
			this.Scene.Effects.Add(effect);
			var sceneMaterial = new SceneMaterial { Effect = effect };
			this.Scene.Materials.Add(sceneMaterial);
			return sceneMaterial;
		}
Exemple #3
0
		private void ParseMaterial(Scene scene, XElement material)
		{
			var sceneMaterial = new SceneMaterial();
			this.ParseIdAndName(material, sceneMaterial);
			var instanceEffect = material.Element(this.schema.instanceEffectName);
			if (instanceEffect != null)
			{
				string id = instanceEffect.AttributeValue(this.schema.urlName).Substring(1);
				sceneMaterial.Effect = (from g in scene.Effects where g.Id == id select g).First();
			}
			scene.Materials.Add(sceneMaterial);
		}
Exemple #4
0
		private IMaterial ParseMaterial(AseParser parser, Scene scene)
		{
			var sceneEffect = new SceneEffect() {CullMode = CullMode.Front};
			var m = new SceneMaterial { Effect = sceneEffect };
			parser.Consume("{");
			for (;;)
			{
				var attr = parser.Consume();
				if (attr == null || attr == "}")
				{
					break;
				}
				if (0 == string.Compare(attr, "*MATERIAL_NAME", StringComparison.InvariantCultureIgnoreCase))
				{
					m.Id = m.Name = sceneEffect.Id = sceneEffect.Name = parser.Consume();
					continue;
				}
				if (0 == string.Compare(attr, "*MATERIAL_CLASS", StringComparison.InvariantCultureIgnoreCase))
				{
					parser.Consume();
					continue;
				}
				if (0 == string.Compare(attr, "*MATERIAL_AMBIENT", StringComparison.InvariantCultureIgnoreCase))
				{
					sceneEffect.Ambient = new SolidColorSource { Color = ParseColor(parser) };
					continue;
				}
				if (0 == string.Compare(attr, "*MATERIAL_DIFFUSE", StringComparison.InvariantCultureIgnoreCase))
				{
					sceneEffect.Diffuse = new SolidColorSource { Color = ParseColor(parser) };
					continue;
				}
				if (0 == string.Compare(attr, "*MATERIAL_SPECULAR", StringComparison.InvariantCultureIgnoreCase))
				{
					sceneEffect.Specular = new SolidColorSource { Color = ParseColor(parser) };
					continue;
				}
				if (0 == string.Compare(attr, "*MATERIAL_SHINE", StringComparison.InvariantCultureIgnoreCase))
				{
					sceneEffect.Shininess = parser.ConsumeFloat();
					continue;
				}
				if (0 == string.Compare(attr, "*MATERIAL_SHINESTRENGTH", StringComparison.InvariantCultureIgnoreCase))
				{
					parser.ConsumeFloat();
					continue;
				}
				if (0 == string.Compare(attr, "*MATERIAL_TRANSPARENCY", StringComparison.InvariantCultureIgnoreCase))
				{
					sceneEffect.Transparency = parser.ConsumeFloat();
					continue;
				}
				if (0 == string.Compare(attr, "*MATERIAL_WIRESIZE", StringComparison.InvariantCultureIgnoreCase))
				{
					parser.ConsumeFloat();
					continue;
				}
				if (0 == string.Compare(attr, "*MATERIAL_XP_FALLOFF", StringComparison.InvariantCultureIgnoreCase))
				{
					parser.ConsumeFloat();
					continue;
				}
				if (0 == string.Compare(attr, "*MATERIAL_SELFILLUM", StringComparison.InvariantCultureIgnoreCase))
				{
					parser.ConsumeFloat();
					continue;
				}
				if (0 == string.Compare(attr, "*MATERIAL_SHADING", StringComparison.InvariantCultureIgnoreCase))
				{
					parser.Consume();
					continue;
				}
				if (0 == string.Compare(attr, "*MATERIAL_FALLOFF", StringComparison.InvariantCultureIgnoreCase))
				{
					parser.Consume();
					continue;
				}
				if (0 == string.Compare(attr, "*MATERIAL_XP_TYPE", StringComparison.InvariantCultureIgnoreCase))
				{
					parser.Consume();
					continue;
				}

				if (0 == string.Compare(attr, "*MAP_AMBIENT", StringComparison.InvariantCultureIgnoreCase))
				{
					sceneEffect.Ambient = this.ParseMap(parser, scene);
					continue;
				}
				if (0 == string.Compare(attr, "*MAP_DIFFUSE", StringComparison.InvariantCultureIgnoreCase))
				{
					sceneEffect.Diffuse = this.ParseMap(parser, scene);
					continue;
				}
				if (0 == string.Compare(attr, "*NUMSUBMTLS", StringComparison.InvariantCultureIgnoreCase))
				{
					var numMaterials = parser.ConsumeInt();
					continue;
				}
				if (0 == string.Compare(attr, "*SUBMATERIAL", StringComparison.InvariantCultureIgnoreCase))
				{
					var index = parser.ConsumeInt();
					while (m.Submaterials.Count <= index) m.Submaterials.Add(null);
					var subm = ParseMaterial(parser, scene);
					m.Submaterials[index] = subm;
					continue;
				}
				

				parser.UnknownLexemError();
			}
			return m;
		}
Exemple #5
0
		private void BuildSubmeshes(int maxTextures, SeparateStreamsSubmesh[] submeshes, SeparateStreamsMesh streamMesh, BspMeshStreams meshStreams)
		{
			int[] textureToMaterial = new int[maxTextures];
			foreach (var quake3Face in this.faces)
			{
				++textureToMaterial[quake3Face.texinfo_id];
			}
			for (int i = 0; i < maxTextures; ++i)
			{
				if (textureToMaterial[i] > 0)
				{
					submeshes[i] = streamMesh.CreateSubmesh();
					int index = this.Scene.Materials.Count;
					var baseFileName = Path.Combine(this.GameRootPath, this.textures[i].name);
					var imagePath = baseFileName;
					if (!File.Exists(imagePath))
					{
						imagePath = baseFileName + ".jpg";
						if (!File.Exists(imagePath))
						{
							imagePath = baseFileName + ".png";
							if (!File.Exists(imagePath))
							{
								imagePath = baseFileName + ".tga";
								if (!File.Exists(imagePath))
								{
									imagePath = this.textures[i].name;
								}
							}
						}
					}
					var texture = new FileReferenceImage { Path = imagePath };
					this.Scene.Images.Add(texture);
					var effect = new SceneEffect { Diffuse = new ImageColorSource { Image = texture }, CullMode = CullMode.Front};
					this.Scene.Effects.Add(effect);
					var sceneMaterial = new SceneMaterial { Effect = effect };
					this.Scene.Materials.Add(sceneMaterial);
					submeshes[i].Material = sceneMaterial;
					textureToMaterial[i] = index;
				}
			}
		}