diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index fba0c3b00b..44f4113f2d 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs @@ -164,7 +164,7 @@ namespace OpenSim.ApplicationPlugins.LoadRegions if (m_app.SceneManager.TryGetScene(regionID, out region)) { - region.LoadWorldMap(file); + //region.LoadWorldMap(file); responseData["success"] = "true"; } else diff --git a/OpenSim/Framework/Constants.cs b/OpenSim/Framework/Constants.cs index 9eca152e3d..1a4e08bb24 100644 --- a/OpenSim/Framework/Constants.cs +++ b/OpenSim/Framework/Constants.cs @@ -35,5 +35,6 @@ namespace OpenSim.Framework public class Constants { public const uint RegionSize = 256; + public const byte TerrainPatchSize = 16; } } diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs index 660c3b302d..43f630db20 100644 --- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs +++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs @@ -126,7 +126,7 @@ namespace OpenSim.Region.ClientStack scene.RegisterRegionWithGrid(); scene.PhysicsScene = GetPhysicsScene(); - scene.PhysicsScene.SetTerrain(scene.Terrain.GetHeights1D()); + scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); //Master Avatar Setup UserProfileData masterAvatar; diff --git a/OpenSim/Region/Environment/EstateManager.cs b/OpenSim/Region/Environment/EstateManager.cs index 96baf21bd6..bfa6d59f9a 100644 --- a/OpenSim/Region/Environment/EstateManager.cs +++ b/OpenSim/Region/Environment/EstateManager.cs @@ -137,13 +137,10 @@ namespace OpenSim.Region.Environment { // Water Height m_regInfo.EstateSettings.waterHeight = WaterHeight; - m_scene.Terrain.watermap.Fill(WaterHeight); // Terraforming limits m_regInfo.EstateSettings.terrainRaiseLimit = TerrainRaiseLimit; m_regInfo.EstateSettings.terrainLowerLimit = TerrainLowerLimit; - m_scene.Terrain.maxRaise = TerrainRaiseLimit; - m_scene.Terrain.minLower = TerrainLowerLimit; // Time of day / fixed sun m_regInfo.EstateSettings.useFixedSun = UseFixedSun; diff --git a/OpenSim/Region/Environment/Interfaces/ITerrainChannel.cs b/OpenSim/Region/Environment/Interfaces/ITerrainChannel.cs index 62074cbc0d..fb83e6379b 100644 --- a/OpenSim/Region/Environment/Interfaces/ITerrainChannel.cs +++ b/OpenSim/Region/Environment/Interfaces/ITerrainChannel.cs @@ -34,6 +34,7 @@ namespace OpenSim.Region.Environment.Interfaces double this[int x, int y] { get; set; } int Width { get; } float[] GetFloatsSerialised(); + double[,] GetDoubles(); bool Tainted(int x, int y); } } diff --git a/OpenSim/Region/Environment/LandManagement/Land.cs b/OpenSim/Region/Environment/LandManagement/Land.cs index 1c4697c7c8..4c6168d157 100644 --- a/OpenSim/Region/Environment/LandManagement/Land.cs +++ b/OpenSim/Region/Environment/LandManagement/Land.cs @@ -440,11 +440,11 @@ namespace OpenSim.Region.Environment.LandManagement } } landData.AABBMin = - new LLVector3((float) (min_x*4), (float) (min_y*4), - (float) m_scene.Terrain.GetHeight((min_x*4), (min_y*4))); + new LLVector3((float)(min_x * 4), (float)(min_y * 4), + (float)m_scene.Heightmap[(min_x * 4), (min_y * 4)]); landData.AABBMax = - new LLVector3((float) (max_x*4), (float) (max_y*4), - (float) m_scene.Terrain.GetHeight((max_x*4), (max_y*4))); + new LLVector3((float)(max_x * 4), (float)(max_y * 4), + (float)m_scene.Heightmap[(max_x * 4), (max_y * 4)]); landData.area = tempArea; } diff --git a/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs b/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs index 2cf77ff23f..7ab1e2bb45 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs @@ -96,6 +96,11 @@ namespace OpenSim.Region.Environment.Modules.Terrain return heights; } + public double[,] GetDoubles() + { + return map; + } + public double this[int x, int y] { get @@ -104,14 +109,25 @@ namespace OpenSim.Region.Environment.Modules.Terrain } set { - taint[x / 16, y / 16] = true; - map[x, y] = value; + if (map[x, y] != value) + { + taint[x / 16, y / 16] = true; + map[x, y] = value; + } } } public bool Tainted(int x, int y) { - return taint[x / 16, y / 16]; + if (taint[x / 16, y / 16] != false) + { + taint[x / 16, y / 16] = false; + return true; + } + else + { + return false; + } } public TerrainChannel() @@ -163,6 +179,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain private Dictionary m_loaders = new Dictionary(); Scene m_scene; ITerrainChannel m_channel; + bool m_tainted = false; private IConfigSource m_gConfig; private void InstallDefaultEffects() @@ -241,6 +258,44 @@ namespace OpenSim.Region.Environment.Modules.Terrain } m_scene.EventManager.OnNewClient += EventManager_OnNewClient; + m_scene.EventManager.OnPluginConsole += EventManager_OnPluginConsole; + m_scene.EventManager.OnTerrainTick += EventManager_OnTerrainTick; + } + + void EventManager_OnTerrainTick() + { + if (m_tainted) + { + m_tainted = false; + m_scene.PhysicsScene.SetTerrain(m_channel.GetFloatsSerialised()); + m_scene.SaveTerrain(); + + //m_scene.CreateTerrainTexture(true); + } + } + + void EventManager_OnPluginConsole(string[] args) + { + if (args[0] == "terrain") + { + string command = args[1]; + string param = args[2]; + + + switch (command) + { + case "load": + LoadFromFile(param); + SendUpdatedLayerData(); + break; + case "save": + SaveToFile(param); + break; + default: + m_log.Warn("Unknown terrain command."); + break; + } + } } void EventManager_OnNewClient(IClientAPI client) @@ -248,6 +303,31 @@ namespace OpenSim.Region.Environment.Modules.Terrain client.OnModifyTerrain += client_OnModifyTerrain; } + void SendUpdatedLayerData() + { + bool shouldTaint = false; + float[] serialised = m_channel.GetFloatsSerialised(); + int x, y; + for (x = 0; x < m_channel.Width; x += Constants.TerrainPatchSize) + { + for (y = 0; y < m_channel.Height; y += Constants.TerrainPatchSize) + { + if (m_channel.Tainted(x, y)) + { + m_scene.ForEachClient(delegate(IClientAPI controller) + { + controller.SendLayerData(x / Constants.TerrainPatchSize, y / Constants.TerrainPatchSize, serialised); + }); + shouldTaint = true; + } + } + } + if (shouldTaint) + { + m_tainted = true; + } + } + void client_OnModifyTerrain(float height, float seconds, byte size, byte action, float north, float west, float south, float east, IClientAPI remoteClient) { // Not a good permissions check, if in area mode, need to check the entire area. @@ -261,11 +341,11 @@ namespace OpenSim.Region.Environment.Modules.Terrain m_painteffects[(StandardTerrainEffects)action].PaintEffect( m_channel, west, south, Math.Pow(size, 2.0), seconds); - bool usingTerrainModule = false; + bool usingTerrainModule = true; if (usingTerrainModule) { - remoteClient.SendLayerData(m_channel.GetFloatsSerialised()); + SendUpdatedLayerData(); } } else @@ -298,11 +378,11 @@ namespace OpenSim.Region.Environment.Modules.Terrain m_floodeffects[(StandardTerrainEffects)action].FloodEffect( m_channel, fillArea, Math.Pow(size, 2.0)); - bool usingTerrainModule = false; + bool usingTerrainModule = true; if (usingTerrainModule) { - remoteClient.SendLayerData(m_channel.GetFloatsSerialised()); + SendUpdatedLayerData(); } } else diff --git a/OpenSim/Region/Environment/Modules/TreePopulatorModule.cs b/OpenSim/Region/Environment/Modules/TreePopulatorModule.cs index edd4286091..8aa2223cb0 100644 --- a/OpenSim/Region/Environment/Modules/TreePopulatorModule.cs +++ b/OpenSim/Region/Environment/Modules/TreePopulatorModule.cs @@ -205,7 +205,7 @@ namespace OpenSim.Region.Environment.Modules private void CreateTree(LLVector3 position) { - position.Z = (float)m_scene.Terrain.heightmap.Get((int)position.X, (int)position.Y); + position.Z = (float)m_scene.Heightmap[(int)position.X, (int)position.Y]; SceneObjectGroup tree = m_scene.AddTree(new LLVector3(0.1f, 0.1f, 0.1f), diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs index 20154ea3df..b269e75674 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs @@ -36,29 +36,6 @@ namespace OpenSim.Region.Environment.Scenes { public partial class Scene { - /// - /// Modifies terrain using the specified information - /// - /// The height at which the user started modifying the terrain - /// The number of seconds the modify button was pressed - /// The size of the brush used - /// The action to be performed - /// Distance from the north border where the cursor is located - /// Distance from the west border where the cursor is located - public void ModifyTerrain(float height, float seconds, byte brushsize, byte action, float north, float west, - float south, float east, - IClientAPI remoteUser) - { - // Do a permissions check before allowing terraforming. - // random users are now no longer allowed to terraform - // if permissions are enabled. - if (!PermissionsMngr.CanTerraform(remoteUser.AgentId, new LLVector3(north, west, 0))) - return; - - //if it wasn't for the permission checking we could have the terrain module directly subscribe to the OnModifyTerrain event - Terrain.ModifyTerrain(height, seconds, brushsize, action, north, west, south, east, remoteUser); - } - /// /// /// diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 29f1af40c6..ec1563a450 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -283,9 +283,6 @@ namespace OpenSim.Region.Environment.Scenes //m_sceneObjects = new Dictionary(); m_restorePresences = new Dictionary(); - m_log.Info("[SCENE]: Creating LandMap"); - Terrain = new TerrainEngine((int)RegionInfo.RegionLocX, (int)RegionInfo.RegionLocY); - m_httpListener = httpServer; m_dumpAssetsToFile = dumpAssetsToFile; @@ -843,43 +840,7 @@ namespace OpenSim.Region.Environment.Scenes private void UpdateTerrain() { - if (Terrain.IsTainted() && !Terrain.IsUserStillEditing()) - { - CreateTerrainTexture(true); - - lock (Terrain.heightmap) - { - lock (SyncRoot) - { - PhysicsScene.SetTerrain(Terrain.GetHeights1D()); - } - - m_storageManager.DataStore.StoreTerrain(Terrain.GetHeights2DD(), RegionInfo.RegionID); - - SendTerrainUpdate(true); - - Terrain.ResetTaint(); - } - } - } - - public void SendTerrainUpdate(bool checkForTainted) - { - float[] terData = Heightmap.GetFloatsSerialised(); - - Broadcast(delegate(IClientAPI client) - { - for (int x = 0; x < 16; x++) - { - for (int y = 0; y < 16; y++) - { - if ((!checkForTainted) || (Terrain.IsTainted(x * 16, y * 16))) - { - client.SendLayerData(x, y, terData); - } - } - } - }); + EventManager.TriggerTerrainTick(); } private void UpdateStorageBackup() @@ -963,14 +924,9 @@ namespace OpenSim.Region.Environment.Scenes mapTexture.Save(fileName, ImageFormat.Jpeg); } - /// - /// Loads a world map from a specified R32 file - /// - /// A working R32 file - public void LoadWorldMap(string filename) + public void SaveTerrain() { - Terrain.LoadFromFileF32(filename); - Terrain.SaveRevertMap(); + m_storageManager.DataStore.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID); } /// @@ -984,37 +940,15 @@ namespace OpenSim.Region.Environment.Scenes double[,] map = m_storageManager.DataStore.LoadTerrain(RegionInfo.RegionID); if (map == null) { - if (string.IsNullOrEmpty(m_regInfo.EstateSettings.terrainFile)) - { - m_log.Info("[TERRAIN]: No default terrain. Generating a new terrain."); - Terrain.SetDefaultTerrain(); + m_log.Info("[TERRAIN]: No default terrain. Generating a new terrain."); + Heightmap = new Modules.Terrain.TerrainChannel(); - m_storageManager.DataStore.StoreTerrain(Terrain.GetHeights2DD(), RegionInfo.RegionID); - } - else - { - try - { - Terrain.LoadFromFileF32(m_regInfo.EstateSettings.terrainFile); - Terrain *= m_regInfo.EstateSettings.terrainMultiplier; - } - catch - { - m_log.Info("[TERRAIN]: No terrain found in database or default. Generating a new terrain."); - Terrain.SetDefaultTerrain(); - } - m_storageManager.DataStore.StoreTerrain(Terrain.GetHeights2DD(), RegionInfo.RegionID); - } + m_storageManager.DataStore.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID); } else { - // TODO: Install 'GetDefaultTerrainProvider' method here? Heightmap = new Modules.Terrain.TerrainChannel(map); - Terrain.SetHeights2D(map); } - - CreateTerrainTexture(true); - //CommsManager.GridService.RegisterRegion(RegionInfo); //hack to update the terrain texture in grid mode so it shows on world map } catch (Exception e) { @@ -1049,6 +983,8 @@ namespace OpenSim.Region.Environment.Scenes /// public void CreateTerrainTexture(bool temporary) { + //TODOADAM: Move this to TerrainModule + /* //create a texture asset of the terrain byte[] data = Terrain.WriteJpegImage("defaultstripe.png"); m_regInfo.EstateSettings.terrainImageID = LLUUID.Random(); @@ -1060,6 +996,7 @@ namespace OpenSim.Region.Environment.Scenes asset.Type = 0; asset.Temporary = temporary; AssetCache.AddAsset(asset); + */ } #endregion @@ -1382,7 +1319,6 @@ namespace OpenSim.Region.Environment.Scenes { client.OnRegionHandShakeReply += SendLayerData; //remoteClient.OnRequestWearables += new GenericCall(this.GetInitialPrims); - client.OnModifyTerrain += ModifyTerrain; // client.OnRequestWearables += InformClientOfNeighbours; client.OnAddPrim += AddNewPrim; client.OnUpdatePrimGroupPosition += m_innerScene.UpdatePrimPosition; @@ -2443,7 +2379,7 @@ namespace OpenSim.Region.Environment.Scenes public double GetLandHeight(int x, int y) { - return Terrain.GetHeight(x, y); + return Heightmap[x, y]; } public LLUUID GetLandOwner(float x, float y) diff --git a/OpenSim/Region/Environment/Scenes/SceneBase.cs b/OpenSim/Region/Environment/Scenes/SceneBase.cs index 2a2dea1736..12635c8ed1 100644 --- a/OpenSim/Region/Environment/Scenes/SceneBase.cs +++ b/OpenSim/Region/Environment/Scenes/SceneBase.cs @@ -58,7 +58,7 @@ namespace OpenSim.Region.Environment.Scenes protected string m_regionName; protected RegionInfo m_regInfo; - public TerrainEngine Terrain; + //public TerrainEngine Terrain; public ITerrainChannel Heightmap; protected EventManager m_eventManager; @@ -112,16 +112,7 @@ namespace OpenSim.Region.Environment.Scenes /// Client to send to public virtual void SendLayerData(IClientAPI RemoteClient) { - bool usingTerrainModule = false; - - if (usingTerrainModule) - { - RemoteClient.SendLayerData(Heightmap.GetFloatsSerialised()); - } - else - { - RemoteClient.SendLayerData(Terrain.GetHeights1D()); - } + RemoteClient.SendLayerData(Heightmap.GetFloatsSerialised()); } #endregion diff --git a/OpenSim/Region/Environment/Scenes/SceneEvents.cs b/OpenSim/Region/Environment/Scenes/SceneEvents.cs index ac8f91ed51..5f8c977c33 100644 --- a/OpenSim/Region/Environment/Scenes/SceneEvents.cs +++ b/OpenSim/Region/Environment/Scenes/SceneEvents.cs @@ -48,6 +48,10 @@ namespace OpenSim.Region.Environment.Scenes public event ClientMovement OnClientMovement; + public delegate void OnTerrainTickDelegate(); + + public event OnTerrainTickDelegate OnTerrainTick; + public delegate void OnBackupDelegate(IRegionDataStore datastore); public event OnBackupDelegate OnBackup; @@ -189,6 +193,7 @@ namespace OpenSim.Region.Environment.Scenes private NewGridInstantMessage handlerGridInstantMessageToFriends = null; //OnGridInstantMessageToFriendsModule; private ClientClosed handlerClientClosed = null; //OnClientClosed; private OnNewPresenceDelegate handlerMakeChildAgent = null; //OnMakeChildAgent; + private OnTerrainTickDelegate handlerTerrainTick = null; // OnTerainTick; public void TriggerOnScriptChangedEvent(uint localID, uint change) { @@ -277,6 +282,14 @@ namespace OpenSim.Region.Environment.Scenes } } + public void TriggerTerrainTick() + { + handlerTerrainTick = OnTerrainTick; + if (handlerTerrainTick != null) + { + handlerTerrainTick(); + } + } public void TriggerParcelPrimCountAdd(SceneObjectGroup obj) { diff --git a/OpenSim/Region/Environment/Scenes/SceneManager.cs b/OpenSim/Region/Environment/Scenes/SceneManager.cs index 24f71afda8..3ad9342446 100644 --- a/OpenSim/Region/Environment/Scenes/SceneManager.cs +++ b/OpenSim/Region/Environment/Scenes/SceneManager.cs @@ -178,29 +178,8 @@ namespace OpenSim.Region.Environment.Scenes public bool RunTerrainCmdOnCurrentScene(string[] cmdparams, ref string result) { - if (m_currentScene == null) - { - bool success = true; - foreach (Scene scene in m_localScenes) - { - if (!scene.Terrain.RunTerrainCmd(cmdparams, ref result, scene.RegionInfo.RegionName)) - { - success = false; - } - - // Messy way of preventing us printing out the same help text for each scene - if (cmdparams.Length <= 0 || cmdparams[0] == "help") - { - break; - } - } - - return success; - } - else - { - return m_currentScene.Terrain.RunTerrainCmd(cmdparams, ref result, m_currentScene.RegionInfo.RegionName); - } + m_log.Warn("Terrain commands have been depreciated."); + return false; } public void SendCommandToCurrentSceneScripts(string[] cmdparams) diff --git a/OpenSim/Region/Examples/SimpleApp/MyWorld.cs b/OpenSim/Region/Examples/SimpleApp/MyWorld.cs index 66727d9261..ef0d4d0d40 100644 --- a/OpenSim/Region/Examples/SimpleApp/MyWorld.cs +++ b/OpenSim/Region/Examples/SimpleApp/MyWorld.cs @@ -54,15 +54,7 @@ namespace SimpleApp public override void LoadWorldMap() { - float[] map = new float[65536]; - for (int i = 0; i < 65536; i++) - { - map[i] = 25f; - } - - Terrain.GetHeights1D(map); - CreateTerrainTexture(true); } public override void AddNewClient(IClientAPI client, bool child) diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs index d516aa58a5..9c7f8685a7 100644 --- a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs +++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs @@ -1851,61 +1851,7 @@ namespace OpenSim.Region.ScriptEngine.Common double dsize; if (World.PermissionsMngr.CanTerraform(m_host.OwnerID, new LLVector3(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, 0))) { - switch (brush) - { - case 1: - dsize = 2; - break; - case 2: - dsize = 4; - break; - case 3: - dsize = 8; - break; - default: - if (brush < 0) - { - dsize = (double)(-1 * brush); - } - else - { - LSLError("Invalid brush size"); - dsize = 0; // Should cease execution, but get unassigned local variable dsize on compile. - } - break; - } - switch (action) - { - case 0: - if (World.Terrain.GetHeight((int)m_host.AbsolutePosition.X, (int)m_host.AbsolutePosition.Y) < m_host.AbsolutePosition.Z) - { - World.Terrain.FlattenTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); - } - break; - case 1: - if (World.Terrain.GetHeight((int)m_host.AbsolutePosition.X, (int)m_host.AbsolutePosition.Y) < (double)m_host.AbsolutePosition.Z) - { - World.Terrain.RaiseTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 0.1); - } - break; - case 2: - if (World.Terrain.GetHeight((int)m_host.AbsolutePosition.X, (int)m_host.AbsolutePosition.Y) > 0) - { - World.Terrain.LowerTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); - } - break; - case 3: - World.Terrain.SmoothTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); - break; - case 4: - World.Terrain.NoiseTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); - break; - case 5: - World.Terrain.RevertTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); - break; - default: - break; - } + NotImplemented("llModifyLand"); } } @@ -4162,7 +4108,7 @@ namespace OpenSim.Region.ScriptEngine.Common if (World.PermissionsMngr.CanTerraform(m_host.OwnerID, new LLVector3(x, y, 0))) { - World.Terrain.Set(x, y, val); + World.Heightmap[x, y] = val; return 1; } else @@ -4177,7 +4123,7 @@ namespace OpenSim.Region.ScriptEngine.Common if (x > 255 || x < 0 || y > 255 || y < 0) LSLError("osTerrainGetHeight: Coordinate out of bounds"); - return World.Terrain.GetHeight(x, y); + return World.Heightmap[x, y]; } public int osRegionRestart(double seconds) diff --git a/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs index c6feb03001..78764fedd4 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs @@ -299,7 +299,7 @@ namespace OpenSim.Region.Terrain { if (IsTainted(x * 16, y * 16)) { - bool usingTerrainModule = false; + bool usingTerrainModule = true; if (!usingTerrainModule) {