diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs index 69fa5f6d6f..e21681ddd1 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs @@ -231,20 +231,27 @@ namespace OpenSim.Region.CoreModules.World.Terrain // Install terrain module in the simulator lock(m_scene) { + if(m_scene.Bakedmap != null) + { + m_baked = m_scene.Bakedmap; + } if (m_scene.Heightmap == null) { - m_channel = new TerrainChannel(m_InitialTerrain, (int)m_scene.RegionInfo.RegionSizeX, - (int)m_scene.RegionInfo.RegionSizeY, - (int)m_scene.RegionInfo.RegionSizeZ); + if(m_baked != null) + m_channel = m_baked.MakeCopy(); + else + m_channel = new TerrainChannel(m_InitialTerrain, + (int)m_scene.RegionInfo.RegionSizeX, + (int)m_scene.RegionInfo.RegionSizeY, + (int)m_scene.RegionInfo.RegionSizeZ); m_scene.Heightmap = m_channel; - - UpdateBakedMap(); } else { m_channel = m_scene.Heightmap; - UpdateBakedMap(); } + if(m_baked == null) + UpdateBakedMap(); m_scene.RegisterModuleInterface(this); m_scene.EventManager.OnNewClient += EventManager_OnNewClient; @@ -724,6 +731,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain m_baked = m_channel.MakeCopy(); m_painteffects[StandardTerrainEffects.Revert] = new RevertSphere(m_baked); m_floodeffects[StandardTerrainEffects.Revert] = new RevertArea(m_baked); + m_scene.Bakedmap = m_baked; + m_scene.SaveBakedTerrain(); } /// diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index f7bfc246c8..168080fa8e 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2175,6 +2175,15 @@ namespace OpenSim.Region.Framework.Scenes SimulationDataService.StoreTerrain(Heightmap.GetTerrainData(), RegionInfo.RegionID); } + /// + /// Store the terrain in the persistant data store + /// + public void SaveBakedTerrain() + { + if(Bakedmap != null) + SimulationDataService.StoreBakedTerrain(Bakedmap.GetTerrainData(), RegionInfo.RegionID); + } + public void StoreWindlightProfile(RegionLightShareData wl) { RegionInfo.WindlightSettings = wl; @@ -2193,22 +2202,46 @@ namespace OpenSim.Region.Framework.Scenes /// public override void LoadWorldMap() { + try + { + Bakedmap = null; + TerrainData map = SimulationDataService.LoadBakedTerrain(RegionInfo.RegionID, (int)RegionInfo.RegionSizeX, (int)RegionInfo.RegionSizeY, (int)RegionInfo.RegionSizeZ); + if (map != null) + { + Bakedmap = new TerrainChannel(map); + } + } + catch (Exception e) + { + m_log.WarnFormat( + "[TERRAIN]: Scene.cs: LoadWorldMap() baked terrain - Failed with exception {0}{1}", e.Message, e.StackTrace); + } + try { TerrainData map = SimulationDataService.LoadTerrain(RegionInfo.RegionID, (int)RegionInfo.RegionSizeX, (int)RegionInfo.RegionSizeY, (int)RegionInfo.RegionSizeZ); if (map == null) { - // This should be in the Terrain module, but it isn't because - // the heightmap is needed _way_ before the modules are initialized... - IConfig terrainConfig = m_config.Configs["Terrain"]; - String m_InitialTerrain = "pinhead-island"; - if (terrainConfig != null) - m_InitialTerrain = terrainConfig.GetString("InitialTerrain", m_InitialTerrain); + if(Bakedmap != null) + { + m_log.Warn("[TERRAIN]: terrain not found. Used stored baked terrain."); + Heightmap = Bakedmap.MakeCopy(); + SimulationDataService.StoreTerrain(Heightmap.GetTerrainData(), RegionInfo.RegionID); + } + else + { + // This should be in the Terrain module, but it isn't because + // the heightmap is needed _way_ before the modules are initialized... + IConfig terrainConfig = m_config.Configs["Terrain"]; + String m_InitialTerrain = "pinhead-island"; + if (terrainConfig != null) + m_InitialTerrain = terrainConfig.GetString("InitialTerrain", m_InitialTerrain); - m_log.InfoFormat("[TERRAIN]: No default terrain. Generating a new terrain {0}.", m_InitialTerrain); - Heightmap = new TerrainChannel(m_InitialTerrain, (int)RegionInfo.RegionSizeX, (int)RegionInfo.RegionSizeY, (int)RegionInfo.RegionSizeZ); + m_log.InfoFormat("[TERRAIN]: No default terrain. Generating a new terrain {0}.", m_InitialTerrain); + Heightmap = new TerrainChannel(m_InitialTerrain, (int)RegionInfo.RegionSizeX, (int)RegionInfo.RegionSizeY, (int)RegionInfo.RegionSizeZ); - SimulationDataService.StoreTerrain(Heightmap.GetTerrainData(), RegionInfo.RegionID); + SimulationDataService.StoreTerrain(Heightmap.GetTerrainData(), RegionInfo.RegionID); + } } else { @@ -2221,7 +2254,6 @@ namespace OpenSim.Region.Framework.Scenes "[TERRAIN]: Scene.cs: LoadWorldMap() - Regenerating as failed with exception {0}{1}", e.Message, e.StackTrace); - // Non standard region size. If there's an old terrain in the database, it might read past the buffer #pragma warning disable 0162 if ((int)Constants.RegionSize != 256) { @@ -2235,6 +2267,12 @@ namespace OpenSim.Region.Framework.Scenes m_log.WarnFormat( "[TERRAIN]: Scene.cs: LoadWorldMap() - Failed with exception {0}{1}", e.Message, e.StackTrace); } + + if(Bakedmap == null && Heightmap != null) + { + Bakedmap = Heightmap.MakeCopy(); + SimulationDataService.StoreBakedTerrain(Bakedmap.GetTerrainData(), RegionInfo.RegionID); + } } /// diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs index f420f69aa5..1de55ec9f6 100644 --- a/OpenSim/Region/Framework/Scenes/SceneBase.cs +++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs @@ -153,6 +153,7 @@ namespace OpenSim.Region.Framework.Scenes } public ITerrainChannel Heightmap; + public ITerrainChannel Bakedmap; /// /// Allows retrieval of land information for this scene.