protected override void LoadContent()
        {
            device = graphics.GraphicsDevice;
            cCross = new CoordCross(device);

            Texture2D grassTexture = Content.Load <Texture2D>("grass");

            Texture2D heightMap = Content.Load <Texture2D>("heightmap");
            int       width     = heightMap.Width;
            int       height    = heightMap.Height;

            float[,] heightData = TerrainUtils.LoadHeightData(heightMap);
            VertexPositionNormalTexture[] vertices = TerrainUtils.CreateTerrainVertices(heightData);
            int[] indices = TerrainUtils.CreateTerrainIndices(width, height);
            vertices = TerrainUtils.GenerateNormalsForTriangleStrip(vertices, indices);
            VertexPositionNormalTexture[,] vertexArray = Reshape1Dto2D <VertexPositionNormalTexture>(vertices, width, height);

            rootNode = new QTNode(vertexArray, device, grassTexture, 64);
        }
        public QTNode(VertexPositionNormalTexture[,] vertexArray, GraphicsDevice device, Texture2D grassTexture, int maxSize)
        {
            this.device       = device;
            this.grassTexture = grassTexture;
            basicEffect       = new BasicEffect(device, null);

            width           = vertexArray.GetLength(0);
            height          = vertexArray.GetLength(1);
            nodeBoundingBox = CreateBoundingBox(vertexArray);

            isEndNode  = width <= maxSize;
            isEndNode &= height <= maxSize;
            if (isEndNode)
            {
                VertexPositionNormalTexture[] vertices = Reshape2Dto1D <VertexPositionNormalTexture>(vertexArray);
                int[] indices = TerrainUtils.CreateTerrainIndices(width, height);
                TerrainUtils.CreateBuffers(vertices, indices, out nodeVertexBuffer, out nodeIndexBuffer, device);
            }
            else
            {
                CreateChildNodes(vertexArray, maxSize);
            }
        }