public MapMesh(MapCompiled map) { texture = new Texture("Images/wall.png"); material = new ObjMaterial("Models/wall.mtl").Lookup("wall"); colorGroups = new List<WallColorGroup>(); var colorMap = new Dictionary<Color, MeshBuilder<VertexTNP3>>(); foreach (var wall in map.Walls) { MeshBuilder<VertexTNP3> builder; if (!colorMap.TryGetValue(wall.Color, out builder)) { builder = new MeshBuilder<VertexTNP3>(); colorMap.Add(wall.Color, builder); } for (int i = 0; i < wall.Verts1.Length-1; i++) makeQuads(wall, builder, i, i+1); if (wall.Shape == ShapeData.Closed) makeQuads(wall, builder, wall.Verts1.Length-1, 0); } foreach (var pair in colorMap) { WallColorGroup g; g.Color = pair.Key; g.Mesh = pair.Value.ToMesh().Compile(); colorGroups.Add(g); } }
public void Load(string path) { var reader = new StreamReader(path); var material = new Material(); string materialName = null; while (true) { var line = reader.ReadLine(); if (line == null) { break; } line = line.Trim(); var parts = line.Split(' '); switch (parts[0]) { case "newmtl": if (materialName != null) { defs.Add(materialName, material); } materialName = parts[1]; material = Material.Default(); break; case "Ka": material.Ambient.X = Parse.Float(parts[1]); material.Ambient.Y = Parse.Float(parts[2]); material.Ambient.Z = Parse.Float(parts[3]); material.Ambient.W = 1f; break; case "Kd": material.Diffuse.X = Parse.Float(parts[1]); material.Diffuse.Y = Parse.Float(parts[2]); material.Diffuse.Z = Parse.Float(parts[3]); material.Diffuse.W = 1f; break; case "Ks": material.Specular.X = Parse.Float(parts[1]); material.Specular.Y = Parse.Float(parts[2]); material.Specular.Z = Parse.Float(parts[3]); material.Specular.W = 1f; break; case "Ns": material.Shininess = Parse.Float(parts[1]) / 1000f * 128f; break; } } if (materialName != null) { defs.Add(materialName, material); } }