aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs67
1 files changed, 67 insertions, 0 deletions
diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
index bc8fc95..239ff55 100644
--- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
+++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
@@ -801,6 +801,66 @@ namespace OpenSim.Region.CoreModules.World.Terrain
801 CheckForTerrainUpdates(); 801 CheckForTerrainUpdates();
802 } 802 }
803 803
804 private void InterfaceRescaleTerrain(Object[] args)
805 {
806 double desiredMin = (double)args[0];
807 double desiredMax = (double)args[1];
808
809 // determine desired scaling factor
810 double desiredRange = desiredMax - desiredMin;
811 //m_log.InfoFormat("Desired {0}, {1} = {2}", new Object[] { desiredMin, desiredMax, desiredRange });
812
813 if (desiredRange == 0d)
814 {
815 // delta is zero so flatten at requested height
816 InterfaceFillTerrain(new Object[] { args[1] });
817 }
818 else
819 {
820 //work out current heightmap range
821 double currMin = double.MaxValue;
822 double currMax = double.MinValue;
823
824 int width = m_channel.Width;
825 int height = m_channel.Height;
826
827 for (int x = 0; x < width; x++)
828 {
829 for (int y = 0; y < height; y++)
830 {
831 double currHeight = m_channel[x, y];
832 if (currHeight < currMin)
833 {
834 currMin = currHeight;
835 }
836 else if (currHeight > currMax)
837 {
838 currMax = currHeight;
839 }
840 }
841 }
842
843 double currRange = currMax - currMin;
844 double scale = desiredRange / currRange;
845
846 //m_log.InfoFormat("Current {0}, {1} = {2}", new Object[] { currMin, currMax, currRange });
847 //m_log.InfoFormat("Scale = {0}", scale);
848
849 // scale the heightmap accordingly
850 for (int x = 0; x < width; x++)
851 {
852 for (int y = 0; y < height; y++)
853 {
854 double currHeight = m_channel[x, y] - currMin;
855 m_channel[x, y] = desiredMin + (currHeight * scale);
856 }
857 }
858
859 CheckForTerrainUpdates();
860 }
861
862 }
863
804 private void InterfaceElevateTerrain(Object[] args) 864 private void InterfaceElevateTerrain(Object[] args)
805 { 865 {
806 int x, y; 866 int x, y;
@@ -963,6 +1023,12 @@ namespace OpenSim.Region.CoreModules.World.Terrain
963 new Command("flip", CommandIntentions.COMMAND_HAZARDOUS, InterfaceFlipTerrain, "Flips the current terrain about the X or Y axis"); 1023 new Command("flip", CommandIntentions.COMMAND_HAZARDOUS, InterfaceFlipTerrain, "Flips the current terrain about the X or Y axis");
964 flipCommand.AddArgument("direction", "[x|y] the direction to flip the terrain in", "String"); 1024 flipCommand.AddArgument("direction", "[x|y] the direction to flip the terrain in", "String");
965 1025
1026 Command rescaleCommand =
1027 new Command("rescale", CommandIntentions.COMMAND_HAZARDOUS, InterfaceRescaleTerrain, "Rescales the current terrain to fit between the given min and max heights");
1028 rescaleCommand.AddArgument("min", "min terrain height after rescaling", "Double");
1029 rescaleCommand.AddArgument("max", "max terrain height after rescaling", "Double");
1030
1031
966 // Debug 1032 // Debug
967 Command showDebugStatsCommand = 1033 Command showDebugStatsCommand =
968 new Command("stats", CommandIntentions.COMMAND_STATISTICAL, InterfaceShowDebugStats, 1034 new Command("stats", CommandIntentions.COMMAND_STATISTICAL, InterfaceShowDebugStats,
@@ -991,6 +1057,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
991 m_commander.RegisterCommand("stats", showDebugStatsCommand); 1057 m_commander.RegisterCommand("stats", showDebugStatsCommand);
992 m_commander.RegisterCommand("effect", pluginRunCommand); 1058 m_commander.RegisterCommand("effect", pluginRunCommand);
993 m_commander.RegisterCommand("flip", flipCommand); 1059 m_commander.RegisterCommand("flip", flipCommand);
1060 m_commander.RegisterCommand("rescale", rescaleCommand);
994 1061
995 // Add this to our scene so scripts can call these functions 1062 // Add this to our scene so scripts can call these functions
996 m_scene.RegisterModuleCommander(m_commander); 1063 m_scene.RegisterModuleCommander(m_commander);