private void UpdateHeights(BuildingPlan plan, HeightMap heightMap) { var levels = plan.Polygon.Corners.Select(v => heightMap.GetHeight(v)); plan.GroundLevel = levels.Max(); plan.LowGroundLevel = levels.Min(); }
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); } }
internal BuildingPlan Generate(Vector2 center, Vector2 size) { var floorPlan = new BuildingPlan(); var polygons = new List <Polygon2D>(); var prob = _rnd.NextDouble(); if (prob < 0.6) { floorPlan.Polygon = Rect(center, size); } else { floorPlan.Polygon = Poly(center, size, _rnd.Next(3, 6)); } return(floorPlan); }
// 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); }