/// <summary>
        /// Called when deserializing
        /// </summary>
        /// <param name="info"></param>
        /// <param name="context"></param>
        protected TerrainShape(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
            _terrainConfig = (TerrainConfig)info.GetValue("_terrainConfig", typeof(TerrainConfig));
              _decorationModels = (ArrayList)info.GetValue("_decorationModels",typeof(ArrayList));
              _iDecorationID = info.GetInt32("_iDecorationID");
              if (SerializationHelper.HasElement(info, "_iVisibleBitmask"))
            _iVisibleBitmask = info.GetUInt32("_iVisibleBitmask");
              if (SerializationHelper.HasElement(info, "_bVisibleInsideVisZones"))
            _bVisibleInsideVisZones = info.GetBoolean("_bVisibleInsideVisZones");
              if (SerializationHelper.HasElement(info, "_fLODScaling"))
            _fLODScaling = info.GetSingle("_fLODScaling");
              if (SerializationHelper.HasElement(info, "_fMirrorLODBias"))
            _fMirrorLODBias = info.GetSingle("_fMirrorLODBias");
              if (SerializationHelper.HasElement(info, "_lodMetric"))
            _lodMetric = (TerrainLODMetric_e)info.GetValue("_lodMetric", typeof(TerrainLODMetric_e));

              if (SerializationHelper.HasElement(info,"_iDetailTextureID"))
            _iDetailTextureID = info.GetInt32("_iDetailTextureID");
              if (SerializationHelper.HasElement(info, "_detailTextures"))
            _detailTextures = (ArrayList)info.GetValue("_detailTextures", typeof(ArrayList));
              if (SerializationHelper.HasElement(info, "_eLightmapSize"))
            _eLightmapSize = (LightmapSize_e)info.GetValue("_eLightmapSize", typeof(LightmapSize_e));
              if (SerializationHelper.HasElement(info, "_bCastStaticShadows"))
            _bCastStaticShadows = info.GetBoolean("_bCastStaticShadows");
              if (SerializationHelper.HasElement(info, "_iLightInfluenceBitmask"))
            _iLightInfluenceBitmask = info.GetUInt16("_iLightInfluenceBitmask");
              if (SerializationHelper.HasElement(info, "_shaderFX"))
            _pendingConfig = (ShaderEffectConfig)info.GetValue("_shaderFX", typeof(ShaderEffectConfig));
              if (SerializationHelper.HasElement(info, "_minimapTexture"))
            _minimapTexture = info.GetString("_minimapTexture");
              if (SerializationHelper.HasElement(info, "_heightmapExport"))
            _heightmapExport = info.GetString("_heightmapExport");
              if (SerializationHelper.HasElement(info, "_bNormalizeHeightmapExport"))
            _bNormalizeHeightmapExport = info.GetBoolean("_bNormalizeHeightmapExport");
              if (SerializationHelper.HasElement(info, "_bExportAsEditable"))
            _bExportAsEditable = info.GetBoolean("_bExportAsEditable");
              if (SerializationHelper.HasElement(info, "_bFastUpdate"))
            _bFastUpdate = info.GetBoolean("_bFastUpdate");

              if (SerializationHelper.HasElement(info, "_cachedDectorIDs"))
            _cachedSectorIDs = (uint[])info.GetValue("_cachedDectorIDs", typeof(uint[]));
              else
            _cachedSectorIDs = null;
              if (SerializationHelper.HasElement(info, "_savedZoneBoxes"))
            _savedZoneBoxes = (BoundingBox[])info.GetValue("_savedZoneBoxes", typeof(BoundingBox[]));
              else
            _savedZoneBoxes = null;

              if (SerializationHelper.HasElement(info, "_bSortDetailTextures"))
            _bSortDetailTextures = info.GetBoolean("_bSortDetailTextures");

              if (SerializationHelper.HasElement(info, "_meshExportSettings"))
            _meshExportSettings = (TerrainMeshExport)info.GetValue("_meshExportSettings", typeof(TerrainMeshExport));

              _bBakeMode = TerrainEditor.TextureBakedView; // fall back to editor setting
              if (SerializationHelper.HasElement(info, "_bBakeMode"))
            _bBakeMode = info.GetBoolean("_bBakeMode");
              if (SerializationHelper.HasElement(info, "_bIsReference"))
            _bIsReference = info.GetBoolean("_bIsReference");
              if (SerializationHelper.HasElement(info, "_bSceneSpecificLightmaps"))
            _bSceneSpecificLightmaps = info.GetBoolean("_bSceneSpecificLightmaps");

              // Make sure detail texture resources contain valid sector index information
              // (just in case an older vForge version wrote out wrong values after the terrain was resized)
              this.ClampDetailTextureSectorsToValidRange();
        }
        public override void SetEngineInstanceBaseProperties()
        {
            if (!HasEngineInstance())
            return;

              EngineTerrain.SetReferenceStatus(_bIsReference);
              if (_bNeedsConfigSetup)
              {
            EngineTerrain.SetConfig(_terrainConfig, this.DetailTextures, this.DecorationModels);
            RecreateVisibilityZones();
            Position = _terrainConfig.TerrainPos; // get back position

            // add the first detail texture by default
            if (!string.IsNullOrEmpty(_terrainConfig.BaseTextureFile) && this.DetailTextures.Count == 0)
            {
              _terrainConfig._baseTexture.ID = GetNewDetailTextureID();
              this.AddDetailTexture(_terrainConfig._baseTexture);
            }
            if (IsReference)
            {
              _lodMetric = EngineTerrain.GetLODMetric();
            }
            _bNeedsConfigSetup = false;
              }

              base.SetEngineInstanceBaseProperties();
              EngineTerrain.SetVisibleBitmask(_iVisibleBitmask);
              EngineTerrain.SetVisibleInVisZones(_bVisibleInsideVisZones);
              UpdateLightmappingMode();
              EngineTerrain.SetLODScaling(_lodMetric, _fLODScaling, _fMirrorLODBias);
              EngineTerrain.SetCastStaticShadows(_bCastStaticShadows);
              EngineTerrain.SetLightInfluenceBitmask(_iLightInfluenceBitmask);
              EngineTerrain.SetShaderEffect(ShaderConfig);
              EngineTerrain.SetUseBakedTextures(TerrainEditor.TextureBakedView, ShaderConfig);
              EngineTerrain.SetPreviewDirectionalLight(TerrainEditor.DirectionalLighting);
              EngineTerrain.SelectTerrainBrush(TerrainEditor.CurrentBrush);
              EngineTerrain.SetExportAsEditable(_bExportAsEditable);
              EngineTerrain.SetFastUpdate(_bFastUpdate);
              EngineTerrain.SetMinimapTexture(MinimapTexture);
              EngineTerrain.SetSortDetailTextures(_bSortDetailTextures);
        }