Exemple #1
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);
            }
        }
        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());
        }
Exemple #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));
            }
        }
Exemple #5
0
 internal void CreateRoof(Mesh.Factory factory, BuildingPlan plan)
 {
     CreateRoofConvex(factory, plan);
 }