/// <summary>
        /// Do the work of generating the city geom
        /// </summary>
        /// <param name="city"></param>
        public void Process(CityData city)
        {
            //Cleanup if someone is trying to reuse this object
            Dispose();
            var now = DateTime.Now.Ticks;

            Width  = city.Width;
            Height = city.Height;



            var vertexList = new List <TerrainVertex>();
            var indexList  = new List <int>();



            BorderWidth  = (CellWidth / 4) / 2;
            BorderHeight = (CellHeight / 4) / 2;

            var spanX = CellWidth + (BorderWidth * 2);
            var spanY = CellHeight + (BorderHeight * 2);



            var textureMap = new TextureMapper();

            textureMap.TerrainSheetSize = 5.0f;

            /** Build vertex & index structures **/
            for (int y = 0; y < Height; y++)
            {
                for (int x = 0; x < Width; x++)
                {
                    var offset = (y * city.Width) + x;

                    /** Settings **/
                    var elevation       = city.Elevation[offset];
                    var vertexColor     = city.VertexColor[offset];
                    var terrainType     = city.Terrain[offset];
                    var blendIndex      = city.BlendMap[offset];
                    var backTerrainType = city.BackTerrain[offset];

                    textureMap.TerrainType = terrainType;



                    //Main points
                    var mainElevation      = city.GetElevation(x, y, CellYScale);
                    var northElevation     = city.GetElevation(x, y, NeighbourDir.North, mainElevation, CellYScale);
                    var eastElevation      = city.GetElevation(x, y, NeighbourDir.East, mainElevation, CellYScale);
                    var southElevation     = city.GetElevation(x, y, NeighbourDir.South, mainElevation, CellYScale);
                    var westElevation      = city.GetElevation(x, y, NeighbourDir.West, mainElevation, CellYScale);
                    var northWestElevation = city.GetElevation(x, y, NeighbourDir.NorthWest, mainElevation, CellYScale);
                    var northEastElevation = city.GetElevation(x, y, NeighbourDir.NorthEast, mainElevation, CellYScale);
                    var southEastElevation = city.GetElevation(x, y, NeighbourDir.SouthEast, mainElevation, CellYScale);
                    var southWestElevation = city.GetElevation(x, y, NeighbourDir.SouthWest, mainElevation, CellYScale);



                    var startIndex = vertexList.Count;
                    var tex        = new Vector2(0.5f, 0.5f);

                    if (mainElevation == northElevation &&
                        mainElevation == eastElevation &&
                        mainElevation == southElevation &&
                        mainElevation == westElevation &&
                        mainElevation == northWestElevation &&
                        mainElevation == northEastElevation &&
                        mainElevation == southEastElevation &&
                        mainElevation == southWestElevation)
                    {
                        /** We can just use 1 quad for this tile **/
                        var fullTL = new Vector3((x * spanX) - BorderWidth, -(y * spanY) - BorderHeight, mainElevation);
                        var fullTR = new Vector3(fullTL.X + spanX, fullTL.Y, mainElevation);
                        var fullBL = new Vector3(fullTL.X, fullTL.Y - spanY, mainElevation);
                        var fullBR = new Vector3(fullTL.X + spanX, fullTL.Y - spanY, mainElevation);

                        textureMap.Position(x, y, fullTL, fullBR);

                        vertexList.Add(new TerrainVertex(fullTL, textureMap.MapTerrain(fullTL), vertexColor, tex, tex)); //0
                        vertexList.Add(new TerrainVertex(fullTR, textureMap.MapTerrain(fullTR), vertexColor, tex, tex)); //1
                        vertexList.Add(new TerrainVertex(fullBR, textureMap.MapTerrain(fullBR), vertexColor, tex, tex)); //2
                        vertexList.Add(new TerrainVertex(fullBL, textureMap.MapTerrain(fullBL), vertexColor, tex, tex)); //3

                        indexList.Add(startIndex);
                        indexList.Add(startIndex + 1);
                        indexList.Add(startIndex + 2);

                        indexList.Add(startIndex + 2);
                        indexList.Add(startIndex + 3);
                        indexList.Add(startIndex);

                        continue;
                    }



                    var mainTL = new Vector3(x * spanX, -(y * spanY), mainElevation);
                    var mainTR = new Vector3(mainTL.X + CellWidth, mainTL.Y, mainElevation);
                    var mainBL = new Vector3(mainTL.X, mainTL.Y - CellHeight, mainElevation);
                    var mainBR = new Vector3(mainTL.X + CellWidth, mainTL.Y - CellHeight, mainElevation);



                    /** West elevation **/
                    var westElevationMid = (westElevation + mainElevation) / 2;
                    var borderTL_BL      = new Vector3(mainTL.X - BorderWidth, mainTL.Y, westElevationMid);
                    var borderBL_TL      = new Vector3(mainTL.X - BorderWidth, mainBL.Y, westElevationMid);

                    /** East elevation **/
                    var eastElevationMid = (eastElevation + mainElevation) / 2;
                    var borderTR_BR      = new Vector3(mainTR.X + BorderWidth, mainTR.Y, eastElevationMid);
                    var borderBR_TR      = new Vector3(mainBR.X + BorderWidth, mainBR.Y, eastElevationMid);

                    /** North elevation **/
                    var northElevationMid = (northElevation + mainElevation) / 2;
                    var borderTL_TR       = new Vector3(mainTL.X, mainTL.Y + BorderHeight, northElevationMid);
                    var borderTR_TL       = new Vector3(mainTR.X, mainTR.Y + BorderHeight, northElevationMid);

                    /** South elevation **/
                    var southElevationMid = (southElevation + mainElevation) / 2;
                    var borderBL_BR       = new Vector3(mainBL.X, mainBL.Y - BorderHeight, southElevationMid);
                    var borderBR_BL       = new Vector3(mainBR.X, mainBR.Y - BorderHeight, southElevationMid);

                    var northWestElevationMid = (northWestElevation + northElevation + westElevation + mainElevation) / 4;
                    var borderTL_TL           = new Vector3(mainTL.X - BorderWidth, mainTL.Y + BorderHeight, northWestElevationMid);

                    var northEastElevationMid = (northEastElevation + northElevation + eastElevation + mainElevation) / 4;
                    var borderTR_TR           = new Vector3(mainTR.X + BorderWidth, mainTR.Y + BorderHeight, northEastElevationMid);

                    var southEastElevationMid = (southEastElevation + eastElevation + southElevation + mainElevation) / 4;
                    var borderBR_BR           = new Vector3(mainBR.X + BorderWidth, mainBR.Y - BorderHeight, southEastElevationMid);

                    var southWestElevationMid = (southWestElevation + southElevation + westElevation + mainElevation) / 4;
                    var borderBL_BL           = new Vector3(mainBL.X - BorderWidth, mainBL.Y - BorderHeight, southWestElevationMid);



                    textureMap.Position(x, y, borderTL_TL, borderBR_BR);


                    vertexList.Add(new TerrainVertex(mainTL, textureMap.MapTerrain(mainTL), vertexColor, tex, tex));           //0
                    vertexList.Add(new TerrainVertex(mainTR, textureMap.MapTerrain(mainTR), vertexColor, tex, tex));           //1
                    vertexList.Add(new TerrainVertex(mainBR, textureMap.MapTerrain(mainBR), vertexColor, tex, tex));           //2
                    vertexList.Add(new TerrainVertex(mainBL, textureMap.MapTerrain(mainBL), vertexColor, tex, tex));           //3
                    vertexList.Add(new TerrainVertex(borderTL_BL, textureMap.MapTerrain(borderTL_BL), vertexColor, tex, tex)); //4
                    vertexList.Add(new TerrainVertex(borderBL_TL, textureMap.MapTerrain(borderBL_TL), vertexColor, tex, tex)); //5
                    vertexList.Add(new TerrainVertex(borderTR_BR, textureMap.MapTerrain(borderTR_BR), vertexColor, tex, tex)); //6
                    vertexList.Add(new TerrainVertex(borderBR_TR, textureMap.MapTerrain(borderBR_TR), vertexColor, tex, tex)); //7
                    vertexList.Add(new TerrainVertex(borderTL_TR, textureMap.MapTerrain(borderTL_TR), vertexColor, tex, tex)); //8
                    vertexList.Add(new TerrainVertex(borderTR_TL, textureMap.MapTerrain(borderTR_TL), vertexColor, tex, tex)); //9
                    vertexList.Add(new TerrainVertex(borderBL_BR, textureMap.MapTerrain(borderBL_BR), vertexColor, tex, tex)); //10
                    vertexList.Add(new TerrainVertex(borderBR_BL, textureMap.MapTerrain(borderBR_BL), vertexColor, tex, tex)); //11
                    vertexList.Add(new TerrainVertex(borderTL_TL, textureMap.MapTerrain(borderTL_TL), vertexColor, tex, tex)); //12
                    vertexList.Add(new TerrainVertex(borderTR_TR, textureMap.MapTerrain(borderTR_TR), vertexColor, tex, tex)); //13
                    vertexList.Add(new TerrainVertex(borderBR_BR, textureMap.MapTerrain(borderBR_BR), vertexColor, tex, tex)); //14
                    vertexList.Add(new TerrainVertex(borderBL_BL, textureMap.MapTerrain(borderBL_BL), vertexColor, tex, tex)); //15


                    /** Main tile **/
                    indexList.Add(startIndex);
                    indexList.Add(startIndex + 1);
                    indexList.Add(startIndex + 2);
                    indexList.Add(startIndex + 2);
                    indexList.Add(startIndex + 3);
                    indexList.Add(startIndex);

                    if (y > 0)
                    {
                        /** Top flap **/
                        indexList.Add(startIndex + 8);
                        indexList.Add(startIndex + 9);
                        indexList.Add(startIndex + 1);

                        indexList.Add(startIndex + 1);
                        indexList.Add(startIndex + 0);
                        indexList.Add(startIndex + 8);
                    }

                    if (y < Height - 1)
                    {
                        /** Bottom flap **/
                        indexList.Add(startIndex + 3);
                        indexList.Add(startIndex + 2);
                        indexList.Add(startIndex + 11);

                        indexList.Add(startIndex + 11);
                        indexList.Add(startIndex + 10);
                        indexList.Add(startIndex + 3);

                        if (x > 0)
                        {
                            /** Bottom left corner **/
                            indexList.Add(startIndex + 5);
                            indexList.Add(startIndex + 3);
                            indexList.Add(startIndex + 10);

                            indexList.Add(startIndex + 10);
                            indexList.Add(startIndex + 15);
                            indexList.Add(startIndex + 5);
                        }
                        if (x < Width - 1)
                        {
                            /** Bottom right corner **/
                            indexList.Add(startIndex + 2);
                            indexList.Add(startIndex + 7);
                            indexList.Add(startIndex + 14);

                            indexList.Add(startIndex + 14);
                            indexList.Add(startIndex + 11);
                            indexList.Add(startIndex + 2);
                        }
                    }

                    if (x > 0)
                    {
                        /** Left flap **/
                        indexList.Add(startIndex + 4);
                        indexList.Add(startIndex);
                        indexList.Add(startIndex + 3);

                        indexList.Add(startIndex + 3);
                        indexList.Add(startIndex + 5);
                        indexList.Add(startIndex + 4);

                        if (y > 0)
                        {
                            /** Top left corner **/
                            indexList.Add(startIndex + 12);
                            indexList.Add(startIndex + 8); //tl_bl
                            indexList.Add(startIndex);     //tl_tr

                            indexList.Add(startIndex);
                            indexList.Add(startIndex + 4);
                            indexList.Add(startIndex + 12);
                        }
                    }
                    if (x < Width - 1)
                    {
                        /** Right flap **/
                        indexList.Add(startIndex + 1);
                        indexList.Add(startIndex + 6);
                        indexList.Add(startIndex + 7);

                        indexList.Add(startIndex + 7);
                        indexList.Add(startIndex + 2);
                        indexList.Add(startIndex + 1);

                        if (y > 0)
                        {
                            /** Top right corner **/
                            indexList.Add(startIndex + 9);
                            indexList.Add(startIndex + 13);
                            indexList.Add(startIndex + 6);

                            indexList.Add(startIndex + 6);
                            indexList.Add(startIndex + 1);
                            indexList.Add(startIndex + 9);
                        }
                    }
                }
            }


            Vertices       = vertexList.ToArray();
            Indexes        = indexList.ToArray();
            PrimitiveCount = Indexes.Length / 3;

            System.Diagnostics.Debug.WriteLine("Took : " + (DateTime.Now.Ticks - now) + " ticks");
        }
Beispiel #2
0
        /// <summary>
        /// Do the work of generating the city geom
        /// </summary>
        /// <param name="city"></param>
        public void Process(CityData city)
        {
            //Cleanup if someone is trying to reuse this object
            Dispose();
            var now = DateTime.Now.Ticks;

            Width  = city.Width;
            Height = city.Height;

            /**
             * The geometry we create is basically a quad per tile for the property
             * base plus 3 quads to join this quad to neighboring quads
             */
            var mesh         = new ThreeDMesh <TerrainVertex>();
            var moditifer    = 3.0f / 8.0f;
            var mainTileSpan = 3.0f / 8.0f; //The main tile is 6 8ths of the tile
            var edgeTileSpan = 4.0f / 8.0f;

            var textureMap = new TextureMapper();

            textureMap.TerrainSheetSize = 5.0f;

            for (var y = 0; y > -Height; y--)
            {
                for (var x = 0; x < Width; x++)
                {
                    var mapY = -y;

                    var offset = (mapY * city.Width) + x;
                    /** Settings **/
                    var elevation       = city.Elevation[offset];
                    var vertexColor     = city.VertexColor[offset];
                    var terrainType     = city.Terrain[offset];
                    var blendIndex      = city.BlendMap[offset];
                    var backTerrainType = city.BackTerrain[offset];
                    var z0 = elevation / 8.0f;

                    textureMap.TerrainType = terrainType;
                    textureMap.Position(x, mapY, new Vector2(x - edgeTileSpan, y + edgeTileSpan), new Vector2(x + edgeTileSpan, y - edgeTileSpan));

                    var tex            = new Vector2(0.5f, 0.5f);
                    var vertexTemplate = new TerrainVertex(new Vector3(0.0f, 0.0f, z0), Vector2.Zero, vertexColor, tex, tex);


                    var tl = vertexTemplate;
                    tl.Position.X        = x - mainTileSpan;
                    tl.Position.Y        = y + mainTileSpan;
                    tl.TextureCoordinate = textureMap.MapTerrain(ref tl.Position);

                    var tr = vertexTemplate;
                    tr.Position.X        = x + mainTileSpan;
                    tr.Position.Y        = y + mainTileSpan;
                    tr.TextureCoordinate = textureMap.MapTerrain(ref tr.Position);

                    var br = vertexTemplate;
                    br.Position.X        = x + mainTileSpan;
                    br.Position.Y        = y - mainTileSpan;
                    br.TextureCoordinate = textureMap.MapTerrain(ref br.Position);

                    var bl = vertexTemplate;
                    bl.Position.X        = x - mainTileSpan;
                    bl.Position.Y        = y - mainTileSpan;
                    bl.TextureCoordinate = textureMap.MapTerrain(ref bl.Position);

                    mesh.AddQuad(tl, tr, br, bl);

                    /**
                     * Joining pieces
                     */
                    if (x > 0)
                    {
                        var z1 = city.Elevation[offset - 1];

                        var tl2 = vertexTemplate;
                        tl2.Position.X        = x - 1 + mainTileSpan;
                        tl2.Position.Y        = y + mainTileSpan;
                        tl2.Position.Z        = z1;
                        tl2.TextureCoordinate = textureMap.MapTerrain(ref tl2.Position);

                        var tr2 = vertexTemplate;
                        tr2.Position.X        = x - 0 - mainTileSpan;
                        tr2.Position.Y        = y + mainTileSpan;
                        tr2.Position.Z        = z0;
                        tr2.TextureCoordinate = textureMap.MapTerrain(ref tr2.Position);

                        var br2 = vertexTemplate;
                        br2.Position.X        = x - 0 - mainTileSpan;
                        br2.Position.Y        = y - mainTileSpan;
                        br2.Position.Z        = z0;
                        br2.TextureCoordinate = textureMap.MapTerrain(ref br2.Position);

                        var bl2 = vertexTemplate;
                        bl2.Position.X        = x - 1 + mainTileSpan;
                        bl2.Position.Y        = y - mainTileSpan;
                        bl2.Position.Z        = z1;
                        bl2.TextureCoordinate = textureMap.MapTerrain(ref bl2.Position);

                        mesh.AddQuad(tl2, tr2, br2, bl2);
                    }
                }
            }


            Vertices       = mesh.GetVertexes();
            Indexes        = mesh.GetIndexes();
            PrimitiveCount = mesh.PrimitiveCount;



            //        for(var y=0; y>-512; y--){
            //    for(var x=0; x<512; x++){
            //        //We are scanning the bitmap from top to bottom, and plotting them bottom to top.
            //        //y will refer to the OpenGL coordinates, and -y will refer to the bitmap coordinates
            //        if(!validCoord(x,y)) continue;
            //        var z = city["elevation"].data[4*(512*-y + x)] / 8;
            //        meshes["city"].addQuad([
            //            x - 3/8, y - 3/8, z, //Bottom-left
            //            x + 3/8, y - 3/8, z, //Bottom-right
            //            x + 3/8, y + 3/8, z, //Top-right
            //            x - 3/8, y + 3/8, z  //Top-left
            //        ]);
            //    }
            //}


            //var vertexList = new List<TerrainVertex>();
            //var indexList = new List<int>();
            //BorderWidth = (CellWidth / 4) / 2;
            //BorderHeight = (CellHeight / 4) / 2;

            //var spanX = CellWidth + (BorderWidth * 2);
            //var spanY = CellHeight + (BorderHeight * 2);
            //var textureMap = new TextureMapper();
            //textureMap.TerrainSheetSize = 5.0f;
            ///** Build vertex & index structures **/
            //for (int y = 0; y < Height; y++)
            //{
            //    for (int x = 0; x < Width; x++)
            //    {
            //        var offset = (y * city.Width) + x;
            //        /** Settings **/
            //        var elevation = city.Elevation[offset];
            //        var vertexColor = city.VertexColor[offset];
            //        var terrainType = city.Terrain[offset];
            //        var blendIndex = city.BlendMap[offset];
            //        var backTerrainType = city.BackTerrain[offset];
            //        textureMap.TerrainType = terrainType;
            //        //Main points
            //        var mainElevation = city.GetElevation(x, y, CellYScale);
            //        var northElevation = city.GetElevation(x, y, NeighbourDir.North, mainElevation, CellYScale);
            //        var eastElevation = city.GetElevation(x, y, NeighbourDir.East, mainElevation, CellYScale);
            //        var southElevation = city.GetElevation(x, y, NeighbourDir.South, mainElevation, CellYScale);
            //        var westElevation = city.GetElevation(x, y, NeighbourDir.West, mainElevation, CellYScale);
            //        var northWestElevation = city.GetElevation(x, y, NeighbourDir.NorthWest, mainElevation, CellYScale);
            //        var northEastElevation = city.GetElevation(x, y, NeighbourDir.NorthEast, mainElevation, CellYScale);
            //        var southEastElevation = city.GetElevation(x, y, NeighbourDir.SouthEast, mainElevation, CellYScale);
            //        var southWestElevation = city.GetElevation(x, y, NeighbourDir.SouthWest, mainElevation, CellYScale);
            //        var startIndex = vertexList.Count;
            //        var tex = new Vector2(0.5f, 0.5f);
            //        if (mainElevation == northElevation &&
            //            mainElevation == eastElevation &&
            //            mainElevation == southElevation &&
            //            mainElevation == westElevation &&
            //            mainElevation == northWestElevation &&
            //            mainElevation == northEastElevation &&
            //            mainElevation == southEastElevation &&
            //            mainElevation == southWestElevation)
            //        {
            //            /** We can just use 1 quad for this tile **/
            //            var fullTL = new Vector3((x * spanX) - BorderWidth, -(y * spanY) - BorderHeight, mainElevation);
            //            var fullTR = new Vector3(fullTL.X + spanX, fullTL.Y, mainElevation);
            //            var fullBL = new Vector3(fullTL.X, fullTL.Y - spanY, mainElevation);
            //            var fullBR = new Vector3(fullTL.X + spanX, fullTL.Y - spanY, mainElevation);
            //            textureMap.Position(x, y, fullTL, fullBR);
            //            vertexList.Add(new TerrainVertex(fullTL, textureMap.MapTerrain(fullTL), vertexColor, tex, tex)); //0
            //            vertexList.Add(new TerrainVertex(fullTR, textureMap.MapTerrain(fullTR), vertexColor, tex, tex)); //1
            //            vertexList.Add(new TerrainVertex(fullBR, textureMap.MapTerrain(fullBR), vertexColor, tex, tex)); //2
            //            vertexList.Add(new TerrainVertex(fullBL, textureMap.MapTerrain(fullBL), vertexColor, tex, tex)); //3
            //            indexList.Add(startIndex);
            //            indexList.Add(startIndex + 1);
            //            indexList.Add(startIndex + 2);
            //            indexList.Add(startIndex + 2);
            //            indexList.Add(startIndex + 3);
            //            indexList.Add(startIndex);

            //            continue;
            //        }



            //        var mainTL = new Vector3(x * spanX, -(y * spanY), mainElevation);
            //        var mainTR = new Vector3(mainTL.X + CellWidth, mainTL.Y, mainElevation);
            //        var mainBL = new Vector3(mainTL.X, mainTL.Y - CellHeight, mainElevation);
            //        var mainBR = new Vector3(mainTL.X + CellWidth, mainTL.Y - CellHeight, mainElevation);



            //        /** West elevation **/
            //        var westElevationMid = (westElevation + mainElevation) / 2;
            //        var borderTL_BL = new Vector3(mainTL.X - BorderWidth, mainTL.Y, westElevationMid);
            //        var borderBL_TL = new Vector3(mainTL.X - BorderWidth, mainBL.Y, westElevationMid);

            //        /** East elevation **/
            //        var eastElevationMid = (eastElevation + mainElevation) / 2;
            //        var borderTR_BR = new Vector3(mainTR.X + BorderWidth, mainTR.Y, eastElevationMid);
            //        var borderBR_TR = new Vector3(mainBR.X + BorderWidth, mainBR.Y, eastElevationMid);

            //        /** North elevation **/
            //        var northElevationMid = (northElevation + mainElevation) / 2;
            //        var borderTL_TR = new Vector3(mainTL.X, mainTL.Y + BorderHeight, northElevationMid);
            //        var borderTR_TL = new Vector3(mainTR.X, mainTR.Y + BorderHeight, northElevationMid);

            //        /** South elevation **/
            //        var southElevationMid = (southElevation + mainElevation) / 2;
            //        var borderBL_BR = new Vector3(mainBL.X, mainBL.Y - BorderHeight, southElevationMid);
            //        var borderBR_BL = new Vector3(mainBR.X, mainBR.Y - BorderHeight, southElevationMid);

            //        var northWestElevationMid = (northWestElevation + northElevation + westElevation + mainElevation) / 4;
            //        var borderTL_TL = new Vector3(mainTL.X - BorderWidth, mainTL.Y + BorderHeight, northWestElevationMid);

            //        var northEastElevationMid = (northEastElevation + northElevation + eastElevation + mainElevation) / 4;
            //        var borderTR_TR = new Vector3(mainTR.X + BorderWidth, mainTR.Y + BorderHeight, northEastElevationMid);

            //        var southEastElevationMid = (southEastElevation + eastElevation + southElevation + mainElevation) / 4;
            //        var borderBR_BR = new Vector3(mainBR.X + BorderWidth, mainBR.Y - BorderHeight, southEastElevationMid);

            //        var southWestElevationMid = (southWestElevation + southElevation + westElevation + mainElevation) / 4;
            //        var borderBL_BL = new Vector3(mainBL.X - BorderWidth, mainBL.Y - BorderHeight, southWestElevationMid);



            //        textureMap.Position(x, y, borderTL_TL, borderBR_BR);


            //        vertexList.Add(new TerrainVertex(mainTL, textureMap.MapTerrain(mainTL), vertexColor, tex, tex)); //0
            //        vertexList.Add(new TerrainVertex(mainTR, textureMap.MapTerrain(mainTR), vertexColor, tex, tex)); //1
            //        vertexList.Add(new TerrainVertex(mainBR, textureMap.MapTerrain(mainBR), vertexColor, tex, tex)); //2
            //        vertexList.Add(new TerrainVertex(mainBL, textureMap.MapTerrain(mainBL), vertexColor, tex, tex)); //3
            //        vertexList.Add(new TerrainVertex(borderTL_BL, textureMap.MapTerrain(borderTL_BL), vertexColor, tex, tex)); //4
            //        vertexList.Add(new TerrainVertex(borderBL_TL, textureMap.MapTerrain(borderBL_TL), vertexColor, tex, tex)); //5
            //        vertexList.Add(new TerrainVertex(borderTR_BR, textureMap.MapTerrain(borderTR_BR), vertexColor, tex, tex)); //6
            //        vertexList.Add(new TerrainVertex(borderBR_TR, textureMap.MapTerrain(borderBR_TR), vertexColor, tex, tex)); //7
            //        vertexList.Add(new TerrainVertex(borderTL_TR, textureMap.MapTerrain(borderTL_TR), vertexColor, tex, tex)); //8
            //        vertexList.Add(new TerrainVertex(borderTR_TL, textureMap.MapTerrain(borderTR_TL), vertexColor, tex, tex)); //9
            //        vertexList.Add(new TerrainVertex(borderBL_BR, textureMap.MapTerrain(borderBL_BR), vertexColor, tex, tex)); //10
            //        vertexList.Add(new TerrainVertex(borderBR_BL, textureMap.MapTerrain(borderBR_BL), vertexColor, tex, tex)); //11
            //        vertexList.Add(new TerrainVertex(borderTL_TL, textureMap.MapTerrain(borderTL_TL), vertexColor, tex, tex)); //12
            //        vertexList.Add(new TerrainVertex(borderTR_TR, textureMap.MapTerrain(borderTR_TR), vertexColor, tex, tex)); //13
            //        vertexList.Add(new TerrainVertex(borderBR_BR, textureMap.MapTerrain(borderBR_BR), vertexColor, tex, tex)); //14
            //        vertexList.Add(new TerrainVertex(borderBL_BL, textureMap.MapTerrain(borderBL_BL), vertexColor, tex, tex)); //15


            //        /** Main tile **/
            //        indexList.Add(startIndex);
            //        indexList.Add(startIndex + 1);
            //        indexList.Add(startIndex + 2);
            //        indexList.Add(startIndex + 2);
            //        indexList.Add(startIndex + 3);
            //        indexList.Add(startIndex);

            //        if (y > 0)
            //        {
            //            /** Top flap **/
            //            indexList.Add(startIndex + 8);
            //            indexList.Add(startIndex + 9);
            //            indexList.Add(startIndex + 1);

            //            indexList.Add(startIndex + 1);
            //            indexList.Add(startIndex + 0);
            //            indexList.Add(startIndex + 8);
            //        }

            //        if (y < Height - 1)
            //        {
            //            /** Bottom flap **/
            //            indexList.Add(startIndex + 3);
            //            indexList.Add(startIndex + 2);
            //            indexList.Add(startIndex + 11);

            //            indexList.Add(startIndex + 11);
            //            indexList.Add(startIndex + 10);
            //            indexList.Add(startIndex + 3);

            //            if (x > 0)
            //            {
            //                /** Bottom left corner **/
            //                indexList.Add(startIndex + 5);
            //                indexList.Add(startIndex + 3);
            //                indexList.Add(startIndex + 10);

            //                indexList.Add(startIndex + 10);
            //                indexList.Add(startIndex + 15);
            //                indexList.Add(startIndex + 5);
            //            }
            //            if (x < Width - 1)
            //            {
            //                /** Bottom right corner **/
            //                indexList.Add(startIndex + 2);
            //                indexList.Add(startIndex + 7);
            //                indexList.Add(startIndex + 14);

            //                indexList.Add(startIndex + 14);
            //                indexList.Add(startIndex + 11);
            //                indexList.Add(startIndex + 2);
            //            }
            //        }

            //        if (x > 0)
            //        {
            //            /** Left flap **/
            //            indexList.Add(startIndex + 4);
            //            indexList.Add(startIndex);
            //            indexList.Add(startIndex + 3);

            //            indexList.Add(startIndex + 3);
            //            indexList.Add(startIndex + 5);
            //            indexList.Add(startIndex + 4);

            //            if (y > 0)
            //            {
            //                /** Top left corner **/
            //                indexList.Add(startIndex + 12);
            //                indexList.Add(startIndex + 8); //tl_bl
            //                indexList.Add(startIndex); //tl_tr

            //                indexList.Add(startIndex);
            //                indexList.Add(startIndex + 4);
            //                indexList.Add(startIndex + 12);
            //            }
            //        }
            //        if (x < Width - 1)
            //        {
            //            /** Right flap **/
            //            indexList.Add(startIndex + 1);
            //            indexList.Add(startIndex + 6);
            //            indexList.Add(startIndex + 7);

            //            indexList.Add(startIndex + 7);
            //            indexList.Add(startIndex + 2);
            //            indexList.Add(startIndex + 1);

            //            if (y > 0)
            //            {
            //                /** Top right corner **/
            //                indexList.Add(startIndex + 9);
            //                indexList.Add(startIndex + 13);
            //                indexList.Add(startIndex + 6);

            //                indexList.Add(startIndex + 6);
            //                indexList.Add(startIndex + 1);
            //                indexList.Add(startIndex + 9);
            //            }
            //        }

            //    }
            //}


            //Vertices = vertexList.ToArray();
            //Indexes = indexList.ToArray();
            //PrimitiveCount = Indexes.Length / 3;

            //System.Diagnostics.Debug.WriteLine("Took : " + (DateTime.Now.Ticks - now) + " ticks");
        }
Beispiel #3
0
        /// <summary>
        /// Do the work of generating the city geom
        /// </summary>
        /// <param name="city"></param>
        public void Process(CityData city)
        {
            //Cleanup if someone is trying to reuse this object
            Dispose();
            var now = DateTime.Now.Ticks;

            Width = city.Width;
            Height = city.Height;

            var vertexList = new List<TerrainVertex>();
            var indexList = new List<int>();

            BorderWidth = (CellWidth / 4) / 2;
            BorderHeight = (CellHeight / 4) / 2;

            var spanX = CellWidth + (BorderWidth * 2);
            var spanY = CellHeight + (BorderHeight * 2);

            var textureMap = new TextureMapper();
            textureMap.TerrainSheetSize = 5.0f;

            /** Build vertex & index structures **/
            for (int y = 0; y < Height; y++)
            {
                for (int x = 0; x < Width; x++)
                {
                    var offset = (y * city.Width) + x;

                    /** Settings **/
                    var elevation = city.Elevation[offset];
                    var vertexColor = city.VertexColor[offset];
                    var terrainType = city.Terrain[offset];
                    var blendIndex = city.BlendMap[offset];
                    var backTerrainType = city.BackTerrain[offset];

                    textureMap.TerrainType = terrainType;

                    //Main points
                    var mainElevation = city.GetElevation(x, y, CellYScale);
                    var northElevation = city.GetElevation(x, y, NeighbourDir.North, mainElevation, CellYScale);
                    var eastElevation = city.GetElevation(x, y, NeighbourDir.East, mainElevation, CellYScale);
                    var southElevation = city.GetElevation(x, y, NeighbourDir.South, mainElevation, CellYScale);
                    var westElevation = city.GetElevation(x, y, NeighbourDir.West, mainElevation, CellYScale);
                    var northWestElevation = city.GetElevation(x, y, NeighbourDir.NorthWest, mainElevation, CellYScale);
                    var northEastElevation = city.GetElevation(x, y, NeighbourDir.NorthEast, mainElevation, CellYScale);
                    var southEastElevation = city.GetElevation(x, y, NeighbourDir.SouthEast, mainElevation, CellYScale);
                    var southWestElevation = city.GetElevation(x, y, NeighbourDir.SouthWest, mainElevation, CellYScale);

                    var startIndex = vertexList.Count;
                    var tex = new Vector2(0.5f, 0.5f);

                    if (mainElevation == northElevation &&
                        mainElevation == eastElevation &&
                        mainElevation == southElevation &&
                        mainElevation == westElevation &&
                        mainElevation == northWestElevation &&
                        mainElevation == northEastElevation &&
                        mainElevation == southEastElevation &&
                        mainElevation == southWestElevation)
                    {
                        /** We can just use 1 quad for this tile **/
                        var fullTL = new Vector3((x * spanX) - BorderWidth, -(y * spanY) - BorderHeight, mainElevation);
                        var fullTR = new Vector3(fullTL.X + spanX, fullTL.Y, mainElevation);
                        var fullBL = new Vector3(fullTL.X, fullTL.Y - spanY, mainElevation);
                        var fullBR = new Vector3(fullTL.X + spanX, fullTL.Y - spanY, mainElevation);

                        textureMap.Position(x, y, fullTL, fullBR);

                        vertexList.Add(new TerrainVertex(fullTL, textureMap.MapTerrain(ref fullTL), vertexColor, tex, tex)); //0
                        vertexList.Add(new TerrainVertex(fullTR, textureMap.MapTerrain(ref fullTR), vertexColor, tex, tex)); //1
                        vertexList.Add(new TerrainVertex(fullBR, textureMap.MapTerrain(ref fullBR), vertexColor, tex, tex)); //2
                        vertexList.Add(new TerrainVertex(fullBL, textureMap.MapTerrain(ref fullBL), vertexColor, tex, tex)); //3

                        indexList.Add(startIndex);
                        indexList.Add(startIndex + 1);
                        indexList.Add(startIndex + 2);

                        indexList.Add(startIndex + 2);
                        indexList.Add(startIndex + 3);
                        indexList.Add(startIndex);

                        continue;
                    }

                    var mainTL = new Vector3(x * spanX, -(y * spanY), mainElevation);
                    var mainTR = new Vector3(mainTL.X + CellWidth, mainTL.Y, mainElevation);
                    var mainBL = new Vector3(mainTL.X, mainTL.Y - CellHeight, mainElevation);
                    var mainBR = new Vector3(mainTL.X + CellWidth, mainTL.Y - CellHeight, mainElevation);

                    /** West elevation **/
                    var westElevationMid = (westElevation + mainElevation) / 2;
                    var borderTL_BL = new Vector3(mainTL.X - BorderWidth, mainTL.Y, westElevationMid);
                    var borderBL_TL = new Vector3(mainTL.X - BorderWidth, mainBL.Y, westElevationMid);

                    /** East elevation **/
                    var eastElevationMid = (eastElevation + mainElevation) / 2;
                    var borderTR_BR = new Vector3(mainTR.X + BorderWidth, mainTR.Y, eastElevationMid);
                    var borderBR_TR = new Vector3(mainBR.X + BorderWidth, mainBR.Y, eastElevationMid);

                    /** North elevation **/
                    var northElevationMid = (northElevation + mainElevation) / 2;
                    var borderTL_TR = new Vector3(mainTL.X, mainTL.Y + BorderHeight, northElevationMid);
                    var borderTR_TL = new Vector3(mainTR.X, mainTR.Y + BorderHeight, northElevationMid);

                    /** South elevation **/
                    var southElevationMid = (southElevation + mainElevation) / 2;
                    var borderBL_BR = new Vector3(mainBL.X, mainBL.Y - BorderHeight, southElevationMid);
                    var borderBR_BL = new Vector3(mainBR.X, mainBR.Y - BorderHeight, southElevationMid);

                    var northWestElevationMid = (northWestElevation + northElevation + westElevation + mainElevation) / 4;
                    var borderTL_TL = new Vector3(mainTL.X - BorderWidth, mainTL.Y + BorderHeight, northWestElevationMid);

                    var northEastElevationMid = (northEastElevation + northElevation + eastElevation + mainElevation) / 4;
                    var borderTR_TR = new Vector3(mainTR.X + BorderWidth, mainTR.Y + BorderHeight, northEastElevationMid);

                    var southEastElevationMid = (southEastElevation + eastElevation + southElevation + mainElevation) / 4;
                    var borderBR_BR = new Vector3(mainBR.X + BorderWidth, mainBR.Y - BorderHeight, southEastElevationMid);

                    var southWestElevationMid = (southWestElevation + southElevation + westElevation + mainElevation) / 4;
                    var borderBL_BL = new Vector3(mainBL.X - BorderWidth, mainBL.Y - BorderHeight, southWestElevationMid);

                    textureMap.Position(x, y, borderTL_TL, borderBR_BR);

                    vertexList.Add(new TerrainVertex(mainTL, textureMap.MapTerrain(ref mainTL), vertexColor, tex, tex)); //0
                    vertexList.Add(new TerrainVertex(mainTR, textureMap.MapTerrain(ref mainTR), vertexColor, tex, tex)); //1
                    vertexList.Add(new TerrainVertex(mainBR, textureMap.MapTerrain(ref mainBR), vertexColor, tex, tex)); //2
                    vertexList.Add(new TerrainVertex(mainBL, textureMap.MapTerrain(ref mainBL), vertexColor, tex, tex)); //3
                    vertexList.Add(new TerrainVertex(borderTL_BL, textureMap.MapTerrain(ref borderTL_BL), vertexColor, tex, tex)); //4
                    vertexList.Add(new TerrainVertex(borderBL_TL, textureMap.MapTerrain(ref borderBL_TL), vertexColor, tex, tex)); //5
                    vertexList.Add(new TerrainVertex(borderTR_BR, textureMap.MapTerrain(ref borderTR_BR), vertexColor, tex, tex)); //6
                    vertexList.Add(new TerrainVertex(borderBR_TR, textureMap.MapTerrain(ref borderBR_TR), vertexColor, tex, tex)); //7
                    vertexList.Add(new TerrainVertex(borderTL_TR, textureMap.MapTerrain(ref borderTL_TR), vertexColor, tex, tex)); //8
                    vertexList.Add(new TerrainVertex(borderTR_TL, textureMap.MapTerrain(ref borderTR_TL), vertexColor, tex, tex)); //9
                    vertexList.Add(new TerrainVertex(borderBL_BR, textureMap.MapTerrain(ref borderBL_BR), vertexColor, tex, tex)); //10
                    vertexList.Add(new TerrainVertex(borderBR_BL, textureMap.MapTerrain(ref borderBR_BL), vertexColor, tex, tex)); //11
                    vertexList.Add(new TerrainVertex(borderTL_TL, textureMap.MapTerrain(ref borderTL_TL), vertexColor, tex, tex)); //12
                    vertexList.Add(new TerrainVertex(borderTR_TR, textureMap.MapTerrain(ref borderTR_TR), vertexColor, tex, tex)); //13
                    vertexList.Add(new TerrainVertex(borderBR_BR, textureMap.MapTerrain(ref borderBR_BR), vertexColor, tex, tex)); //14
                    vertexList.Add(new TerrainVertex(borderBL_BL, textureMap.MapTerrain(ref borderBL_BL), vertexColor, tex, tex)); //15

                    /** Main tile **/
                    indexList.Add(startIndex);
                    indexList.Add(startIndex + 1);
                    indexList.Add(startIndex + 2);
                    indexList.Add(startIndex + 2);
                    indexList.Add(startIndex + 3);
                    indexList.Add(startIndex);

                    if (y > 0)
                    {
                        /** Top flap **/
                        indexList.Add(startIndex + 8);
                        indexList.Add(startIndex + 9);
                        indexList.Add(startIndex + 1);

                        indexList.Add(startIndex + 1);
                        indexList.Add(startIndex + 0);
                        indexList.Add(startIndex + 8);
                    }

                    if (y < Height - 1)
                    {
                        /** Bottom flap **/
                        indexList.Add(startIndex + 3);
                        indexList.Add(startIndex + 2);
                        indexList.Add(startIndex + 11);

                        indexList.Add(startIndex + 11);
                        indexList.Add(startIndex + 10);
                        indexList.Add(startIndex + 3);

                        if (x > 0)
                        {
                            /** Bottom left corner **/
                            indexList.Add(startIndex + 5);
                            indexList.Add(startIndex + 3);
                            indexList.Add(startIndex + 10);

                            indexList.Add(startIndex + 10);
                            indexList.Add(startIndex + 15);
                            indexList.Add(startIndex + 5);
                        }
                        if (x < Width - 1)
                        {
                            /** Bottom right corner **/
                            indexList.Add(startIndex + 2);
                            indexList.Add(startIndex + 7);
                            indexList.Add(startIndex + 14);

                            indexList.Add(startIndex + 14);
                            indexList.Add(startIndex + 11);
                            indexList.Add(startIndex + 2);
                        }
                    }

                    if (x > 0)
                    {
                        /** Left flap **/
                        indexList.Add(startIndex + 4);
                        indexList.Add(startIndex);
                        indexList.Add(startIndex + 3);

                        indexList.Add(startIndex + 3);
                        indexList.Add(startIndex + 5);
                        indexList.Add(startIndex + 4);

                        if (y > 0)
                        {
                            /** Top left corner **/
                            indexList.Add(startIndex + 12);
                            indexList.Add(startIndex + 8); //tl_bl
                            indexList.Add(startIndex); //tl_tr

                            indexList.Add(startIndex);
                            indexList.Add(startIndex + 4);
                            indexList.Add(startIndex + 12);
                        }
                    }
                    if (x < Width - 1)
                    {
                        /** Right flap **/
                        indexList.Add(startIndex + 1);
                        indexList.Add(startIndex + 6);
                        indexList.Add(startIndex + 7);

                        indexList.Add(startIndex + 7);
                        indexList.Add(startIndex + 2);
                        indexList.Add(startIndex + 1);

                        if (y > 0)
                        {
                            /** Top right corner **/
                            indexList.Add(startIndex + 9);
                            indexList.Add(startIndex + 13);
                            indexList.Add(startIndex + 6);

                            indexList.Add(startIndex + 6);
                            indexList.Add(startIndex + 1);
                            indexList.Add(startIndex + 9);
                        }
                    }

                }
            }

            Vertices = vertexList.ToArray();
            Indexes = indexList.ToArray();
            PrimitiveCount = Indexes.Length / 3;

            System.Diagnostics.Debug.WriteLine("Took : " + (DateTime.Now.Ticks - now) + " ticks");
        }
Beispiel #4
0
        /// <summary>
        /// Do the work of generating the city geom
        /// </summary>
        /// <param name="city"></param>
        public void Process(CityData city)
        {
            //Cleanup if someone is trying to reuse this object
            Dispose();
            var now = DateTime.Now.Ticks;

            Width = city.Width;
            Height = city.Height;

            /**
             * The geometry we create is basically a quad per tile for the property
             * base plus 3 quads to join this quad to neighboring quads
             */
            var mesh = new ThreeDMesh<TerrainVertex>();
            var moditifer = 3.0f / 8.0f;
            var mainTileSpan = 3.0f / 8.0f; //The main tile is 6 8ths of the tile
            var edgeTileSpan = 4.0f / 8.0f;

            var textureMap = new TextureMapper();
            textureMap.TerrainSheetSize = 5.0f;

            for (var y = 0; y > -Height; y--)
            {
                for (var x = 0; x < Width; x++)
                {
                    var mapY = -y;

                    var offset = (mapY * city.Width) + x;
                    /** Settings **/
                    var elevation = city.Elevation[offset];
                    var vertexColor = city.VertexColor[offset];
                    var terrainType = city.Terrain[offset];
                    var blendIndex = city.BlendMap[offset];
                    var backTerrainType = city.BackTerrain[offset];
                    var z0 = elevation / 8.0f;

                    textureMap.TerrainType = terrainType;
                    textureMap.Position(x, mapY, new Vector2(x - edgeTileSpan, y + edgeTileSpan), new Vector2(x + edgeTileSpan, y - edgeTileSpan));

                    var tex = new Vector2(0.5f, 0.5f);
                    var vertexTemplate = new TerrainVertex(new Vector3(0.0f, 0.0f, z0), Vector2.Zero, vertexColor, tex, tex);

                    var tl = vertexTemplate;
                    tl.Position.X = x - mainTileSpan;
                    tl.Position.Y = y + mainTileSpan;
                    tl.TextureCoordinate = textureMap.MapTerrain(ref tl.Position);

                    var tr = vertexTemplate;
                    tr.Position.X = x + mainTileSpan;
                    tr.Position.Y = y + mainTileSpan;
                    tr.TextureCoordinate = textureMap.MapTerrain(ref tr.Position);

                    var br = vertexTemplate;
                    br.Position.X = x + mainTileSpan;
                    br.Position.Y = y - mainTileSpan;
                    br.TextureCoordinate = textureMap.MapTerrain(ref br.Position);

                    var bl = vertexTemplate;
                    bl.Position.X = x - mainTileSpan;
                    bl.Position.Y = y - mainTileSpan;
                    bl.TextureCoordinate = textureMap.MapTerrain(ref bl.Position);

                    mesh.AddQuad(tl, tr, br, bl);

                    /**
                     * Joining pieces
                     */
                    if (x > 0)
                    {
                        var z1 = city.Elevation[offset - 1];

                        var tl2 = vertexTemplate;
                        tl2.Position.X = x - 1 + mainTileSpan;
                        tl2.Position.Y = y + mainTileSpan;
                        tl2.Position.Z = z1;
                        tl2.TextureCoordinate = textureMap.MapTerrain(ref tl2.Position);

                        var tr2 = vertexTemplate;
                        tr2.Position.X = x - 0 - mainTileSpan;
                        tr2.Position.Y = y + mainTileSpan;
                        tr2.Position.Z = z0;
                        tr2.TextureCoordinate = textureMap.MapTerrain(ref tr2.Position);

                        var br2 = vertexTemplate;
                        br2.Position.X = x - 0 - mainTileSpan;
                        br2.Position.Y = y - mainTileSpan;
                        br2.Position.Z = z0;
                        br2.TextureCoordinate = textureMap.MapTerrain(ref br2.Position);

                        var bl2 = vertexTemplate;
                        bl2.Position.X = x - 1 + mainTileSpan;
                        bl2.Position.Y = y - mainTileSpan;
                        bl2.Position.Z = z1;
                        bl2.TextureCoordinate = textureMap.MapTerrain(ref bl2.Position);

                        mesh.AddQuad(tl2, tr2, br2, bl2);
                    }

                }
            }

            Vertices = mesh.GetVertexes();
            Indexes = mesh.GetIndexes();
            PrimitiveCount = mesh.PrimitiveCount;

            //        for(var y=0; y>-512; y--){
            //    for(var x=0; x<512; x++){
            //        //We are scanning the bitmap from top to bottom, and plotting them bottom to top.
            //        //y will refer to the OpenGL coordinates, and -y will refer to the bitmap coordinates
            //        if(!validCoord(x,y)) continue;
            //        var z = city["elevation"].data[4*(512*-y + x)] / 8;
            //        meshes["city"].addQuad([
            //            x - 3/8, y - 3/8, z, //Bottom-left
            //            x + 3/8, y - 3/8, z, //Bottom-right
            //            x + 3/8, y + 3/8, z, //Top-right
            //            x - 3/8, y + 3/8, z  //Top-left
            //        ]);
            //    }
            //}

            //var vertexList = new List<TerrainVertex>();
            //var indexList = new List<int>();
            //BorderWidth = (CellWidth / 4) / 2;
            //BorderHeight = (CellHeight / 4) / 2;

            //var spanX = CellWidth + (BorderWidth * 2);
            //var spanY = CellHeight + (BorderHeight * 2);
            //var textureMap = new TextureMapper();
            //textureMap.TerrainSheetSize = 5.0f;
            ///** Build vertex & index structures **/
            //for (int y = 0; y < Height; y++)
            //{
            //    for (int x = 0; x < Width; x++)
            //    {
            //        var offset = (y * city.Width) + x;
            //        /** Settings **/
            //        var elevation = city.Elevation[offset];
            //        var vertexColor = city.VertexColor[offset];
            //        var terrainType = city.Terrain[offset];
            //        var blendIndex = city.BlendMap[offset];
            //        var backTerrainType = city.BackTerrain[offset];
            //        textureMap.TerrainType = terrainType;
            //        //Main points
            //        var mainElevation = city.GetElevation(x, y, CellYScale);
            //        var northElevation = city.GetElevation(x, y, NeighbourDir.North, mainElevation, CellYScale);
            //        var eastElevation = city.GetElevation(x, y, NeighbourDir.East, mainElevation, CellYScale);
            //        var southElevation = city.GetElevation(x, y, NeighbourDir.South, mainElevation, CellYScale);
            //        var westElevation = city.GetElevation(x, y, NeighbourDir.West, mainElevation, CellYScale);
            //        var northWestElevation = city.GetElevation(x, y, NeighbourDir.NorthWest, mainElevation, CellYScale);
            //        var northEastElevation = city.GetElevation(x, y, NeighbourDir.NorthEast, mainElevation, CellYScale);
            //        var southEastElevation = city.GetElevation(x, y, NeighbourDir.SouthEast, mainElevation, CellYScale);
            //        var southWestElevation = city.GetElevation(x, y, NeighbourDir.SouthWest, mainElevation, CellYScale);
            //        var startIndex = vertexList.Count;
            //        var tex = new Vector2(0.5f, 0.5f);
            //        if (mainElevation == northElevation &&
            //            mainElevation == eastElevation &&
            //            mainElevation == southElevation &&
            //            mainElevation == westElevation &&
            //            mainElevation == northWestElevation &&
            //            mainElevation == northEastElevation &&
            //            mainElevation == southEastElevation &&
            //            mainElevation == southWestElevation)
            //        {
            //            /** We can just use 1 quad for this tile **/
            //            var fullTL = new Vector3((x * spanX) - BorderWidth, -(y * spanY) - BorderHeight, mainElevation);
            //            var fullTR = new Vector3(fullTL.X + spanX, fullTL.Y, mainElevation);
            //            var fullBL = new Vector3(fullTL.X, fullTL.Y - spanY, mainElevation);
            //            var fullBR = new Vector3(fullTL.X + spanX, fullTL.Y - spanY, mainElevation);
            //            textureMap.Position(x, y, fullTL, fullBR);
            //            vertexList.Add(new TerrainVertex(fullTL, textureMap.MapTerrain(fullTL), vertexColor, tex, tex)); //0
            //            vertexList.Add(new TerrainVertex(fullTR, textureMap.MapTerrain(fullTR), vertexColor, tex, tex)); //1
            //            vertexList.Add(new TerrainVertex(fullBR, textureMap.MapTerrain(fullBR), vertexColor, tex, tex)); //2
            //            vertexList.Add(new TerrainVertex(fullBL, textureMap.MapTerrain(fullBL), vertexColor, tex, tex)); //3
            //            indexList.Add(startIndex);
            //            indexList.Add(startIndex + 1);
            //            indexList.Add(startIndex + 2);
            //            indexList.Add(startIndex + 2);
            //            indexList.Add(startIndex + 3);
            //            indexList.Add(startIndex);

            //            continue;
            //        }

            //        var mainTL = new Vector3(x * spanX, -(y * spanY), mainElevation);
            //        var mainTR = new Vector3(mainTL.X + CellWidth, mainTL.Y, mainElevation);
            //        var mainBL = new Vector3(mainTL.X, mainTL.Y - CellHeight, mainElevation);
            //        var mainBR = new Vector3(mainTL.X + CellWidth, mainTL.Y - CellHeight, mainElevation);

            //        /** West elevation **/
            //        var westElevationMid = (westElevation + mainElevation) / 2;
            //        var borderTL_BL = new Vector3(mainTL.X - BorderWidth, mainTL.Y, westElevationMid);
            //        var borderBL_TL = new Vector3(mainTL.X - BorderWidth, mainBL.Y, westElevationMid);

            //        /** East elevation **/
            //        var eastElevationMid = (eastElevation + mainElevation) / 2;
            //        var borderTR_BR = new Vector3(mainTR.X + BorderWidth, mainTR.Y, eastElevationMid);
            //        var borderBR_TR = new Vector3(mainBR.X + BorderWidth, mainBR.Y, eastElevationMid);

            //        /** North elevation **/
            //        var northElevationMid = (northElevation + mainElevation) / 2;
            //        var borderTL_TR = new Vector3(mainTL.X, mainTL.Y + BorderHeight, northElevationMid);
            //        var borderTR_TL = new Vector3(mainTR.X, mainTR.Y + BorderHeight, northElevationMid);

            //        /** South elevation **/
            //        var southElevationMid = (southElevation + mainElevation) / 2;
            //        var borderBL_BR = new Vector3(mainBL.X, mainBL.Y - BorderHeight, southElevationMid);
            //        var borderBR_BL = new Vector3(mainBR.X, mainBR.Y - BorderHeight, southElevationMid);

            //        var northWestElevationMid = (northWestElevation + northElevation + westElevation + mainElevation) / 4;
            //        var borderTL_TL = new Vector3(mainTL.X - BorderWidth, mainTL.Y + BorderHeight, northWestElevationMid);

            //        var northEastElevationMid = (northEastElevation + northElevation + eastElevation + mainElevation) / 4;
            //        var borderTR_TR = new Vector3(mainTR.X + BorderWidth, mainTR.Y + BorderHeight, northEastElevationMid);

            //        var southEastElevationMid = (southEastElevation + eastElevation + southElevation + mainElevation) / 4;
            //        var borderBR_BR = new Vector3(mainBR.X + BorderWidth, mainBR.Y - BorderHeight, southEastElevationMid);

            //        var southWestElevationMid = (southWestElevation + southElevation + westElevation + mainElevation) / 4;
            //        var borderBL_BL = new Vector3(mainBL.X - BorderWidth, mainBL.Y - BorderHeight, southWestElevationMid);

            //        textureMap.Position(x, y, borderTL_TL, borderBR_BR);

            //        vertexList.Add(new TerrainVertex(mainTL, textureMap.MapTerrain(mainTL), vertexColor, tex, tex)); //0
            //        vertexList.Add(new TerrainVertex(mainTR, textureMap.MapTerrain(mainTR), vertexColor, tex, tex)); //1
            //        vertexList.Add(new TerrainVertex(mainBR, textureMap.MapTerrain(mainBR), vertexColor, tex, tex)); //2
            //        vertexList.Add(new TerrainVertex(mainBL, textureMap.MapTerrain(mainBL), vertexColor, tex, tex)); //3
            //        vertexList.Add(new TerrainVertex(borderTL_BL, textureMap.MapTerrain(borderTL_BL), vertexColor, tex, tex)); //4
            //        vertexList.Add(new TerrainVertex(borderBL_TL, textureMap.MapTerrain(borderBL_TL), vertexColor, tex, tex)); //5
            //        vertexList.Add(new TerrainVertex(borderTR_BR, textureMap.MapTerrain(borderTR_BR), vertexColor, tex, tex)); //6
            //        vertexList.Add(new TerrainVertex(borderBR_TR, textureMap.MapTerrain(borderBR_TR), vertexColor, tex, tex)); //7
            //        vertexList.Add(new TerrainVertex(borderTL_TR, textureMap.MapTerrain(borderTL_TR), vertexColor, tex, tex)); //8
            //        vertexList.Add(new TerrainVertex(borderTR_TL, textureMap.MapTerrain(borderTR_TL), vertexColor, tex, tex)); //9
            //        vertexList.Add(new TerrainVertex(borderBL_BR, textureMap.MapTerrain(borderBL_BR), vertexColor, tex, tex)); //10
            //        vertexList.Add(new TerrainVertex(borderBR_BL, textureMap.MapTerrain(borderBR_BL), vertexColor, tex, tex)); //11
            //        vertexList.Add(new TerrainVertex(borderTL_TL, textureMap.MapTerrain(borderTL_TL), vertexColor, tex, tex)); //12
            //        vertexList.Add(new TerrainVertex(borderTR_TR, textureMap.MapTerrain(borderTR_TR), vertexColor, tex, tex)); //13
            //        vertexList.Add(new TerrainVertex(borderBR_BR, textureMap.MapTerrain(borderBR_BR), vertexColor, tex, tex)); //14
            //        vertexList.Add(new TerrainVertex(borderBL_BL, textureMap.MapTerrain(borderBL_BL), vertexColor, tex, tex)); //15

            //        /** Main tile **/
            //        indexList.Add(startIndex);
            //        indexList.Add(startIndex + 1);
            //        indexList.Add(startIndex + 2);
            //        indexList.Add(startIndex + 2);
            //        indexList.Add(startIndex + 3);
            //        indexList.Add(startIndex);

            //        if (y > 0)
            //        {
            //            /** Top flap **/
            //            indexList.Add(startIndex + 8);
            //            indexList.Add(startIndex + 9);
            //            indexList.Add(startIndex + 1);

            //            indexList.Add(startIndex + 1);
            //            indexList.Add(startIndex + 0);
            //            indexList.Add(startIndex + 8);
            //        }

            //        if (y < Height - 1)
            //        {
            //            /** Bottom flap **/
            //            indexList.Add(startIndex + 3);
            //            indexList.Add(startIndex + 2);
            //            indexList.Add(startIndex + 11);

            //            indexList.Add(startIndex + 11);
            //            indexList.Add(startIndex + 10);
            //            indexList.Add(startIndex + 3);

            //            if (x > 0)
            //            {
            //                /** Bottom left corner **/
            //                indexList.Add(startIndex + 5);
            //                indexList.Add(startIndex + 3);
            //                indexList.Add(startIndex + 10);

            //                indexList.Add(startIndex + 10);
            //                indexList.Add(startIndex + 15);
            //                indexList.Add(startIndex + 5);
            //            }
            //            if (x < Width - 1)
            //            {
            //                /** Bottom right corner **/
            //                indexList.Add(startIndex + 2);
            //                indexList.Add(startIndex + 7);
            //                indexList.Add(startIndex + 14);

            //                indexList.Add(startIndex + 14);
            //                indexList.Add(startIndex + 11);
            //                indexList.Add(startIndex + 2);
            //            }
            //        }

            //        if (x > 0)
            //        {
            //            /** Left flap **/
            //            indexList.Add(startIndex + 4);
            //            indexList.Add(startIndex);
            //            indexList.Add(startIndex + 3);

            //            indexList.Add(startIndex + 3);
            //            indexList.Add(startIndex + 5);
            //            indexList.Add(startIndex + 4);

            //            if (y > 0)
            //            {
            //                /** Top left corner **/
            //                indexList.Add(startIndex + 12);
            //                indexList.Add(startIndex + 8); //tl_bl
            //                indexList.Add(startIndex); //tl_tr

            //                indexList.Add(startIndex);
            //                indexList.Add(startIndex + 4);
            //                indexList.Add(startIndex + 12);
            //            }
            //        }
            //        if (x < Width - 1)
            //        {
            //            /** Right flap **/
            //            indexList.Add(startIndex + 1);
            //            indexList.Add(startIndex + 6);
            //            indexList.Add(startIndex + 7);

            //            indexList.Add(startIndex + 7);
            //            indexList.Add(startIndex + 2);
            //            indexList.Add(startIndex + 1);

            //            if (y > 0)
            //            {
            //                /** Top right corner **/
            //                indexList.Add(startIndex + 9);
            //                indexList.Add(startIndex + 13);
            //                indexList.Add(startIndex + 6);

            //                indexList.Add(startIndex + 6);
            //                indexList.Add(startIndex + 1);
            //                indexList.Add(startIndex + 9);
            //            }
            //        }

            //    }
            //}

            //Vertices = vertexList.ToArray();
            //Indexes = indexList.ToArray();
            //PrimitiveCount = Indexes.Length / 3;

            //System.Diagnostics.Debug.WriteLine("Took : " + (DateTime.Now.Ticks - now) + " ticks");
        }