using System; using System.Collections.Generic; using System.Text; using OpenSim.Terrain.BasicTerrain; namespace OpenSim.Terrain { public class TerrainEngine { /// /// A [normally] 256x256 heightmap /// public float[,] map; /// /// A 256x256 heightmap storing water height values /// public float[,] water; int w, h; /// /// Generate a new TerrainEngine instance and creates a new heightmap /// public TerrainEngine() { w = 256; h = 256; map = new float[w, h]; water = new float[w, h]; } /// /// 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] = map[i / w, i % w]; } return heights; } /// /// Imports a 1D floating point array into the 2D heightmap array /// /// The array to import (must have 65536 members) public void setHeights1D(float[] heights) { int i; for (i = 0; i < w * h; i++) { map[i / w, i % w] = heights[i]; } } /// /// Loads a file consisting of 256x256 doubles and imports it as an array into the map. /// /// The filename of the double array to import public void loadFromFileF64(string filename) { System.IO.FileInfo file = new System.IO.FileInfo(filename); System.IO.FileStream s = file.Open(System.IO.FileMode.Open, System.IO.FileAccess.Read); System.IO.BinaryReader bs = new System.IO.BinaryReader(s); int x, y; for (x = 0; x < w; x++) { for (y = 0; y < h; y++) { map[x, y] = (float)bs.ReadDouble(); } } } /// /// Swaps the references between the height and water buffers to allow you to edit the water heightmap. Remember to swap back when you are done. /// public void swapWaterBuffer() { float[,] temp = map; map = water; water = temp; } /// /// 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 raise(double rx, double ry, double size, double amount) { lock (map) { RaiseLower.raiseSphere(this.map, rx, ry, size, amount); } } /// /// 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 lower(double rx, double ry, double size, double amount) { lock (map) { RaiseLower.lowerSphere(this.map, rx, ry, size, amount); } } /// /// Generates a simple set of hills in the shape of an island /// public void hills() { lock (map) { Hills.hillsSpheres(this.map, 1337, 200, 20, 40, false, true, false); Normalise.normalise(this.map,60); } } } }