From 9559c3f6e654ba27e8f6d859308017553ea8f0bf Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Sat, 23 Feb 2008 04:07:00 +0000 Subject: [PATCH] * Rex merge, Region/Terrain --- .../Properties/AssemblyInfo.cs | 130 +- .../Terrain.BasicTerrain/TerrainEngine.cs | 2823 +++++++++-------- .../libTerrainBSD/Channel/Editing/Flatten.cs | 290 +- .../libTerrainBSD/Channel/Editing/Raise.cs | 268 +- .../Channel/Generators/Cellular.cs | 58 +- .../Channel/Generators/Midpoint.cs | 58 +- .../Channel/Generators/Mountain.cs | 58 +- .../libTerrainBSD/Channel/Grid.cs | 736 ++--- .../libTerrainBSD/Tools/Point2D.cs | 84 +- .../libTerrainBSD/Tools/Tools.cs | 120 +- 10 files changed, 2362 insertions(+), 2263 deletions(-) diff --git a/OpenSim/Region/Terrain.BasicTerrain/Properties/AssemblyInfo.cs b/OpenSim/Region/Terrain.BasicTerrain/Properties/AssemblyInfo.cs index 88fa972347..219ab1cbfa 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/Properties/AssemblyInfo.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/Properties/AssemblyInfo.cs @@ -1,65 +1,65 @@ -/* -* Copyright (c) Contributors, http://opensimulator.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. - -[assembly : AssemblyTitle("OpenSim.Region.Terrain.BasicTerrain")] -[assembly : AssemblyDescription("")] -[assembly : AssemblyConfiguration("")] -[assembly : AssemblyCompany("")] -[assembly : AssemblyProduct("OpenSim.Region.Terrain.BasicTerrain")] -[assembly : AssemblyCopyright("Copyright © 2007")] -[assembly : AssemblyTrademark("")] -[assembly : AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. - -[assembly : ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM - -[assembly : Guid("3263f5b5-0a41-4ed5-91a2-9baaaeecc849")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly : AssemblyVersion("1.0.0.0")] -[assembly : AssemblyFileVersion("1.0.0.0")] \ No newline at end of file +/* +* Copyright (c) Contributors, http://opensimulator.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly : AssemblyTitle("OpenSim.Region.Terrain.BasicTerrain")] +[assembly : AssemblyDescription("")] +[assembly : AssemblyConfiguration("")] +[assembly : AssemblyCompany("")] +[assembly : AssemblyProduct("OpenSim.Region.Terrain.BasicTerrain")] +[assembly : AssemblyCopyright("Copyright © OpenSimulator.org Developers 2007-2008")] +[assembly : AssemblyTrademark("")] +[assembly : AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly : ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly : Guid("3263f5b5-0a41-4ed5-91a2-9baaaeecc849")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly : AssemblyVersion("1.0.0.0")] +[assembly : AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs index 4589e87b50..decbb73964 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs @@ -1,1367 +1,1456 @@ -/* -* Copyright (c) Contributors, http://opensimulator.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; -using System.Globalization; -using System.IO; -using System.Threading; -using libTerrain; -using OpenJPEGNet; -using OpenSim.Framework; - -namespace OpenSim.Region.Terrain -{ - public class TerrainCommand - { - public virtual bool run(string[] cmdargs, ref string output) - { - return false; - } - - public string args; - public string help; - } - - public class TerrainEngine - { - public static Mutex fileIOLock = new Mutex(); - - /// - /// Plugin library for scripts - /// - public FilterHost customFilters = new FilterHost(); - - /// - /// A [normally] 256x256 heightmap - /// - public Channel heightmap; - - /// - /// A copy of heightmap at the last save point (for reverting) - /// - public Channel revertmap; - - /// - /// Water heightmap (needs clientside mods to work) - /// - public Channel watermap; - - /// - /// Max amount the terrain can be raised from the revert parameters - /// - public double maxRaise = 500.0; - - /// - /// Min amount the terrain can be lowered from the revert parameters - /// - public double minLower = 500.0; - - /// - /// The last time the terrain was edited - /// - public DateTime lastEdit = DateTime.Now; - - - /// - /// Whether or not the terrain has been modified since it was last saved and sent to the Physics engine. - /// Counts the number of modifications since the last save. (0 = Untainted) - /// - public int tainted; - - private int w, h; - - /// - /// Used to determine what offset to use when loading singular heightmaps across multiple sims - /// - private int offsetX; - - private int offsetY; - - - /// - /// Generate a new TerrainEngine instance and creates a new heightmap - /// - public TerrainEngine(int X, int Y) - { - w = 256; - h = 256; - heightmap = new Channel(w, h); - revertmap = new Channel(w, h); - watermap = new Channel(w, h); - watermap.Fill(20); - - offsetX = X; - offsetY = Y; - - tainted++; - } - - public bool Tainted() - { - return (tainted != 0); - } - - public bool StillEditing() - { - TimeSpan gap = DateTime.Now - lastEdit; - - if (gap.TotalSeconds <= 4.0) - return true; - - return false; - } - - public bool Tainted(int x, int y) - { - return (heightmap.diff[x/16, y/16] != 0); - } - - public void ResetTaint() - { - tainted = 0; - heightmap.diff = new int[w/16,h/16]; - } - - //Testing to see if moving the TerraForming packet handling code into here works well - /// - /// 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) - { - // Shiny. - double size = (double) (1 << brushsize); - - /* Okay, so here's the deal - * This has to handle both when a user draws on the terrain *and* when a user selects - * a selection of AABB on terrain and applies whatever routine the client requests - * There's something currently wrong with the brushsize --> size conversion.. however - * it's workable.. just unpredictable. - * - * North is always higher and East is always higher - * in the AABB representation - * - * Therefore what we're doing is looping from south to north and west to east - * and applying the associated algorithm with the brush. - * - * This works good on the fast ones, but things like smooth take 12 seconds a single click.. - * for now, smooth won't be 'selectionated' - * - * If the user draws instead of selects, north will = south, and east will = west. - * if the user selects, then the selection is inclusive - * it'll always affect at least one point on the heightmap. - * - * that means we use the <= operator - * - * Again, libTerrain is yx instead of xy.. so, it's reflected in the function calls - * - */ - - - switch (action) - { - case 0: - // flatten terrain - for (float x = south; x <= north; x++) - { - for (float y = west; y <= east; y++) - { - FlattenTerrain(y, x, size, (double) seconds/5.0); - lastEdit = DateTime.Now; - } - } - break; - case 1: - // raise terrain - for (float x = south; x <= north; x++) - { - for (float y = west; y <= east; y++) - { - RaiseTerrain(y, x, size, (double) seconds/5.0); - lastEdit = DateTime.Now; - } - } - break; - case 2: - //lower terrain - for (float x = south; x <= north; x++) - { - for (float y = west; y <= east; y++) - { - LowerTerrain(y, x, size, (double) seconds/5.0); - lastEdit = DateTime.Now; - } - } - break; - case 3: - // smooth terrain - // - // We're leaving this out of the parcel calculations for now - // because just a single one of these will stall your sim for - // 12 seconds. Looping over the parcel on this one is just stupid - // - //for (float x = south; x <= north; x++) - //{ - //for (float y = west; y <= east; y++) - //{ - //SmoothTerrain(y, x , size, (double)seconds / 5.0); - //} - //} - - SmoothTerrain(west, north, size, (double) seconds/5.0); - - break; - case 4: - // noise - for (float x = south; x <= north; x++) - { - for (float y = west; y <= east; y++) - { - NoiseTerrain(y, x, size, (double) seconds/5.0); - lastEdit = DateTime.Now; - } - } - break; - case 5: - // revert - for (float x = south; x <= north; x++) - { - for (float y = west; y <= east; y++) - { - RevertTerrain(y, x, size, (double) seconds/5.0); - lastEdit = DateTime.Now; - } - } - break; - - // CLIENT EXTENSIONS GO HERE - case 128: - // erode-thermal - break; - case 129: - // erode-aerobic - break; - case 130: - // erode-hydraulic - break; - } - - for (int x = 0; x < 16; x++) - { - for (int y = 0; y < 16; y++) - { - if (Tainted(x*16, y*16)) - { - remoteUser.SendLayerData(x, y, GetHeights1D()); - } - } - } - - lastEdit = DateTime.Now; - - return; - } - - - /// - /// Checks to make sure the terrain is within baked values +/- maxRaise/minLower - /// - public void CheckHeightValues() - { - int x, y; - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - if ((heightmap.Get(x, y) > revertmap.Get(x, y) + maxRaise)) - { - heightmap.map[x, y] = revertmap.Get(x, y) + maxRaise; - } - if ((heightmap.Get(x, y) > revertmap.Get(x, y) - minLower)) - { - heightmap.map[x, y] = revertmap.Get(x, y) - minLower; - } - } - } - } - - - /// - /// Converts the heightmap to a 65536 value 1D floating point array - /// - /// A float[65536] array containing the heightmap - public float[] GetHeights1D() - { - float[] heights = new float[w*h]; - int i; - - for (i = 0; i < w*h; i++) - { - heights[i] = (float) heightmap.map[i%w, i/w]; - } - - return heights; - } - - /// - /// Converts the heightmap to a 256x256 value 2D floating point array. - /// - /// An array of 256,256 values containing the heightmap - public float[,] GetHeights2D() - { - float[,] heights = new float[w,h]; - int x, y; - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - heights[x, y] = (float) heightmap.map[x, y]; - } - } - return heights; - } - - /// - /// Converts the heightmap to a 256x256 value 2D floating point array. Double precision version. - /// - /// An array of 256,256 values containing the heightmap - public double[,] GetHeights2DD() - { - return heightmap.map; - } - - /// - /// Imports a 1D floating point array into the 2D heightmap array - /// - /// The array to import (must have 65536 members) - public void GetHeights1D(float[] heights) - { - int i; - for (i = 0; i < w*h; i++) - { - heightmap.map[i%w, i/w] = heights[i]; - } - - tainted++; - } - - /// - /// Loads a 2D array of values into the heightmap - /// - /// An array of 256,256 float values - public void SetHeights2D(float[,] heights) - { - int x, y; - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - heightmap.Set(x, y, (double) heights[x, y]); - } - } - SaveRevertMap(); - tainted++; - } - - /// - /// Loads a 2D array of values into the heightmap (Double Precision Version) - /// - /// An array of 256,256 float values - public void SetHeights2D(double[,] heights) - { - int x, y; - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - heightmap.Set(x, y, heights[x, y]); - } - } - SaveRevertMap(); - tainted++; - } - - /// - /// Swaps the two heightmap buffers (the 'revert map' and the heightmap) - /// - public void SwapRevertMaps() - { - Channel backup = heightmap.Copy(); - heightmap = revertmap; - revertmap = backup; - } - - /// - /// Saves the current heightmap into the revertmap - /// - public void SaveRevertMap() - { - revertmap = heightmap.Copy(); - } - - /// - /// Processes a terrain-specific command - /// - /// Commandline arguments (space seperated) - /// Reference that returns error or help text if returning false - /// If the operation was successful (if not, the error is placed into resultText) - public bool RunTerrainCmd(string[] args, ref string resultText, string simName) - { - string command; - if (args.Length > 0) - { - command = args[0]; - } - else - { - command = "help"; - } - - try - { - switch (command) - { - case "help": - resultText += "terrain regenerate - rebuilds the sims terrain using a default algorithm\n"; - resultText += - "terrain hills \n"; - resultText += " type should be spheres, blocks, cones, or squared\n"; - resultText += - "terrain voronoi - generates a worley fractal with X points per block"; - resultText += "terrain seed - sets the random seed value to \n"; - resultText += - "terrain load - loads a terrain from disk, type can be 'F32', 'F64', 'RAW' or 'IMG'\n"; - resultText += - "terrain save - saves a terrain to disk, type can be 'F32', 'F64', 'PNG', 'RAW' or 'HIRAW'\n"; - resultText += - "terrain save grdmap - creates a PNG snapshot of the region using a named gradient map\n"; - resultText += - "terrain rescale - rescales a terrain to be between and meters high\n"; - resultText += "terrain fill - fills a terrain at the specified height\n"; - resultText += - "terrain erode aerobic \n"; - resultText += "terrain erode thermal \n"; - resultText += "terrain erode hydraulic \n"; - resultText += "terrain multiply - multiplies a terrain by \n"; - resultText += "terrain revert - reverts the terrain to the stored original\n"; - resultText += "terrain bake - saves the current terrain into the revert map\n"; - resultText += - "terrain csfilter - loads a new filter from the specified .cs file\n"; - resultText += - "terrain jsfilter - loads a new filter from the specified .js file\n"; - foreach (KeyValuePair filter in customFilters.filters) - { - resultText += filter.Value.Help(); - } - - return false; - - case "revert": - SwapRevertMaps(); - SaveRevertMap(); - break; - - case "bake": - SaveRevertMap(); - break; - - case "seed": - SetSeed(Convert.ToInt32(args[1])); - break; - - case "erode": - return ConsoleErosion(args, ref resultText); - - case "voronoi": - double[] c = new double[2]; - c[0] = -1; - c[1] = 1; - heightmap.VoronoiDiagram(Convert.ToInt32(args[1]), Convert.ToInt32(args[2]), c); - break; - - case "hills": - return ConsoleHills(args, ref resultText); - - case "regenerate": - HillsGenerator(); - break; - - case "rescale": - SetRange(Convert.ToSingle(args[1]), Convert.ToSingle(args[2])); - break; - - case "fill": - heightmap.Fill(Convert.ToDouble(args[1])); - tainted++; - break; - - case "clip": - heightmap.Clip(Convert.ToDouble(args[1]), Convert.ToDouble(args[2])); - tainted++; - break; - - case "smooth": - heightmap.Smooth(Convert.ToDouble(args[1])); - tainted++; - break; - - case "add": - heightmap += Convert.ToDouble(args[1]); - tainted++; - break; - - case "multiply": - heightmap *= Convert.ToDouble(args[1]); - tainted++; - break; - - case "load": - string filenameL = args[2].Replace("%name%", simName); - filenameL = filenameL.Replace("%x%", offsetX.ToString()); - filenameL = filenameL.Replace("%y%", offsetY.ToString()); - - switch (args[1].ToLower()) - { - case "f32": - LoadFromFileF32(filenameL); - break; - - case "f64": - LoadFromFileF64(filenameL); - break; - - case "raw": - LoadFromFileSLRAW(filenameL); - break; - - case "img": - heightmap = heightmap.LoadImage(filenameL); - tainted++; - break; - - default: - resultText = "Unknown image or data format"; - return false; - } - break; - - case "load-tile": - switch (args[1].ToLower()) - { - case "f32": - LoadFromFileF32(args[2], Convert.ToInt32(args[3]), Convert.ToInt32(args[4]), - Convert.ToInt32(args[5]), Convert.ToInt32(args[6])); - break; - case "img": - LoadFromFileIMG(args[2], Convert.ToInt32(args[3]), Convert.ToInt32(args[4]), - Convert.ToInt32(args[5]), Convert.ToInt32(args[6])); - break; - default: - resultText = "Unknown or unsupported image or data format"; - return false; - } - break; - - case "save": - string filename = args[2].Replace("%name%", simName); - filename = filename.Replace("%x%", offsetX.ToString()); - filename = filename.Replace("%y%", offsetY.ToString()); - - switch (args[1].ToLower()) - { - case "f32": - WriteToFileF32(filename); - break; - - case "f64": - WriteToFileF64(filename); - break; - - case "grdmap": - if (args.Length >= 4) - ExportImage(filename, args[3]); - else - ExportImage(filename, "defaultstripe.png"); - break; - - case "png": - heightmap.SaveImage(filename); - break; - - case "raw": - WriteToFileRAW(filename); - break; - - case "hiraw": - WriteToFileHiRAW(filename); - break; - - default: - resultText = "Unknown image or data format"; - return false; - } - break; - - case "csfilter": - customFilters.LoadFilterCSharp(args[1]); - break; - case "jsfilter": - customFilters.LoadFilterJScript(args[1]); - break; - - default: - // Run any custom registered filters - if (customFilters.filters.ContainsKey(command)) - { - customFilters.filters[command].Filter(heightmap, args); - break; - } - else - { - resultText = "Unknown terrain command"; - return false; - } - } - return true; - } - catch (Exception e) - { - resultText = "Error running terrain command: " + e.ToString(); - return false; - } - } - - private bool ConsoleErosion(string[] args, ref string resultText) - { - double min = heightmap.FindMin(); - double max = heightmap.FindMax(); - - switch (args[1].ToLower()) - { - case "aerobic": - // WindSpeed, PickupMinimum,DropMinimum,Carry,Rounds,Lowest - heightmap.AerobicErosion(Convert.ToDouble(args[2]), Convert.ToDouble(args[3]), - Convert.ToDouble(args[4]), Convert.ToDouble(args[5]), - Convert.ToInt32(args[6]), Convert.ToBoolean(args[7]), - Convert.ToBoolean(args[8])); - break; - case "thermal": - heightmap.ThermalWeathering(Convert.ToDouble(args[2]), Convert.ToInt32(args[3]), - Convert.ToDouble(args[4])); - break; - case "hydraulic": - Channel rainMap = new Channel(w, h); - rainMap.Fill(Convert.ToDouble(args[2])); - heightmap.HydraulicErosion(rainMap, Convert.ToDouble(args[3]), Convert.ToDouble(args[4]), - Convert.ToInt32(args[5]), Convert.ToInt32(args[6])); - break; - default: - resultText = "Unknown erosion type"; - return false; - } - - heightmap.Normalise(min, max); - - tainted++; - return true; - } - - private bool ConsoleHills(string[] args, ref string resultText) - { - Random RandomClass = new Random(); - SetSeed(RandomClass.Next()); - int count; - double sizeMin; - double sizeRange; - bool island; - bool additive; - bool noisy; - - if (args.GetLength(0) > 2) - { - int.TryParse(args[2].ToString(), out count); - double.TryParse(args[3].ToString(), NumberStyles.AllowDecimalPoint, Culture.NumberFormatInfo, - out sizeMin); - double.TryParse(args[4].ToString(), NumberStyles.AllowDecimalPoint, Culture.NumberFormatInfo, - out sizeRange); - bool.TryParse(args[5].ToString(), out island); - bool.TryParse(args[6].ToString(), out additive); - bool.TryParse(args[7].ToString(), out noisy); - } - else - { - count = 200; - sizeMin = 20; - sizeRange = 40; - island = true; - additive = true; - noisy = false; - } - - switch (args[1].ToLower()) - { - case "blocks": - heightmap.HillsBlocks(count, sizeMin, sizeRange, island, additive, noisy); - break; - case "cones": - heightmap.HillsCones(count, sizeMin, sizeRange, island, additive, noisy); - break; - case "spheres": - heightmap.HillsSpheres(count, sizeMin, sizeRange, island, additive, noisy); - break; - case "squared": - heightmap.HillsSquared(count, sizeMin, sizeRange, island, additive, noisy); - break; - default: - resultText = "Unknown hills type"; - return false; - } - tainted++; - return true; - } - - /// - /// Renormalises the array between min and max - /// - /// Minimum value of the new array - /// Maximum value of the new array - public void SetRange(float min, float max) - { - heightmap.Normalise((double) min, (double) max); - tainted++; - } - - /// - /// Loads a file consisting of 256x256 doubles and imports it as an array into the map. - /// - /// TODO: Move this to libTerrain itself - /// The filename of the double array to import - public void LoadFromFileF64(string filename) - { - FileInfo file = new FileInfo(filename); - FileStream s = file.Open(FileMode.Open, FileAccess.Read); - BinaryReader bs = new BinaryReader(s); - int x, y; - for (y = 0; y < h; y++) - { - for (x = 0; x < h; x++) - { - heightmap.map[x, y] = bs.ReadDouble(); - } - } - - bs.Close(); - s.Close(); - - tainted++; - } - - /// - /// Loads a file consisting of 256x256 floats and imports it as an array into the map. - /// - /// TODO: Move this to libTerrain itself - /// The filename of the float array to import - public void LoadFromFileF32(string filename) - { - FileInfo file = new FileInfo(filename); - FileStream s = file.Open(FileMode.Open, FileAccess.Read); - BinaryReader bs = new BinaryReader(s); - int x, y; - for (y = 0; y < h; y++) - { - for (x = 0; x < w; x++) - { - heightmap.map[x, y] = (double) bs.ReadSingle(); - } - } - - bs.Close(); - s.Close(); - - tainted++; - } - - /// - /// Loads a section of a larger heightmap (F32) - /// - /// File to load - /// Size of the file - /// Size of the file - /// Where do the region coords start for this terrain? - /// Where do the region coords start for this terrain? - public void LoadFromFileF32(string filename, int dimensionX, int dimensionY, int lowerboundX, int lowerboundY) - { - fileIOLock.WaitOne(); - try - { - int sectionToLoadX = ((offsetX - lowerboundX)*w); - int sectionToLoadY = ((offsetY - lowerboundY)*h); - - double[,] tempMap = new double[dimensionX,dimensionY]; - - FileInfo file = new FileInfo(filename); - FileStream s = file.Open(FileMode.Open, FileAccess.Read); - BinaryReader bs = new BinaryReader(s); - - int x, y; - for (x = 0; x < dimensionX; x++) - { - for (y = 0; y < dimensionY; y++) - { - tempMap[x, y] = (double) bs.ReadSingle(); - } - } - - for (y = 0; y < h; y++) - { - for (x = 0; x < w; x++) - { - heightmap.Set(x, y, tempMap[x + sectionToLoadX, y + sectionToLoadY]); - } - } - - bs.Close(); - s.Close(); - - tainted++; - } - finally - { - fileIOLock.ReleaseMutex(); - } - } - - /// - /// Loads a larger tiled image across a terrain - /// - /// Filename to load from (any generic image format should work) - /// The dimensions of the image - /// The dimensions of the image - /// Where sim coords begin for this patch - /// Where sim coords begin for this patch - public void LoadFromFileIMG(string filename, int dimensionX, int dimensionY, int lowerboundX, int lowerboundY) - { - int sectionToLoadX = ((offsetX - lowerboundX)*w); - int sectionToLoadY = ((offsetY - lowerboundY)*h); - - double[,] tempMap = new double[dimensionX,dimensionY]; - - Bitmap lgrBmp = new Bitmap(filename); - - int x, y; - for (x = 0; x < dimensionX; x++) - { - for (y = 0; y < dimensionY; y++) - { - tempMap[x, y] = (float) lgrBmp.GetPixel(x, y).GetBrightness(); - } - } - - for (y = 0; y < h; y++) - { - for (x = 0; x < w; x++) - { - heightmap.Set(x, y, tempMap[x + sectionToLoadX, y + sectionToLoadY]); - } - } - - tainted++; - } - - /// - /// Loads a file formatted in the SL .RAW Format used on the main grid - /// - /// This file format stinks and is best avoided. - /// A path to the .RAW format - public void LoadFromFileSLRAW(string filename) - { - FileInfo file = new FileInfo(filename); - FileStream s = file.Open(FileMode.Open, FileAccess.Read); - BinaryReader bs = new BinaryReader(s); - int x, y; - for (y = 0; y < h; y++) - { - for (x = 0; x < w; x++) - { - heightmap.map[x, y] = (double) bs.ReadByte()*((double) bs.ReadByte()/127.0); - bs.ReadBytes(11); // Advance the stream to next bytes. - } - } - - bs.Close(); - s.Close(); - - tainted++; - } - - /// - /// Writes the current terrain heightmap to disk, in the format of a 65536 entry double[] array. - /// - /// The desired output filename - public void WriteToFileF64(string filename) - { - FileInfo file = new FileInfo(filename); - FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write); - BinaryWriter bs = new BinaryWriter(s); - - int x, y; - for (y = 0; y < h; y++) - { - for (x = 0; x < w; x++) - { - bs.Write(heightmap.Get(x, y)); - } - } - - bs.Close(); - s.Close(); - } - - /// - /// Writes the current terrain heightmap to disk, in the format of a 65536 entry float[] array - /// - /// The desired output filename - public void WriteToFileF32(string filename) - { - FileInfo file = new FileInfo(filename); - FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write); - BinaryWriter bs = new BinaryWriter(s); - - int x, y; - for (y = 0; y < h; y++) - { - for (x = 0; x < w; x++) - { - bs.Write((float) heightmap.Get(x, y)); - } - } - - bs.Close(); - s.Close(); - } - - /// - /// A very fast LL-RAW file output mechanism - lower precision mechanism but wont take 5 minutes to run either. - /// (is also editable in an image application) - /// - /// Filename to write to - public void WriteToFileRAW(string filename) - { - FileInfo file = new FileInfo(filename); - FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write); - BinaryWriter binStream = new BinaryWriter(s); - - int x, y; - - // Used for the 'green' channel. - byte avgMultiplier = (byte) heightmap.Avg(); - byte backupMultiplier = (byte) revertmap.Avg(); - - // Limit the multiplier so it can represent points >64m. - if (avgMultiplier > 196) - avgMultiplier = 196; - if (backupMultiplier > 196) - backupMultiplier = 196; - // Make sure it's at least one to prevent a div by zero - if (avgMultiplier < 1) - avgMultiplier = 1; - if (backupMultiplier < 1) - backupMultiplier = 1; - - for (y = 0; y < h; y++) - { - for (x = 0; x < h; x++) - { - byte red = (byte) (heightmap.Get(x, y)/((double) avgMultiplier/128.0)); - byte green = avgMultiplier; - byte blue = (byte) watermap.Get(x, y); - byte alpha1 = 0; // Land Parcels - byte alpha2 = 0; // For Sale Land - byte alpha3 = 0; // Public Edit Object - byte alpha4 = 0; // Public Edit Land - byte alpha5 = 255; // Safe Land - byte alpha6 = 255; // Flying Allowed - byte alpha7 = 255; // Create Landmark - byte alpha8 = 255; // Outside Scripts - byte alpha9 = (byte) (revertmap.Get(x, y)/((double) backupMultiplier/128.0)); - byte alpha10 = backupMultiplier; - - binStream.Write(red); - binStream.Write(green); - binStream.Write(blue); - binStream.Write(alpha1); - binStream.Write(alpha2); - binStream.Write(alpha3); - binStream.Write(alpha4); - binStream.Write(alpha5); - binStream.Write(alpha6); - binStream.Write(alpha7); - binStream.Write(alpha8); - binStream.Write(alpha9); - binStream.Write(alpha10); - } - } - binStream.Close(); - s.Close(); - } - - /// - /// Outputs to a LL compatible RAW in the most efficient manner possible - /// - /// Does not calculate the revert map - /// The filename to output to - public void WriteToFileHiRAW(string filename) - { - FileInfo file = new FileInfo(filename); - FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write); - BinaryWriter binStream = new BinaryWriter(s); - - // Generate a smegging big lookup table to speed the operation up (it needs it) - double[] lookupHeightTable = new double[65536]; - int i, j, x, y; - for (i = 0; i < 256; i++) - { - for (j = 0; j < 256; j++) - { - lookupHeightTable[i + (j*256)] = ((double) i*((double) j/127.0)); - } - } - - // Output the calculated raw - for (y = 0; y < h; y++) - { - for (x = 0; x < w; x++) - { - double t = heightmap.Get(x, y); - double min = double.MaxValue; - int index = 0; - - for (i = 0; i < 65536; i++) - { - if (Math.Abs(t - lookupHeightTable[i]) < min) - { - min = Math.Abs(t - lookupHeightTable[i]); - index = i; - } - } - - byte red = (byte) (index & 0xFF); - byte green = (byte) ((index >> 8) & 0xFF); - byte blue = (byte) watermap.Get(x, y); - byte alpha1 = 0; // Land Parcels - byte alpha2 = 0; // For Sale Land - byte alpha3 = 0; // Public Edit Object - byte alpha4 = 0; // Public Edit Land - byte alpha5 = 255; // Safe Land - byte alpha6 = 255; // Flying Allowed - byte alpha7 = 255; // Create Landmark - byte alpha8 = 255; // Outside Scripts - byte alpha9 = red; - byte alpha10 = green; - - binStream.Write(red); - binStream.Write(green); - binStream.Write(blue); - binStream.Write(alpha1); - binStream.Write(alpha2); - binStream.Write(alpha3); - binStream.Write(alpha4); - binStream.Write(alpha5); - binStream.Write(alpha6); - binStream.Write(alpha7); - binStream.Write(alpha8); - binStream.Write(alpha9); - binStream.Write(alpha10); - } - } - - binStream.Close(); - s.Close(); - } - - /// - /// Sets the random seed to be used by procedural functions which involve random numbers. - /// - /// The desired seed - public void SetSeed(int val) - { - heightmap.seed = val; - } - - /// - /// Sets a particular heightmap point to a specified value - /// - /// X Coordinate - /// Y Coordinate - /// Value - public void Set(int x, int y, double val) - { - lock (heightmap) - { - heightmap.Set(x, y, val); - } - tainted++; - } - - /// - /// Raises land in a sphere around the specified coordinates - /// - /// Center of the sphere on the X axis - /// Center of the sphere on the Y axis - /// The radius of the sphere - /// Scale the height of the sphere by this amount (recommended 0..2) - public void RaiseTerrain(double rx, double ry, double size, double amount) - { - lock (heightmap) - { - heightmap.Raise(rx, ry, size, amount); - } - - tainted++; - } - - /// - /// Lowers the land in a sphere around the specified coordinates - /// - /// The center of the sphere at the X axis - /// The center of the sphere at the Y axis - /// The radius of the sphere in meters - /// Scale the height of the sphere by this amount (recommended 0..2) - public void LowerTerrain(double rx, double ry, double size, double amount) - { - lock (heightmap) - { - heightmap.Lower(rx, ry, size, amount); - } - - tainted++; - } - - /// - /// Flattens the land under the brush of specified coordinates (spherical mask) - /// - /// Center of sphere - /// Center of sphere - /// Radius of the sphere - /// Thickness of the mask (0..2 recommended) - public void FlattenTerrain(double rx, double ry, double size, double amount) - { - lock (heightmap) - { - heightmap.Flatten(rx, ry, size, amount); - } - - tainted++; - } - - /// - /// Creates noise within the specified bounds - /// - /// Center of the bounding sphere - /// Center of the bounding sphere - /// The radius of the sphere - /// Strength of the mask (0..2) recommended - public void NoiseTerrain(double rx, double ry, double size, double amount) - { - lock (heightmap) - { - Channel smoothed = new Channel(); - smoothed.Noise(); - - Channel mask = new Channel(); - mask.Raise(rx, ry, size, amount); - - heightmap.Blend(smoothed, mask); - } - - tainted++; - } - - /// - /// Reverts land within the specified bounds - /// - /// Center of the bounding sphere - /// Center of the bounding sphere - /// The radius of the sphere - /// Strength of the mask (0..2) recommended - public void RevertTerrain(double rx, double ry, double size, double amount) - { - lock (heightmap) - { - Channel mask = new Channel(); - mask.Raise(rx, ry, size, amount); - - heightmap.Blend(revertmap, mask); - } - - tainted++; - } - - /// - /// Smooths land under the brush of specified coordinates (spherical mask) - /// - /// Center of the sphere - /// Center of the sphere - /// Radius of the sphere - /// Thickness of the mask (0..2 recommended) - public void SmoothTerrain(double rx, double ry, double size, double amount) - { - lock (heightmap) - { - Channel smoothed = heightmap.Copy(); - smoothed.Smooth(amount); - - Channel mask = new Channel(); - mask.Raise(rx, ry, size, amount); - - heightmap.Blend(smoothed, mask); - } - - tainted++; - } - - /// - /// Generates a simple set of hills in the shape of an island - /// - public void HillsGenerator() - { - lock (heightmap) - { - heightmap.HillsSpheres(200, 20, 40, true, true, false); - heightmap.Normalise(); - heightmap *= 60.0; // Raise to 60m - heightmap.Clip(0.0, 25.0); - heightmap.Pertubation(2.5); - heightmap.Smooth(35.0); - heightmap.Normalise(0.0, 21.0); - } - - tainted++; - } - - /// - /// Wrapper to heightmap.get() - /// - /// X coord - /// Y coord - /// Height at specified coordinates - public double GetHeight(int x, int y) - { - return heightmap.Get(x, y); - } - - /// - /// Multiplies the heightfield by val - /// - /// The heightfield - /// The multiplier - /// - public static TerrainEngine operator *(TerrainEngine terrain, Double val) - { - terrain.heightmap *= val; - terrain.tainted++; - return terrain; - } - - /// - /// Exports the current heightmap to a PNG file - /// - /// The destination filename for the image - /// A 1x*height* image which contains the colour gradient to export with. Must be at least 1x2 pixels, 1x256 or more is ideal. - public void ExportImage(string filename, string gradientmap) - { - try - { - Bitmap bmp = TerrainToBitmap(gradientmap); - - bmp.Save(filename, ImageFormat.Png); - } - catch (Exception e) - { - Console.WriteLine("Failed generating terrain map: " + e.ToString()); - } - } - - /// - /// Exports the current heightmap in Jpeg2000 format to a byte[] - /// - /// A 1x*height* image which contains the colour gradient to export with. Must be at least 1x2 pixels, 1x256 or more is ideal. - public byte[] ExportJpegImage(string gradientmap) - { - byte[] imageData = null; - try - { - Bitmap bmp = TerrainToBitmap(gradientmap); - - imageData = OpenJPEG.EncodeFromImage(bmp, true); - } - catch (Exception e) - { - Console.WriteLine("Failed generating terrain map: " + e.ToString()); - } - - return imageData; - } - - private Bitmap TerrainToBitmap(string gradientmap) - { - Bitmap gradientmapLd = new Bitmap(gradientmap); - - int pallete = gradientmapLd.Height; - - Bitmap bmp = new Bitmap(heightmap.w, heightmap.h); - Color[] colours = new Color[pallete]; - - for (int i = 0; i < pallete; i++) - { - colours[i] = gradientmapLd.GetPixel(0, i); - } - - Channel copy = heightmap.Copy(); - for (int y = 0; y < copy.h; y++) - { - for (int x = 0; x < copy.w; x++) - { - // 512 is the largest possible height before colours clamp - int colorindex = (int) (Math.Max(Math.Min(1.0, copy.Get(x, y)/512.0), 0.0)*(pallete - 1)); - bmp.SetPixel(x, copy.h - y - 1, colours[colorindex]); - } - } - return bmp; - } - } -} \ No newline at end of file +/* +* Copyright (c) Contributors, http://opensimulator.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.Globalization; +using System.IO; +using System.Threading; +using libTerrain; +using OpenJPEGNet; +using OpenSim.Framework; + +namespace OpenSim.Region.Terrain +{ + public class TerrainCommand + { + public virtual bool run(string[] cmdargs, ref string output) + { + return false; + } + + public string args; + public string help; + } + + public class TerrainEngine + { + public static Mutex fileIOLock = new Mutex(); + + /// + /// Plugin library for scripts + /// + public FilterHost customFilters = new FilterHost(); + + /// + /// A [normally] 256x256 heightmap + /// + public Channel heightmap; + + /// + /// A copy of heightmap at the last save point (for reverting) + /// + public Channel revertmap; + + /// + /// Water heightmap (needs clientside mods to work) + /// + public Channel watermap; + + /// + /// Max amount the terrain can be raised from the revert parameters + /// + public double maxRaise = 500.0; + + /// + /// Min amount the terrain can be lowered from the revert parameters + /// + public double minLower = 500.0; + + /// + /// The last time the terrain was edited + /// + public DateTime lastEdit = DateTime.Now; + + + private int counter = 0; + + /// + /// Whether or not the terrain has been modified since it was last saved and sent to the Physics engine. + /// Counts the number of modifications since the last save. (0 = Untainted) + /// + public int tainted; + + private int w, h; + + /// + /// Used to determine what offset to use when loading singular heightmaps across multiple sims + /// + private int offsetX; + + private int offsetY; + + + /// + /// Generate a new TerrainEngine instance and creates a new heightmap + /// + public TerrainEngine(int X, int Y) + { + w = 256; + h = 256; + heightmap = new Channel(w, h); + revertmap = new Channel(w, h); + watermap = new Channel(w, h); + watermap.Fill(20); + + offsetX = X; + offsetY = Y; + + tainted++; + } + + public bool IsTainted() + { + return (tainted != 0); + } + + public bool IsUserStillEditing() + { + TimeSpan gap = DateTime.Now - lastEdit; + + if (gap.TotalSeconds <= 4.0) + return true; + + return false; + } + + public bool IsTainted(int x, int y) + { + return (heightmap.diff[x/16, y/16] != 0); + } + + public void ResetTaint() + { + tainted = 0; + heightmap.diff = new int[w/16,h/16]; + } + + //Testing to see if moving the TerraForming packet handling code into here works well + /// + /// 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) + { + // Shiny. + double size = (double) (1 << brushsize); + //System.Console.WriteLine("SIZE:" + size.ToString() + " Seconds:" + seconds.ToString()); + if (seconds == 1) + { + seconds = 0.0315f; + } + /* Okay, so here's the deal + * This has to handle both when a user draws on the terrain *and* when a user selects + * a selection of AABB on terrain and applies whatever routine the client requests + * There's something currently wrong with the brushsize --> size conversion.. however + * it's workable.. just unpredictable. + * + * North is always higher and East is always higher + * in the AABB representation + * + * Therefore what we're doing is looping from south to north and west to east + * and applying the associated algorithm with the brush. + * + * This works good on the fast ones, but things like smooth take 12 seconds a single click.. + * for now, smooth won't be 'selectionated' + * + * If the user draws instead of selects, north will = south, and east will = west. + * if the user selects, then the selection is inclusive + * it'll always affect at least one point on the heightmap. + * + * that means we use the <= operator + * + * Again, libTerrain is yx instead of xy.. so, it's reflected in the function calls + * + */ + + + switch (action) + { + case 0: + // flatten terrain + for (float x = south; x <= north; x++) + { + for (float y = west; y <= east; y++) + { + FlattenTerrain(y, x, size, (double) seconds/5.0); + lastEdit = DateTime.Now; + //remoteUser.SendLayerData((int)(x / 16), (int)(x / 16), GetHeights1D()); + + } + } + break; + case 1: + // raise terrain + for (float x = south; x <= north; x++) + { + for (float y = west; y <= east; y++) + { + RaiseTerrain(y, x, size, (double) seconds/5.0); + lastEdit = DateTime.Now; + //remoteUser.SendLayerData((int)(x / 16), (int)(x / 16), GetHeights1D()); + } + } + break; + case 2: + //lower terrain + for (float x = south; x <= north; x++) + { + for (float y = west; y <= east; y++) + { + LowerTerrain(y, x, size, (double) seconds/5.0); + lastEdit = DateTime.Now; + //remoteUser.SendLayerData((int)(x / 16), (int)(x / 16), GetHeights1D()); + } + } + break; + case 3: + // smooth terrain + // + // We're leaving this out of the parcel calculations for now + // because just a single one of these will stall your sim for + // 12 seconds. Looping over the parcel on this one is just stupid + // + //for (float x = south; x <= north; x++) + //{ + //for (float y = west; y <= east; y++) + //{ + //SmoothTerrain(y, x , size, (double)seconds / 5.0); + //} + //} + + SmoothTerrain(west, north, size, (double) seconds/5.0); + + break; + case 4: + // noise + for (float x = south; x <= north; x++) + { + for (float y = west; y <= east; y++) + { + NoiseTerrain(y, x, size, (double) seconds/5.0); + lastEdit = DateTime.Now; + } + } + break; + case 5: + // revert + for (float x = south; x <= north; x++) + { + for (float y = west; y <= east; y++) + { + RevertTerrain(y, x, size, (double) seconds/5.0); + lastEdit = DateTime.Now; + } + } + break; + + // CLIENT EXTENSIONS GO HERE + case 128: + // erode-thermal + break; + case 129: + // erode-aerobic + break; + case 130: + // erode-hydraulic + break; + } + + counter++; + if(counter==2) + { + counter=0; + for (int x = 0; x < 16; x++) + { + for (int y = 0; y < 16; y++) + { + if (IsTainted(x*16, y*16)) + { + remoteUser.SendLayerData(x, y, GetHeights1D()); + } + } + } + } + + + lastEdit = DateTime.Now; + + return; + } + + + + + /// + /// Checks to make sure the terrain is within baked values +/- maxRaise/minLower + /// + private void SetTerrainWithinBounds() + { + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + if ((heightmap.Get(x, y) > revertmap.Get(x, y) + maxRaise)) + { + heightmap.map[x, y] = revertmap.Get(x, y) + maxRaise; + } + if ((heightmap.Get(x, y) > revertmap.Get(x, y) - minLower)) + { + heightmap.map[x, y] = revertmap.Get(x, y) - minLower; + } + } + } + } + + + /// + /// Converts the heightmap to a 65536 value 1D floating point array + /// + /// A float[65536] array containing the heightmap + public float[] GetHeights1D() + { + float[] heights = new float[w*h]; + int i; + + for (i = 0; i < w*h; i++) + { + heights[i] = (float) heightmap.map[i%w, i/w]; + } + + return heights; + } + + /// + /// Converts the heightmap to a 256x256 value 2D floating point array. + /// + /// An array of 256,256 values containing the heightmap + public float[,] GetHeights2D() + { + float[,] heights = new float[w,h]; + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + heights[x, y] = (float) heightmap.map[x, y]; + } + } + return heights; + } + + /// + /// Converts the heightmap to a 256x256 value 2D floating point array. Double precision version. + /// + /// An array of 256,256 values containing the heightmap + public double[,] GetHeights2DD() + { + return heightmap.map; + } + + /// + /// Imports a 1D floating point array into the 2D heightmap array + /// + /// The array to import (must have 65536 members) + public void GetHeights1D(float[] heights) + { + int i; + for (i = 0; i < w*h; i++) + { + heightmap.map[i%w, i/w] = heights[i]; + } + + tainted++; + } + + /// + /// Loads a 2D array of values into the heightmap + /// + /// An array of 256,256 float values + public void SetHeights2D(float[,] heights) + { + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + heightmap.Set(x, y, (double) heights[x, y]); + } + } + SaveRevertMap(); + tainted++; + } + + /// + /// Loads a 2D array of values into the heightmap (Double Precision Version) + /// + /// An array of 256,256 float values + public void SetHeights2D(double[,] heights) + { + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + heightmap.Set(x, y, heights[x, y]); + } + } + SaveRevertMap(); + ResetTaint(); + } + + /// + /// Swaps the two heightmap buffers (the 'revert map' and the heightmap) + /// + public void SwapRevertMaps() + { + Channel backup = heightmap.Copy(); + heightmap = revertmap; + revertmap = backup; + } + + /// + /// Saves the current heightmap into the revertmap + /// + public void SaveRevertMap() + { + revertmap = heightmap.Copy(); + } + + /// + /// Processes a terrain-specific command + /// + /// Commandline arguments (space seperated) + /// Reference that returns error or help text if returning false + /// If the operation was successful (if not, the error is placed into resultText) + public bool RunTerrainCmd(string[] args, ref string resultText, string simName) + { + string command; + if (args.Length > 0) + { + command = args[0]; + } + else + { + command = "help"; + } + + try + { + switch (command) + { + case "help": + resultText += "terrain regenerate - rebuilds the sims terrain using a default algorithm\n"; + resultText += + "terrain hills \n"; + resultText += " type should be spheres, blocks, cones, or squared\n"; + resultText += + "terrain voronoi - generates a worley fractal with X points per block"; + resultText += "terrain seed - sets the random seed value to \n"; + resultText += + "terrain load - loads a terrain from disk, type can be 'F32', 'F64', 'RAW' or 'IMG'\n"; + resultText += + "terrain save - saves a terrain to disk, type can be 'F32', 'F64', 'PNG', 'RAW' or 'HIRAW'\n"; + resultText += + "terrain save grdmap - creates a PNG snapshot of the region using a named gradient map\n"; + resultText += + "terrain rescale - rescales a terrain to be between and meters high\n"; + resultText += "terrain fill - fills a terrain at the specified height\n"; + resultText += + "terrain erode aerobic \n"; + resultText += "terrain erode thermal \n"; + resultText += "terrain erode hydraulic \n"; + resultText += "terrain multiply - multiplies a terrain by \n"; + resultText += "terrain elevate - elevates a terrain by \n"; + resultText += "terrain revert - reverts the terrain to the stored original\n"; + resultText += "terrain bake - saves the current terrain into the revert map\n"; + resultText += + "terrain csfilter - loads a new filter from the specified .cs file\n"; + resultText += + "terrain jsfilter - loads a new filter from the specified .js file\n"; + foreach (KeyValuePair filter in customFilters.filters) + { + resultText += filter.Value.Help(); + } + + return false; + + case "revert": + SwapRevertMaps(); + SaveRevertMap(); + break; + + case "bake": + SaveRevertMap(); + break; + + case "seed": + SetSeed(Convert.ToInt32(args[1])); + break; + + case "erode": + return ConsoleErosion(args, ref resultText); + + case "voronoi": + double[] c = new double[2]; + c[0] = -1; + c[1] = 1; + heightmap.VoronoiDiagram(Convert.ToInt32(args[1]), Convert.ToInt32(args[2]), c); + break; + + case "hills": + return ConsoleHills(args, ref resultText); + + case "regenerate": + SetDefaultTerrain(); + break; + + case "rescale": + SetRange(Convert.ToSingle(args[1]), Convert.ToSingle(args[2])); + break; + + case "elevate": + Elevate(Convert.ToSingle(args[1])); + break; + + case "fill": + heightmap.Fill(Convert.ToDouble(args[1])); + tainted++; + break; + + case "clip": + heightmap.Clip(Convert.ToDouble(args[1]), Convert.ToDouble(args[2])); + tainted++; + break; + + case "smooth": + heightmap.Smooth(Convert.ToDouble(args[1])); + tainted++; + break; + + case "add": + heightmap += Convert.ToDouble(args[1]); + tainted++; + break; + + case "multiply": + heightmap *= Convert.ToDouble(args[1]); + tainted++; + break; + + case "load": + string filenameL = args[2].Replace("%name%", simName); + filenameL = filenameL.Replace("%x%", offsetX.ToString()); + filenameL = filenameL.Replace("%y%", offsetY.ToString()); + + switch (args[1].ToLower()) + { + case "f32": + LoadFromFileF32(filenameL); + break; + + case "f64": + LoadFromFileF64(filenameL); + break; + + case "raw": + LoadFromFileSLRAW(filenameL); + break; + + case "img": + heightmap = heightmap.LoadImage(filenameL); + tainted++; + break; + + default: + resultText = "Unknown image or data format"; + return false; + } + break; + + case "load-tile": + switch (args[1].ToLower()) + { + case "f32": + LoadFromFileF32(args[2], Convert.ToInt32(args[3]), Convert.ToInt32(args[4]), + Convert.ToInt32(args[5]), Convert.ToInt32(args[6])); + break; + case "raw": + LoadFromFileSLRAW(args[2], Convert.ToInt32(args[3]), Convert.ToInt32(args[4]), + Convert.ToInt32(args[5]), Convert.ToInt32(args[6])); + break; + case "img": + LoadFromFileIMG(args[2], Convert.ToInt32(args[3]), Convert.ToInt32(args[4]), + Convert.ToInt32(args[5]), Convert.ToInt32(args[6])); + break; + default: + resultText = "Unknown or unsupported image or data format"; + return false; + } + break; + + case "save": + string filename = args[2].Replace("%name%", simName); + filename = filename.Replace("%x%", offsetX.ToString()); + filename = filename.Replace("%y%", offsetY.ToString()); + + switch (args[1].ToLower()) + { + case "f32": + WriteToFileF32(filename); + break; + + case "f64": + WriteToFileF64(filename); + break; + + case "grdmap": + if (args.Length >= 4) + WriteImage(filename, args[3]); + else + WriteImage(filename, "defaultstripe.png"); + break; + + case "png": + heightmap.SaveImage(filename); + break; + + case "raw": + WriteToFileRAW(filename); + break; + + case "hiraw": + WriteToFileHiRAW(filename); + break; + + default: + resultText = "Unknown image or data format"; + return false; + } + break; + + case "csfilter": + customFilters.LoadFilterCSharp(args[1]); + break; + case "jsfilter": + customFilters.LoadFilterJScript(args[1]); + break; + + default: + // Run any custom registered filters + if (customFilters.filters.ContainsKey(command)) + { + customFilters.filters[command].Filter(heightmap, args); + break; + } + else + { + resultText = "Unknown terrain command"; + return false; + } + } + return true; + } + catch (Exception e) // SEMI-LEGIT: Catching problems caused by user input or scripts + { + resultText = "Error running terrain command: " + e.ToString(); + return false; + } + } + + private bool ConsoleErosion(string[] args, ref string resultText) + { + double min = heightmap.FindMin(); + double max = heightmap.FindMax(); + + switch (args[1].ToLower()) + { + case "aerobic": + // WindSpeed, PickupMinimum,DropMinimum,Carry,Rounds,Lowest + heightmap.AerobicErosion(Convert.ToDouble(args[2]), Convert.ToDouble(args[3]), + Convert.ToDouble(args[4]), Convert.ToDouble(args[5]), + Convert.ToInt32(args[6]), Convert.ToBoolean(args[7]), + Convert.ToBoolean(args[8])); + break; + case "thermal": + heightmap.ThermalWeathering(Convert.ToDouble(args[2]), Convert.ToInt32(args[3]), + Convert.ToDouble(args[4])); + break; + case "hydraulic": + Channel rainMap = new Channel(w, h); + rainMap.Fill(Convert.ToDouble(args[2])); + heightmap.HydraulicErosion(rainMap, Convert.ToDouble(args[3]), Convert.ToDouble(args[4]), + Convert.ToInt32(args[5]), Convert.ToInt32(args[6])); + break; + default: + resultText = "Unknown erosion type"; + return false; + } + + heightmap.Normalise(min, max); + + tainted++; + return true; + } + + private bool ConsoleHills(string[] args, ref string resultText) + { + Random RandomClass = new Random(); + SetSeed(RandomClass.Next()); + int count; + double sizeMin; + double sizeRange; + bool island; + bool additive; + bool noisy; + + if (args.GetLength(0) > 2) + { + int.TryParse(args[2].ToString(), out count); + double.TryParse(args[3].ToString(), NumberStyles.AllowDecimalPoint, Culture.NumberFormatInfo, + out sizeMin); + double.TryParse(args[4].ToString(), NumberStyles.AllowDecimalPoint, Culture.NumberFormatInfo, + out sizeRange); + bool.TryParse(args[5].ToString(), out island); + bool.TryParse(args[6].ToString(), out additive); + bool.TryParse(args[7].ToString(), out noisy); + } + else + { + count = 200; + sizeMin = 20; + sizeRange = 40; + island = true; + additive = true; + noisy = false; + } + + switch (args[1].ToLower()) + { + case "blocks": + heightmap.HillsBlocks(count, sizeMin, sizeRange, island, additive, noisy); + break; + case "cones": + heightmap.HillsCones(count, sizeMin, sizeRange, island, additive, noisy); + break; + case "spheres": + heightmap.HillsSpheres(count, sizeMin, sizeRange, island, additive, noisy); + break; + case "squared": + heightmap.HillsSquared(count, sizeMin, sizeRange, island, additive, noisy); + break; + default: + resultText = "Unknown hills type"; + return false; + } + tainted++; + return true; + } + + /// + /// Renormalises the array between min and max + /// + /// Minimum value of the new array + /// Maximum value of the new array + public void SetRange(float min, float max) + { + heightmap.Normalise((double) min, (double) max); + tainted++; + } + + /// + /// Adds meters (positive or negative) to terrain height + /// + /// Positive or negative value to add to new array + public void Elevate(float meters) + { + heightmap.Elevate((double)meters); + tainted++; + } + + /// + /// Loads a file consisting of 256x256 doubles and imports it as an array into the map. + /// + /// TODO: Move this to libTerrain itself + /// The filename of the double array to import + public void LoadFromFileF64(string filename) + { + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.Open, FileAccess.Read); + BinaryReader bs = new BinaryReader(s); + int x, y; + for (y = 0; y < h; y++) + { + for (x = 0; x < h; x++) + { + heightmap.Set(x, y, (double) bs.ReadSingle()); + } + } + + bs.Close(); + s.Close(); + + tainted++; + } + + /// + /// Loads a file consisting of 256x256 floats and imports it as an array into the map. + /// + /// TODO: Move this to libTerrain itself + /// The filename of the float array to import + public void LoadFromFileF32(string filename) + { + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.Open, FileAccess.Read); + BinaryReader bs = new BinaryReader(s); + int x, y; + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + heightmap.Set(x, y, (double) bs.ReadSingle()); + } + } + + bs.Close(); + s.Close(); + + tainted++; + } + + /// + /// Loads a section of a larger heightmap (F32) + /// + /// File to load + /// Size of the file + /// Size of the file + /// Where do the region coords start for this terrain? + /// Where do the region coords start for this terrain? + public void LoadFromFileF32(string filename, int dimensionX, int dimensionY, int lowerboundX, int lowerboundY) + { + fileIOLock.WaitOne(); + try + { + int sectionToLoadX = ((offsetX - lowerboundX)*w); + int sectionToLoadY = ((offsetY - lowerboundY)*h); + + double[,] tempMap = new double[dimensionX,dimensionY]; + + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.Open, FileAccess.Read); + BinaryReader bs = new BinaryReader(s); + + int x, y; + for (x = 0; x < dimensionX; x++) + { + for (y = 0; y < dimensionY; y++) + { + tempMap[x, y] = (double) bs.ReadSingle(); + } + } + + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + heightmap.Set(x, y, tempMap[x + sectionToLoadX, y + sectionToLoadY]); + } + } + + bs.Close(); + s.Close(); + + tainted++; + } + finally + { + fileIOLock.ReleaseMutex(); + } + } + + /// + /// Loads a larger tiled image across a terrain + /// + /// Filename to load from (any generic image format should work) + /// The dimensions of the image + /// The dimensions of the image + /// Where sim coords begin for this patch + /// Where sim coords begin for this patch + public void LoadFromFileIMG(string filename, int dimensionX, int dimensionY, int lowerboundX, int lowerboundY) + { + int sectionToLoadX = ((offsetX - lowerboundX)*w); + int sectionToLoadY = ((offsetY - lowerboundY)*h); + + double[,] tempMap = new double[dimensionX,dimensionY]; + + Bitmap lgrBmp = new Bitmap(filename); + + int x, y; + for (x = 0; x < dimensionX; x++) + { + for (y = 0; y < dimensionY; y++) + { + tempMap[x, y] = (float) lgrBmp.GetPixel(x, y).GetBrightness(); + } + } + + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + heightmap.Set(x, y, tempMap[x + sectionToLoadX, y + sectionToLoadY]); + } + } + + tainted++; + } + + /// + /// Loads a file formatted in the SL .RAW Format used on the main grid + /// + /// This file format stinks and is best avoided. + /// A path to the .RAW format + public void LoadFromFileSLRAW(string filename) + { + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.Open, FileAccess.Read); + BinaryReader bs = new BinaryReader(s); + int x, y; + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + heightmap.Set(x, y, (double) bs.ReadByte()*((double) bs.ReadByte()/127.0)); + bs.ReadBytes(11); // Advance the stream to next bytes. + } + } + + bs.Close(); + s.Close(); + + tainted++; + } + + /// + /// Loads a section of a larger heightmap (RAW) + /// + /// File to load + /// Size of the file + /// Size of the file + /// Where do the region coords start for this terrain? + /// Where do the region coords start for this terrain? + public void LoadFromFileSLRAW(string filename, int dimensionX, int dimensionY, int lowerboundX, int lowerboundY) + { + // TODO: Mutex fails to release readlock on folder! --> only one file can be loaded into sim + //fileIOLock.WaitOne(); + //try + //{ + int sectionToLoadX = ((offsetX - lowerboundX)*w); + int sectionToLoadY = ((offsetY - lowerboundY)*h); + + double[,] tempMap = new double[dimensionX,dimensionY]; + + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.Open, FileAccess.Read); + BinaryReader bs = new BinaryReader(s); + + int x, y; + for (x = 0; x < dimensionX; x++) + { + for (y = 0; y < dimensionY; y++) + { + tempMap[x, y] = (double) bs.ReadByte()*((double) bs.ReadByte()/127.0); + bs.ReadBytes(11); // Advance the stream to next bytes. + } + } + + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + heightmap.Set(x, y, tempMap[x + sectionToLoadX, y + sectionToLoadY]); + } + } + + bs.Close(); + s.Close(); + + tainted++; + //} + //finally + //{ + // fileIOLock.ReleaseMutex(); + //} + } + + /// + /// Writes the current terrain heightmap to disk, in the format of a 65536 entry double[] array. + /// + /// The desired output filename + public void WriteToFileF64(string filename) + { + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write); + BinaryWriter bs = new BinaryWriter(s); + + int x, y; + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + bs.Write(heightmap.Get(x, y)); + } + } + + bs.Close(); + s.Close(); + } + + /// + /// Writes the current terrain heightmap to disk, in the format of a 65536 entry float[] array + /// + /// The desired output filename + public void WriteToFileF32(string filename) + { + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write); + BinaryWriter bs = new BinaryWriter(s); + + int x, y; + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + bs.Write((float) heightmap.Get(x, y)); + } + } + + bs.Close(); + s.Close(); + } + + /// + /// A very fast LL-RAW file output mechanism - lower precision mechanism but wont take 5 minutes to run either. + /// (is also editable in an image application) + /// + /// Filename to write to + public void WriteToFileRAW(string filename) + { + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write); + BinaryWriter binStream = new BinaryWriter(s); + + int x, y; + + // Used for the 'green' channel. + byte avgMultiplier = (byte) heightmap.Avg(); + byte backupMultiplier = (byte) revertmap.Avg(); + + // Limit the multiplier so it can represent points >64m. + if (avgMultiplier > 196) + avgMultiplier = 196; + if (backupMultiplier > 196) + backupMultiplier = 196; + // Make sure it's at least one to prevent a div by zero + if (avgMultiplier < 1) + avgMultiplier = 1; + if (backupMultiplier < 1) + backupMultiplier = 1; + + for (y = 0; y < h; y++) + { + for (x = 0; x < h; x++) + { + byte red = (byte) (heightmap.Get(x, y)/((double) avgMultiplier/128.0)); + byte green = avgMultiplier; + byte blue = (byte) watermap.Get(x, y); + byte alpha1 = 0; // Land Parcels + byte alpha2 = 0; // For Sale Land + byte alpha3 = 0; // Public Edit Object + byte alpha4 = 0; // Public Edit Land + byte alpha5 = 255; // Safe Land + byte alpha6 = 255; // Flying Allowed + byte alpha7 = 255; // Create Landmark + byte alpha8 = 255; // Outside Scripts + byte alpha9 = (byte) (revertmap.Get(x, y)/((double) backupMultiplier/128.0)); + byte alpha10 = backupMultiplier; + + binStream.Write(red); + binStream.Write(green); + binStream.Write(blue); + binStream.Write(alpha1); + binStream.Write(alpha2); + binStream.Write(alpha3); + binStream.Write(alpha4); + binStream.Write(alpha5); + binStream.Write(alpha6); + binStream.Write(alpha7); + binStream.Write(alpha8); + binStream.Write(alpha9); + binStream.Write(alpha10); + } + } + binStream.Close(); + s.Close(); + } + + /// + /// Outputs to a LL compatible RAW in the most efficient manner possible + /// + /// Does not calculate the revert map + /// The filename to output to + public void WriteToFileHiRAW(string filename) + { + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write); + BinaryWriter binStream = new BinaryWriter(s); + + // Generate a smegging big lookup table to speed the operation up (it needs it) + double[] lookupHeightTable = new double[65536]; + int i, j, x, y; + for (i = 0; i < 256; i++) + { + for (j = 0; j < 256; j++) + { + lookupHeightTable[i + (j*256)] = ((double) i*((double) j/127.0)); + } + } + + // Output the calculated raw + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + double t = heightmap.Get(x, y); + double min = double.MaxValue; + int index = 0; + + for (i = 0; i < 65536; i++) + { + if (Math.Abs(t - lookupHeightTable[i]) < min) + { + min = Math.Abs(t - lookupHeightTable[i]); + index = i; + } + } + + byte red = (byte) (index & 0xFF); + byte green = (byte) ((index >> 8) & 0xFF); + byte blue = (byte) watermap.Get(x, y); + byte alpha1 = 0; // Land Parcels + byte alpha2 = 0; // For Sale Land + byte alpha3 = 0; // Public Edit Object + byte alpha4 = 0; // Public Edit Land + byte alpha5 = 255; // Safe Land + byte alpha6 = 255; // Flying Allowed + byte alpha7 = 255; // Create Landmark + byte alpha8 = 255; // Outside Scripts + byte alpha9 = red; + byte alpha10 = green; + + binStream.Write(red); + binStream.Write(green); + binStream.Write(blue); + binStream.Write(alpha1); + binStream.Write(alpha2); + binStream.Write(alpha3); + binStream.Write(alpha4); + binStream.Write(alpha5); + binStream.Write(alpha6); + binStream.Write(alpha7); + binStream.Write(alpha8); + binStream.Write(alpha9); + binStream.Write(alpha10); + } + } + + binStream.Close(); + s.Close(); + } + + /// + /// Sets the random seed to be used by procedural functions which involve random numbers. + /// + /// The desired seed + public void SetSeed(int val) + { + heightmap.seed = val; + } + + /// + /// Sets a particular heightmap point to a specified value + /// + /// X Coordinate + /// Y Coordinate + /// Value + public void Set(int x, int y, double val) + { + lock (heightmap) + { + heightmap.Set(x, y, val); + } + tainted++; + } + + /// + /// Raises land in a sphere around the specified coordinates + /// + /// Center of the sphere on the X axis + /// Center of the sphere on the Y axis + /// The radius of the sphere + /// Scale the height of the sphere by this amount (recommended 0..2) + public void RaiseTerrain(double rx, double ry, double size, double amount) + { + lock (heightmap) + { + heightmap.Raise(rx, ry, size, amount); + } + + tainted++; + } + + /// + /// Lowers the land in a sphere around the specified coordinates + /// + /// The center of the sphere at the X axis + /// The center of the sphere at the Y axis + /// The radius of the sphere in meters + /// Scale the height of the sphere by this amount (recommended 0..2) + public void LowerTerrain(double rx, double ry, double size, double amount) + { + lock (heightmap) + { + heightmap.Lower(rx, ry, size, amount); + } + + tainted++; + } + + /// + /// Flattens the land under the brush of specified coordinates (spherical mask) + /// + /// Center of sphere + /// Center of sphere + /// Radius of the sphere + /// Thickness of the mask (0..2 recommended) + public void FlattenTerrain(double rx, double ry, double size, double amount) + { + lock (heightmap) + { + heightmap.Flatten(rx, ry, size, amount); + } + + tainted++; + } + + /// + /// Creates noise within the specified bounds + /// + /// Center of the bounding sphere + /// Center of the bounding sphere + /// The radius of the sphere + /// Strength of the mask (0..2) recommended + public void NoiseTerrain(double rx, double ry, double size, double amount) + { + lock (heightmap) + { + Channel smoothed = new Channel(); + smoothed.Noise(); + + Channel mask = new Channel(); + mask.Raise(rx, ry, size, amount); + + heightmap.Blend(smoothed, mask); + } + + tainted++; + } + + /// + /// Reverts land within the specified bounds + /// + /// Center of the bounding sphere + /// Center of the bounding sphere + /// The radius of the sphere + /// Strength of the mask (0..2) recommended + public void RevertTerrain(double rx, double ry, double size, double amount) + { + lock (heightmap) + { + Channel mask = new Channel(); + mask.Raise(rx, ry, size, amount); + + heightmap.Blend(revertmap, mask); + } + + tainted++; + } + + /// + /// Smooths land under the brush of specified coordinates (spherical mask) + /// + /// Center of the sphere + /// Center of the sphere + /// Radius of the sphere + /// Thickness of the mask (0..2 recommended) + public void SmoothTerrain(double rx, double ry, double size, double amount) + { + lock (heightmap) + { + Channel smoothed = heightmap.Copy(); + smoothed.Smooth(amount); + + Channel mask = new Channel(); + mask.Raise(rx, ry, size, amount); + + heightmap.Blend(smoothed, mask); + } + + tainted++; + } + + /// + /// Generates a simple set of hills in the shape of an island + /// + public void SetDefaultTerrain() + { + lock (heightmap) + { + heightmap.HillsSpheres(200, 20, 40, true, true, false); + heightmap.Normalise(); + heightmap *= 60.0; // Raise to 60m + heightmap.Clip(0.0, 25.0); + heightmap.Pertubation(2.5); + heightmap.Smooth(35.0); + heightmap.Normalise(0.0, 21.0); + } + + tainted++; + } + + /// + /// Wrapper to heightmap.get() + /// + /// X coord + /// Y coord + /// Height at specified coordinates + public double GetHeight(int x, int y) + { + return heightmap.Get(x, y); + } + + /// + /// Multiplies the heightfield by val + /// + /// The heightfield + /// The multiplier + /// + public static TerrainEngine operator *(TerrainEngine terrain, Double val) + { + terrain.heightmap *= val; + terrain.tainted++; + return terrain; + } + + /// + /// Exports the current heightmap to a PNG file + /// + /// The destination filename for the image + /// A 1x*height* image which contains the colour gradient to export with. Must be at least 1x2 pixels, 1x256 or more is ideal. + public void WriteImage(string filename, string gradientmap) + { + try + { + Bitmap bmp = TerrainToBitmap(gradientmap); + + bmp.Save(filename, ImageFormat.Png); + } + catch (Exception e) // LEGIT: Catching problems caused by OpenJPEG p/invoke + { + Console.WriteLine("Failed generating terrain map: " + e.ToString()); + } + } + + /// + /// Exports the current heightmap in Jpeg2000 format to a byte[] + /// + /// A 1x*height* image which contains the colour gradient to export with. Must be at least 1x2 pixels, 1x256 or more is ideal. + public byte[] WriteJpegImage(string gradientmap) + { + byte[] imageData = null; + try + { + Bitmap bmp = TerrainToBitmap(gradientmap); + + imageData = OpenJPEG.EncodeFromImage(bmp, true); + } + catch (Exception e) // LEGIT: Catching problems caused by OpenJPEG p/invoke + { + Console.WriteLine("Failed generating terrain map: " + e.ToString()); + } + + return imageData; + } + + private Bitmap TerrainToBitmap(string gradientmap) + { + Bitmap gradientmapLd = new Bitmap(gradientmap); + + int pallete = gradientmapLd.Height; + + Bitmap bmp = new Bitmap(heightmap.w, heightmap.h); + Color[] colours = new Color[pallete]; + + for (int i = 0; i < pallete; i++) + { + colours[i] = gradientmapLd.GetPixel(0, i); + } + + Channel copy = heightmap.Copy(); + for (int y = 0; y < copy.h; y++) + { + for (int x = 0; x < copy.w; x++) + { + // 512 is the largest possible height before colours clamp + int colorindex = (int) (Math.Max(Math.Min(1.0, copy.Get(x, y)/512.0), 0.0)*(pallete - 1)); + bmp.SetPixel(x, copy.h - y - 1, colours[colorindex]); + } + } + return bmp; + } + } +} diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs index 15979aefbd..a6f2de784e 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs @@ -1,146 +1,144 @@ -/* -* Copyright (c) Contributors, http://opensimulator.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ - - -using System; - -namespace libTerrain -{ - partial class Channel - { - /// - /// Flattens the area underneath rx,ry by moving it to the average of the area. Uses a spherical mask provided by the raise() function. - /// - /// The X coordinate of the terrain mask - /// The Y coordinate of the terrain mask - /// The size of the terrain mask - /// The scale of the terrain mask - public void Flatten(double rx, double ry, double size, double amount) - { - FlattenSlow(rx, ry, size, amount); - } - - private void FlattenSlow(double rx, double ry, double size, double amount) - { - // Generate the mask - Channel temp = new Channel(w, h); - temp.Fill(0); - temp.Raise(rx, ry, size, amount); - temp.Normalise(); - double total_mod = temp.Sum(); - - // Establish the average height under the area - Channel newmap = new Channel(w, h); - newmap.map = (double[,]) map.Clone(); - - newmap *= temp; - - double total_terrain = newmap.Sum(); - double avg_height = total_terrain/total_mod; - - // Create a flat terrain using the average height - Channel flat = new Channel(w, h); - flat.Fill(avg_height); - - // Blend the current terrain with the average height terrain - // using the "raised" empty terrain as a mask - Blend(flat, temp); - } - - private void FlattenFast(double rx, double ry, double size, double amount) - { - int x, y; - double avg = 0; - double div = 0; - - int minX = Math.Max(0, (int) (rx - (size + 1))); - int maxX = Math.Min(w, (int) (rx + (size + 1))); - int minY = Math.Max(0, (int) (ry - (size + 1))); - int maxY = Math.Min(h, (int) (ry + (size + 1))); - - for (x = minX; x < maxX; x++) - { - for (y = minY; y < maxY; y++) - { - double z = size; - z *= z; - z -= ((x - rx)*(x - rx)) + ((y - ry)*(y - ry)); - - if (z < 0) - z = 0; - - avg += z*amount; - div += z; - } - } - - double height = avg/div; - - for (x = minX; x < maxX; x++) - { - for (y = minY; y < maxY; y++) - { - double z = size; - z *= z; - z -= ((x - rx)*(x - rx)) + ((y - ry)*(y - ry)); - - if (z < 0) - z = 0; - - Set(x, y, Tools.LinearInterpolate(map[x, y], height, z)); - } - } - } - - public void Flatten(Channel mask, double amount) - { - // Generate the mask - Channel temp = mask*amount; - temp.Clip(0, 1); // Cut off out-of-bounds values - - double total_mod = temp.Sum(); - - // Establish the average height under the area - Channel map = new Channel(w, h); - map.map = (double[,]) this.map.Clone(); - - map *= temp; - - double total_terrain = map.Sum(); - double avg_height = total_terrain/total_mod; - - // Create a flat terrain using the average height - Channel flat = new Channel(w, h); - flat.Fill(avg_height); - - // Blend the current terrain with the average height terrain - // using the "raised" empty terrain as a mask - Blend(flat, temp); - } - } -} \ No newline at end of file +/* +* Copyright (c) Contributors, http://opensimulator.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + + +using System; + +namespace libTerrain +{ + partial class Channel + { + /// + /// Flattens the area underneath rx,ry by moving it to the average of the area. Uses a spherical mask provided by the raise() function. + /// + /// The X coordinate of the terrain mask + /// The Y coordinate of the terrain mask + /// The size of the terrain mask + /// The scale of the terrain mask + public void Flatten(double rx, double ry, double size, double amount) + { + FlattenSlow(rx, ry, size, amount); + } + + private void FlattenSlow(double rx, double ry, double size, double amount) + { + // Generate the mask + Channel temp = new Channel(w, h); + temp.Fill(0); + temp.Raise(rx, ry, size, amount); + temp.Normalise(); + double total_mod = temp.Sum(); + + // Establish the average height under the area + Channel newmap = new Channel(w, h); + newmap.map = (double[,]) map.Clone(); + + newmap *= temp; + + double total_terrain = newmap.Sum(); + double avg_height = total_terrain/total_mod; + + // Create a flat terrain using the average height + Channel flat = new Channel(w, h); + flat.Fill(avg_height); + + // Blend the current terrain with the average height terrain + // using the "raised" empty terrain as a mask + Blend(flat, temp); + } + + private void FlattenFast(double rx, double ry, double size, double amount) + { + int x, y; + double avg = 0; + double div = 0; + + int minX = Math.Max(0, (int) (rx - (size + 1))); + int maxX = Math.Min(w, (int) (rx + (size + 1))); + int minY = Math.Max(0, (int) (ry - (size + 1))); + int maxY = Math.Min(h, (int) (ry + (size + 1))); + + for (x = minX; x < maxX; x++) + { + for (y = minY; y < maxY; y++) + { + double z = size; + z *= z; + z -= ((x - rx)*(x - rx)) + ((y - ry)*(y - ry)); + + if (z < 0) + z = 0; + + avg += z*amount; + div += z; + } + } + + double height = avg/div; + + for (x = minX; x < maxX; x++) + { + for (y = minY; y < maxY; y++) + { + double z = size; + z *= z; + z -= ((x - rx)*(x - rx)) + ((y - ry)*(y - ry)); + + if (z > 0.0) + Set(x, y, Tools.LinearInterpolate(map[x, y], height, z)); + } + } + } + + public void Flatten(Channel mask, double amount) + { + // Generate the mask + Channel temp = mask*amount; + temp.Clip(0, 1); // Cut off out-of-bounds values + + double total_mod = temp.Sum(); + + // Establish the average height under the area + Channel map = new Channel(w, h); + map.map = (double[,]) this.map.Clone(); + + map *= temp; + + double total_terrain = map.Sum(); + double avg_height = total_terrain/total_mod; + + // Create a flat terrain using the average height + Channel flat = new Channel(w, h); + flat.Fill(avg_height); + + // Blend the current terrain with the average height terrain + // using the "raised" empty terrain as a mask + Blend(flat, temp); + } + } +} diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Raise.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Raise.cs index b9a0095122..d1696afa73 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Raise.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Raise.cs @@ -1,137 +1,131 @@ -/* -* Copyright (c) Contributors, http://opensimulator.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ - - -using System; - -namespace libTerrain -{ - partial class Channel - { - /// - /// Raises land around the selection - /// - /// The center the X coordinate of where you wish to raise the land - /// The center the Y coordinate of where you wish to raise the land - /// The radius of the dimple - /// How much impact to add to the terrain (0..2 usually) - public void Raise(double rx, double ry, double size, double amount) - { - RaiseSphere(rx, ry, size, amount); - } - - /// - /// Raises land in a sphere around the selection - /// - /// The center the X coordinate of where you wish to raise the land - /// The center the Y coordinate of where you wish to raise the land - /// The radius of the sphere dimple - /// How much impact to add to the terrain (0..2 usually) - public void RaiseSphere(double rx, double ry, double size, double amount) - { - int x, y; - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - double z = size; - z *= z; - z -= ((x - rx)*(x - rx)) + ((y - ry)*(y - ry)); - - if (z < 0) - z = 0; - - Set(x, y, map[x, y] + (z*amount)); - } - } - } - - /// - /// Raises land in a cone around the selection - /// - /// The center the X coordinate of where you wish to raise the land - /// The center the Y coordinate of where you wish to raise the land - /// The radius of the cone - /// How much impact to add to the terrain (0..2 usually) - public void RaiseCone(double rx, double ry, double size, double amount) - { - int x, y; - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - double z = size; - z -= Math.Sqrt(((x - rx)*(x - rx)) + ((y - ry)*(y - ry))); - - if (z < 0) - z = 0; - - Set(x, y, map[x, y] + (z*amount)); - } - } - } - - /// - /// Lowers land in a sphere around the selection - /// - /// The center the X coordinate of where you wish to lower the land - /// The center the Y coordinate of where you wish to lower the land - /// The radius of the sphere dimple - /// How much impact to remove from the terrain (0..2 usually) - public void Lower(double rx, double ry, double size, double amount) - { - LowerSphere(rx, ry, size, amount); - } - - /// - /// Lowers land in a sphere around the selection - /// - /// The center the X coordinate of where you wish to lower the land - /// The center the Y coordinate of where you wish to lower the land - /// The radius of the sphere dimple - /// How much impact to remove from the terrain (0..2 usually) - public void LowerSphere(double rx, double ry, double size, double amount) - { - int x, y; - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - double z = size; - z *= z; - z -= ((x - rx)*(x - rx)) + ((y - ry)*(y - ry)); - - if (z < 0) - z = 0; - - Set(x, y, map[x, y] - (z*amount)); - } - } - } - } -} \ No newline at end of file +/* +* Copyright (c) Contributors, http://opensimulator.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + + +using System; + +namespace libTerrain +{ + partial class Channel + { + /// + /// Raises land around the selection + /// + /// The center the X coordinate of where you wish to raise the land + /// The center the Y coordinate of where you wish to raise the land + /// The radius of the dimple + /// How much impact to add to the terrain (0..2 usually) + public void Raise(double rx, double ry, double size, double amount) + { + RaiseSphere(rx, ry, size, amount); + } + + /// + /// Raises land in a sphere around the selection + /// + /// The center the X coordinate of where you wish to raise the land + /// The center the Y coordinate of where you wish to raise the land + /// The radius of the sphere dimple + /// How much impact to add to the terrain (0..2 usually) + public void RaiseSphere(double rx, double ry, double size, double amount) + { + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + double z = size; + z *= z; + z -= ((x - rx)*(x - rx)) + ((y - ry)*(y - ry)); + + if (z > 0.0) + Set(x, y, map[x, y] + (z * amount)); + } + } + } + + /// + /// Raises land in a cone around the selection + /// + /// The center the X coordinate of where you wish to raise the land + /// The center the Y coordinate of where you wish to raise the land + /// The radius of the cone + /// How much impact to add to the terrain (0..2 usually) + public void RaiseCone(double rx, double ry, double size, double amount) + { + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + double z = size; + z -= Math.Sqrt(((x - rx)*(x - rx)) + ((y - ry)*(y - ry))); + + if (z > 0.0) + Set(x, y, map[x, y] + (z * amount)); + } + } + } + + /// + /// Lowers land in a sphere around the selection + /// + /// The center the X coordinate of where you wish to lower the land + /// The center the Y coordinate of where you wish to lower the land + /// The radius of the sphere dimple + /// How much impact to remove from the terrain (0..2 usually) + public void Lower(double rx, double ry, double size, double amount) + { + LowerSphere(rx, ry, size, amount); + } + + /// + /// Lowers land in a sphere around the selection + /// + /// The center the X coordinate of where you wish to lower the land + /// The center the Y coordinate of where you wish to lower the land + /// The radius of the sphere dimple + /// How much impact to remove from the terrain (0..2 usually) + public void LowerSphere(double rx, double ry, double size, double amount) + { + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + double z = size; + z *= z; + z -= ((x - rx)*(x - rx)) + ((y - ry)*(y - ry)); + + if (z > 0.0) + Set(x, y, map[x, y] - (z * amount)); + } + } + } + } +} diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Cellular.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Cellular.cs index e33b6c00b6..1b85938a8d 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Cellular.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Cellular.cs @@ -1,29 +1,29 @@ -/* -* Copyright (c) Contributors, http://opensimulator.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ - -/* Needs BSD rewrite */ +/* +* Copyright (c) Contributors, http://opensimulator.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +/* Needs BSD rewrite */ diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Midpoint.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Midpoint.cs index e33b6c00b6..1b85938a8d 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Midpoint.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Midpoint.cs @@ -1,29 +1,29 @@ -/* -* Copyright (c) Contributors, http://opensimulator.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ - -/* Needs BSD rewrite */ +/* +* Copyright (c) Contributors, http://opensimulator.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +/* Needs BSD rewrite */ diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Mountain.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Mountain.cs index e33b6c00b6..1b85938a8d 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Mountain.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Mountain.cs @@ -1,29 +1,29 @@ -/* -* Copyright (c) Contributors, http://opensimulator.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ - -/* Needs BSD rewrite */ +/* +* Copyright (c) Contributors, http://opensimulator.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +/* Needs BSD rewrite */ diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Grid.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Grid.cs index 900b06a29f..01482a2e9f 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Grid.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Grid.cs @@ -1,359 +1,377 @@ -/* -* Copyright (c) Contributors, http://opensimulator.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ - -using System; - -namespace libTerrain -{ - partial class Channel - { - public Channel Normalise() - { - SetDiff(); - - double max = FindMax(); - double min = FindMin(); - - int x, y; - - if (max != min) - { - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - map[x, y] = (map[x, y] - min)*(1.0/(max - min)); - } - } - } - else - { - Fill(0.5); - } - - return this; - } - - public Channel Normalise(double minv, double maxv) - { - SetDiff(); - - if (minv == maxv) - { - Fill(minv); - return this; - } - - double max = FindMax(); - double min = FindMin(); - - int x, y; - - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - if (min != max) - { - double val = (map[x, y] - min)*(1.0/(max - min)); - val *= maxv - minv; - val += minv; - - map[x, y] = val; - } - else - { - map[x, y] = 0.5; - } - } - } - - return this; - } - - public Channel Clip() - { - int x, y; - - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - SetClip(x, y, map[x, y]); - } - } - - return this; - } - - public Channel Clip(double min, double max) - { - int x, y; - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - double val = map[x, y]; - if (val > max) val = max; - if (val < min) val = min; - - Set(x, y, val); - } - } - return this; - } - - public Channel Crop(int x1, int y1, int x2, int y2) - { - int width = x1 - x2 + 1; - int height = y1 - y2 + 1; - Channel chan = new Channel(width, height); - - int x, y; - int nx, ny; - - nx = 0; - for (x = x1; x < x2; x++) - { - ny = 0; - for (y = y1; y < y2; y++) - { - chan.map[nx, ny] = map[x, y]; - - ny++; - } - nx++; - } - - return this; - } - - public Channel AddClip(Channel other) - { - SetDiff(); - - int x, y; - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - map[x, y] = other.map[x, y]; - if (map[x, y] > 1) - map[x, y] = 1; - if (map[x, y] < 0) - map[x, y] = 0; - } - } - return this; - } - - public void Smooth(double amount) - { - SetDiff(); - - double area = amount; - double step = amount/4.0; - - double[,] manipulate = new double[w,h]; - int x, y; - double n, l; - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - double average = 0.0; - int avgsteps = 0; - - for (n = 0.0 - area; n < area; n += step) - { - for (l = 0.0 - area; l < area; l += step) - { - avgsteps++; - average += GetBilinearInterpolate(x + n, y + l); - } - } - - manipulate[x, y] = average/avgsteps; - } - } - map = manipulate; - } - - public void Pertubation(double amount) - { - SetDiff(); - - // Simple pertubation filter - double[,] manipulated = new double[w,h]; - Random generator = new Random(seed); // Seeds FTW! - //double amount = 8.0; - - int x, y; - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - double offset_x = (double) x + (generator.NextDouble()*amount) - (amount/2.0); - double offset_y = (double) y + (generator.NextDouble()*amount) - (amount/2.0); - double p = GetBilinearInterpolate(offset_x, offset_y); - manipulated[x, y] = p; - } - } - map = manipulated; - } - - public void PertubationMask(Channel mask) - { - // Simple pertubation filter - double[,] manipulated = new double[w,h]; - Random generator = new Random(seed); // Seeds FTW! - //double amount = 8.0; - - double amount; - - int x, y; - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - amount = mask.map[x, y]; - double offset_x = (double) x + (generator.NextDouble()*amount) - (amount/2.0); - double offset_y = (double) y + (generator.NextDouble()*amount) - (amount/2.0); - - if (offset_x > w) - offset_x = w - 1; - if (offset_y > h) - offset_y = h - 1; - if (offset_y < 0) - offset_y = 0; - if (offset_x < 0) - offset_x = 0; - - double p = GetBilinearInterpolate(offset_x, offset_y); - manipulated[x, y] = p; - SetDiff(x, y); - } - } - map = manipulated; - } - - public void Distort(Channel mask, double str) - { - // Simple pertubation filter - double[,] manipulated = new double[w,h]; - - double amount; - - int x, y; - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - amount = mask.map[x, y]; - double offset_x = (double) x + (amount*str) - (0.5*str); - double offset_y = (double) y + (amount*str) - (0.5*str); - - if (offset_x > w) - offset_x = w - 1; - if (offset_y > h) - offset_y = h - 1; - if (offset_y < 0) - offset_y = 0; - if (offset_x < 0) - offset_x = 0; - - double p = GetBilinearInterpolate(offset_x, offset_y); - manipulated[x, y] = p; - SetDiff(x, y); - } - } - map = manipulated; - } - - public void Distort(Channel mask, Channel mask2, double str) - { - // Simple pertubation filter - double[,] manipulated = new double[w,h]; - - double amountX; - double amountY; - - int x, y; - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - amountX = mask.map[x, y]; - amountY = mask2.map[x, y]; - double offset_x = (double) x + (amountX*str) - (0.5*str); - double offset_y = (double) y + (amountY*str) - (0.5*str); - - if (offset_x > w) - offset_x = w - 1; - if (offset_y > h) - offset_y = h - 1; - if (offset_y < 0) - offset_y = 0; - if (offset_x < 0) - offset_x = 0; - - double p = GetBilinearInterpolate(offset_x, offset_y); - manipulated[x, y] = p; - SetDiff(x, y); - } - } - map = manipulated; - } - - public Channel Blend(Channel other, double amount) - { - int x, y; - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - Set(x, y, Tools.LinearInterpolate(map[x, y], other.map[x, y], amount)); - } - } - return this; - } - - public Channel Blend(Channel other, Channel amount) - { - int x, y; - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - Set(x, y, Tools.LinearInterpolate(map[x, y], other.map[x, y], amount.map[x, y])); - } - } - return this; - } - } -} \ No newline at end of file +/* +* Copyright (c) Contributors, http://opensimulator.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +using System; + +namespace libTerrain +{ + partial class Channel + { + public Channel Normalise() + { + SetDiff(); + + double max = FindMax(); + double min = FindMin(); + + int x, y; + + if (max != min) + { + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + map[x, y] = (map[x, y] - min)*(1.0/(max - min)); + } + } + } + else + { + Fill(0.5); + } + + return this; + } + + public Channel Normalise(double minv, double maxv) + { + SetDiff(); + + if (minv == maxv) + { + Fill(minv); + return this; + } + + double max = FindMax(); + double min = FindMin(); + + int x, y; + + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + if (min != max) + { + double val = (map[x, y] - min)*(1.0/(max - min)); + val *= maxv - minv; + val += minv; + + map[x, y] = val; + } + else + { + map[x, y] = 0.5; + } + } + } + + return this; + } + + public Channel Elevate(double meters) + { + SetDiff(); + + int x, y; + + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + map[x, y] += meters; + } + } + + return this; + } + + + public Channel Clip() + { + int x, y; + + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + SetClip(x, y, map[x, y]); + } + } + + return this; + } + + public Channel Clip(double min, double max) + { + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + double val = map[x, y]; + if (val > max) val = max; + if (val < min) val = min; + + Set(x, y, val); + } + } + return this; + } + + public Channel Crop(int x1, int y1, int x2, int y2) + { + int width = x1 - x2 + 1; + int height = y1 - y2 + 1; + Channel chan = new Channel(width, height); + + int x, y; + int nx, ny; + + nx = 0; + for (x = x1; x < x2; x++) + { + ny = 0; + for (y = y1; y < y2; y++) + { + chan.map[nx, ny] = map[x, y]; + + ny++; + } + nx++; + } + + return this; + } + + public Channel AddClip(Channel other) + { + SetDiff(); + + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + map[x, y] = other.map[x, y]; + if (map[x, y] > 1) + map[x, y] = 1; + if (map[x, y] < 0) + map[x, y] = 0; + } + } + return this; + } + + public void Smooth(double amount) + { + SetDiff(); + + double area = amount; + double step = amount/4.0; + + double[,] manipulate = new double[w,h]; + int x, y; + double n, l; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + double average = 0.0; + int avgsteps = 0; + + for (n = 0.0 - area; n < area; n += step) + { + for (l = 0.0 - area; l < area; l += step) + { + avgsteps++; + average += GetBilinearInterpolate(x + n, y + l); + } + } + + manipulate[x, y] = average/avgsteps; + } + } + map = manipulate; + } + + public void Pertubation(double amount) + { + SetDiff(); + + // Simple pertubation filter + double[,] manipulated = new double[w,h]; + Random generator = new Random(seed); // Seeds FTW! + //double amount = 8.0; + + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + double offset_x = (double) x + (generator.NextDouble()*amount) - (amount/2.0); + double offset_y = (double) y + (generator.NextDouble()*amount) - (amount/2.0); + double p = GetBilinearInterpolate(offset_x, offset_y); + manipulated[x, y] = p; + } + } + map = manipulated; + } + + public void PertubationMask(Channel mask) + { + // Simple pertubation filter + double[,] manipulated = new double[w,h]; + Random generator = new Random(seed); // Seeds FTW! + //double amount = 8.0; + + double amount; + + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + amount = mask.map[x, y]; + double offset_x = (double) x + (generator.NextDouble()*amount) - (amount/2.0); + double offset_y = (double) y + (generator.NextDouble()*amount) - (amount/2.0); + + if (offset_x > w) + offset_x = w - 1; + if (offset_y > h) + offset_y = h - 1; + if (offset_y < 0) + offset_y = 0; + if (offset_x < 0) + offset_x = 0; + + double p = GetBilinearInterpolate(offset_x, offset_y); + manipulated[x, y] = p; + SetDiff(x, y); + } + } + map = manipulated; + } + + public void Distort(Channel mask, double str) + { + // Simple pertubation filter + double[,] manipulated = new double[w,h]; + + double amount; + + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + amount = mask.map[x, y]; + double offset_x = (double) x + (amount*str) - (0.5*str); + double offset_y = (double) y + (amount*str) - (0.5*str); + + if (offset_x > w) + offset_x = w - 1; + if (offset_y > h) + offset_y = h - 1; + if (offset_y < 0) + offset_y = 0; + if (offset_x < 0) + offset_x = 0; + + double p = GetBilinearInterpolate(offset_x, offset_y); + manipulated[x, y] = p; + SetDiff(x, y); + } + } + map = manipulated; + } + + public void Distort(Channel mask, Channel mask2, double str) + { + // Simple pertubation filter + double[,] manipulated = new double[w,h]; + + double amountX; + double amountY; + + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + amountX = mask.map[x, y]; + amountY = mask2.map[x, y]; + double offset_x = (double) x + (amountX*str) - (0.5*str); + double offset_y = (double) y + (amountY*str) - (0.5*str); + + if (offset_x > w) + offset_x = w - 1; + if (offset_y > h) + offset_y = h - 1; + if (offset_y < 0) + offset_y = 0; + if (offset_x < 0) + offset_x = 0; + + double p = GetBilinearInterpolate(offset_x, offset_y); + manipulated[x, y] = p; + SetDiff(x, y); + } + } + map = manipulated; + } + + public Channel Blend(Channel other, double amount) + { + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + Set(x, y, Tools.LinearInterpolate(map[x, y], other.map[x, y], amount)); + } + } + return this; + } + + public Channel Blend(Channel other, Channel amount) + { + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + Set(x, y, Tools.LinearInterpolate(map[x, y], other.map[x, y], amount.map[x, y])); + } + } + return this; + } + } +} diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Tools/Point2D.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Tools/Point2D.cs index f0a9b6b0b9..5897b26e6b 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Tools/Point2D.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Tools/Point2D.cs @@ -1,42 +1,42 @@ -/* -* Copyright (c) Contributors, http://opensimulator.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ - -namespace libTerrain -{ - public class Point2D - { - public double x; - public double y; - - public Point2D(double X, double Y) - { - x = X; - y = Y; - } - } -} \ No newline at end of file +/* +* Copyright (c) Contributors, http://opensimulator.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +namespace libTerrain +{ + public class Point2D + { + public double x; + public double y; + + public Point2D(double X, double Y) + { + x = X; + y = Y; + } + } +} diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Tools/Tools.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Tools/Tools.cs index 6eb4049f1b..8553579af5 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Tools/Tools.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Tools/Tools.cs @@ -1,60 +1,60 @@ -/* -* Copyright (c) Contributors, http://opensimulator.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSim Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ - -using System; - -namespace libTerrain -{ - internal class Tools - { - public static double LinearInterpolate(double a, double b, double amount) - { - return a + ((b - a)*amount); - } - - public static double ExponentialInterpolate(double a, double b, double amount) - { - a = Math.Pow(a, amount); - b = Math.Pow(b - a, 1.0 - amount); - return a + b; - } - - public static int PowerOf2Log2(int n) - { - for (int i = 0; i < 31; i++) - { - if ((n & 1) == 1) - { - return i; - } - n >>= 1; - } - return 0; - } - } -} \ No newline at end of file +/* +* Copyright (c) Contributors, http://opensimulator.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +using System; + +namespace libTerrain +{ + internal class Tools + { + public static double LinearInterpolate(double a, double b, double amount) + { + return a + ((b - a)*amount); + } + + public static double ExponentialInterpolate(double a, double b, double amount) + { + a = Math.Pow(a, amount); + b = Math.Pow(b - a, 1.0 - amount); + return a + b; + } + + public static int PowerOf2Log2(int n) + { + for (int i = 0; i < 31; i++) + { + if ((n & 1) == 1) + { + return i; + } + n >>= 1; + } + return 0; + } + } +}