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()); }
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; }
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); }
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; }
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; } } }