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();
        }
예제 #2
0
        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);
        }
예제 #4
0
        // 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));
            }
        }
예제 #5
0
 internal void CreateRoof(Mesh.Factory factory, BuildingPlan plan)
 {
     CreateRoofConvex(factory, plan);
 }