From 4b0734c4ad75b93d84c11942531cf2d2e070ba6e Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Tue, 24 Jul 2007 04:53:21 +0000 Subject: * Terrain Fracture Generator now produces more appropriate results. * Terrain Flatten Brush has been optimised, now affects an appropriate sized section of terrain. * Navier-Stokes handler bounds issue partially fixed. --- .../libTerrainBSD/Channel/Editing/Flatten.cs | 50 ++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs') diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs index 57ba729..03b88a4 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs @@ -44,6 +44,11 @@ namespace libTerrain /// The scale of the terrain mask public void Flatten(double rx, double ry, double size, double amount) { + FlattenFast(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); @@ -70,6 +75,51 @@ namespace libTerrain } + 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; + + map[x, y] = Tools.linearInterpolate(map[x, y], height, z); + } + } + } + public void Flatten(Channel mask, double amount) { // Generate the mask -- cgit v1.1