internal void CreateWalls(Mesh.Factory factory, BuildingPlan plan) { for (var i = 0; i < plan.Polygon.Corners.Length; i++) { var c0 = plan.Polygon.Corners[i]; var c1 = plan.Polygon.Corners[(i + 1) % plan.Polygon.Corners.Length]; var c0To1 = c1 - c0; var v0 = new Mesh.Vertex { Pos = new Vector3(c0.X, plan.LowGroundLevel, c0.Y), TexCoords = new Vector2() }; var v0To1 = new Mesh.Vertex { Pos = new Vector3(c0To1.X, 0, c0To1.Y), TexCoords = new Vector2(c0To1.Length, 0) }; var v0To2 = new Mesh.Vertex { Pos = new Vector3(0, plan.RoofLevel - plan.LowGroundLevel, 0), TexCoords = new Vector2(0, plan.RoofLevel - plan.LowGroundLevel) }; factory.AddSurface(v0, v0To1, v0To2); } }
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()); }
// Code works only for convex polygons for now. private void CreateRoofConvex(Mesh.Factory factory, BuildingPlan plan) { Debug.Assert(IsConvexPolygon(plan.Polygon)); var offset = factory.Vertices.Count; foreach (var c in plan.Polygon.Corners) { factory.Vertices.Add(new Mesh.Vertex { Pos = new Vector3(c.X, plan.RoofLevel, c.Y), TexCoords = c, // TODO Normal = Vector3.UnitY }); } for (var i = 0; i < plan.Polygon.Corners.Length - 2; i++) { factory.Faces.Add(new Mesh.Face(offset, offset + i + 1, offset + i + 2)); } }
internal void CreateRoof(Mesh.Factory factory, BuildingPlan plan) { CreateRoofConvex(factory, plan); }