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());
        }