/// <summary>
        /// Patches are defined in a local space. This determines the planet-space parameters of a patch
        /// </summary>
        private void SetPatchPlanetParameters( ITerrainPatch patch )
        {
            float radius = Planet.Model.Radius.ToRenderUnits;

            Point3 edge = patch.LocalOrigin + ( patch.LocalUAxis / 2 );
            Point3 centre = edge + ( patch.LocalVAxis / 2 );

            Point3 plEdge = ( edge.ToVector3( ).MakeNormal( ) * radius ).ToPoint3( );
            Point3 plCentre = ( centre.ToVector3( ).MakeNormal( ) * radius ).ToPoint3( );

            patch.SetPlanetParameters( plCentre, plCentre.DistanceTo( plEdge ) );
        }
 /// <summary>
 /// Generates vertices for a terrain patch
 /// </summary>
 /// <param name="patch">Terrain patch</param>
 /// <param name="res">Terrain patch resolution</param>
 /// <param name="firstVertex">Pointer to terrain vertices</param>
 /// <param name="error">Terrain patch error output here</param>
 public unsafe void GenerateTerrainPatchVertices( ITerrainPatch patch, int res, TerrainVertex* firstVertex, out float error )
 {
     m_Gen.GenerateVertices( patch.LocalOrigin, patch.LocalUStep, patch.LocalVStep, res, res, patch.Uv, patch.UvResolution, firstVertex, out error );
 }
 /// <summary>
 /// Generates vertices for a patch. Calculates maximum error between this patch and next higher detail patch
 /// </summary>
 /// <param name="patch">Patch</param>
 /// <param name="res">Patch resolution</param>
 /// <param name="firstVertex">Patch vertices</param>
 /// <param name="error">Maximum error value between this patch and higher level patch</param>
 public unsafe void GenerateTerrainPatchVertices( ITerrainPatch patch, int res, TerrainPatchVertex* firstVertex, out float error )
 {
     SetPatchPlanetParameters( patch );
     SafeTerrainGenerator.GenerateVertices( patch.LocalOrigin, patch.LocalUStep, patch.LocalVStep, res, res, patch.Uv, patch.UvResolution, firstVertex, out error );
 }