public Mesh GenerateMesh(Building building, CityMap map) { var factory = new Mesh.Factory(); var plan = _planGenerator.Generate(building.Pos + new Vector2(0.5f, 0.5f), building.Type.Size); plan.NumFloors = _rnd.Next(1, 3); UpdateHeights(plan, map.HeightMap); _wallGenerator.CreateWalls(factory, plan); _roofGenerator.CreateRoof(factory, plan); return(factory.ToMesh()); }
internal Mesh ToMesh() { var factory = new Mesh.Factory(); for (var x = 0; x <= _sizeX; x++) { for (var y = 0; y <= _sizeY; y++) { factory.Vertices.Add(new Mesh.Vertex { Pos = new Vector3(x, Height[x, y], y), TexCoords = new Vector2(x * TexScale, y * TexScale), Normal = GetNormal(x, y) }); } } for (var x = 0; x < _sizeX; x++) { for (var y = 0; y < _sizeY; y++) { var v00 = x * Height.GetLength(1) + y; var v01 = v00 + 1; var v10 = v00 + Height.GetLength(1); var v11 = v10 + 1; var lenV00ToV11Sq = (factory.Vertices[v00].Pos - factory.Vertices[v11].Pos).LengthSquared; var lenV01ToV10Sq = (factory.Vertices[v01].Pos - factory.Vertices[v10].Pos).LengthSquared; if (lenV00ToV11Sq < lenV01ToV10Sq) { factory.Faces.Add(new Mesh.Face(v00, v01, v11)); factory.Faces.Add(new Mesh.Face(v00, v11, v10)); } else { factory.Faces.Add(new Mesh.Face(v00, v01, v10)); factory.Faces.Add(new Mesh.Face(v01, v11, v10)); } } } return(factory.ToMesh()); }