* Refactored some terrain brushes to move out some common functions into TerrainUtil class. More needs doing.

* Adjusted strength of brushes to Math.Pow(2,size), this should in theory work closer to how it was before.
0.6.0-stable
Adam Frisby 2008-03-12 11:02:30 +00:00
parent df104e6f84
commit 8e27656fcc
10 changed files with 79 additions and 122 deletions

View File

@ -146,51 +146,14 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes
return coord; return coord;
} }
private double SphericalFactor(double x, double y, double rx, double ry, double size)
{
double z = size * size - ((x - rx) * (x - rx) + (y - ry) * (y - ry));
return z;
}
private double GetBilinearInterpolate(double x, double y, ITerrainChannel map)
{
int w = map.Width;
int h = map.Height;
if (x > w - 2.0)
x = w - 2.0;
if (y > h - 2.0)
y = h - 2.0;
if (x < 0.0)
x = 0.0;
if (y < 0.0)
y = 0.0;
int stepSize = 1;
double h00 = map[(int)x, (int)y];
double h10 = map[(int)x + stepSize, (int)y];
double h01 = map[(int)x, (int)y + stepSize];
double h11 = map[(int)x + stepSize, (int)y + stepSize];
double h1 = h00;
double h2 = h10;
double h3 = h01;
double h4 = h11;
double a00 = h1;
double a10 = h2 - h1;
double a01 = h3 - h1;
double a11 = h1 - h2 - h3 + h4;
double partialx = x - (int)x;
double partialz = y - (int)y;
double hi = a00 + (a10 * partialx) + (a01 * partialz) + (a11 * partialx * partialz);
return hi;
}
#endregion #endregion
#region ITerrainPaintableEffect Members #region ITerrainPaintableEffect Members
public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration) public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration)
{ {
strength = TerrainUtil.MetersToSphericalStrength(strength);
int x, y; int x, y;
// Using one 'rain' round for this, so skipping a useless loop // Using one 'rain' round for this, so skipping a useless loop
// Will need to adapt back in for the Flood brush // Will need to adapt back in for the Flood brush
@ -201,7 +164,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes
// Fill with rain // Fill with rain
for (x = 0; x < water.Width; x++) for (x = 0; x < water.Width; x++)
for (y = 0; y < water.Height; y++) for (y = 0; y < water.Height; y++)
water[x, y] = Math.Max(0.0, SphericalFactor(x, y, rx, ry, strength) * rainHeight * duration); water[x, y] = Math.Max(0.0, TerrainUtil.SphericalFactor(x, y, rx, ry, strength) * rainHeight * duration);
for (int i = 0; i < rounds; i++) for (int i = 0; i < rounds; i++)
{ {

View File

@ -74,6 +74,8 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes
public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration) public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration)
{ {
strength = TerrainUtil.MetersToSphericalStrength(strength);
int x, y; int x, y;
double[,] tweak = new double[map.Width, map.Height]; double[,] tweak = new double[map.Width, map.Height];

View File

@ -36,6 +36,8 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes
public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration) public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration)
{ {
strength = TerrainUtil.MetersToSphericalStrength(strength);
int x, y; int x, y;
for (x = 0; x < map.Width; x++) for (x = 0; x < map.Width; x++)
{ {

View File

@ -37,6 +37,8 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes
public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration) public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration)
{ {
strength = TerrainUtil.MetersToSphericalStrength(strength);
int x, y; int x, y;
for (x = 0; x < map.Width; x++) for (x = 0; x < map.Width; x++)
{ {

View File

@ -159,6 +159,8 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes
public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration) public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration)
{ {
strength = TerrainUtil.MetersToSphericalStrength(strength);
int x, y; int x, y;
for (x = 0; x < map.Width; x++) for (x = 0; x < map.Width; x++)

View File

@ -36,6 +36,8 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes
public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration) public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration)
{ {
strength = TerrainUtil.MetersToSphericalStrength(strength);
int x, y; int x, y;
for (x = 0; x < map.Width; x++) for (x = 0; x < map.Width; x++)
{ {

View File

@ -43,6 +43,13 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes
public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration) public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration)
{ {
strength = TerrainUtil.MetersToSphericalStrength(strength);
if (duration > 1.0)
duration = 1.0;
if (duration < 0)
return;
int x, y; int x, y;
for (x = 0; x < map.Width; x++) for (x = 0; x < map.Width; x++)
{ {

View File

@ -31,49 +31,12 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes
{ {
public class SmoothSphere : ITerrainPaintableEffect public class SmoothSphere : ITerrainPaintableEffect
{ {
private double SphericalFactor(double x, double y, double rx, double ry, double size)
{
double z = size * size - ((x - rx) * (x - rx) + (y - ry) * (y - ry));
return z;
}
private double GetBilinearInterpolate(double x, double y, ITerrainChannel map)
{
int w = map.Width;
int h = map.Height;
if (x > w - 2.0)
x = w - 2.0;
if (y > h - 2.0)
y = h - 2.0;
if (x < 0.0)
x = 0.0;
if (y < 0.0)
y = 0.0;
int stepSize = 1;
double h00 = map[(int)x, (int)y];
double h10 = map[(int)x + stepSize, (int)y];
double h01 = map[(int)x, (int)y + stepSize];
double h11 = map[(int)x + stepSize, (int)y + stepSize];
double h1 = h00;
double h2 = h10;
double h3 = h01;
double h4 = h11;
double a00 = h1;
double a10 = h2 - h1;
double a01 = h3 - h1;
double a11 = h1 - h2 - h3 + h4;
double partialx = x - (int)x;
double partialz = y - (int)y;
double hi = a00 + (a10 * partialx) + (a01 * partialz) + (a11 * partialx * partialz);
return hi;
}
#region ITerrainPaintableEffect Members #region ITerrainPaintableEffect Members
public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration) public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration)
{ {
strength = TerrainUtil.MetersToSphericalStrength(strength);
int x, y; int x, y;
double[,] tweak = new double[map.Width, map.Height]; double[,] tweak = new double[map.Width, map.Height];
@ -86,7 +49,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes
{ {
for (y = 0; y < map.Height; y++) for (y = 0; y < map.Height; y++)
{ {
double z = SphericalFactor(x, y, rx, ry, strength); double z = TerrainUtil.SphericalFactor(x, y, rx, ry, strength);
if (z > 0) // add in non-zero amount if (z > 0) // add in non-zero amount
{ {
@ -98,7 +61,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes
for (l = 0.0 - area; l < area; l += step) for (l = 0.0 - area; l < area; l += step)
{ {
avgsteps++; avgsteps++;
average += GetBilinearInterpolate(x + n, y + l, map); average += TerrainUtil.GetBilinearInterpolate(x + n, y + l, map);
} }
} }
tweak[x, y] = average / avgsteps; tweak[x, y] = average / avgsteps;
@ -110,7 +73,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes
{ {
for (y = 0; y < map.Height; y++) for (y = 0; y < map.Height; y++)
{ {
double z = SphericalFactor(x, y, rx, ry, strength); double z = TerrainUtil.SphericalFactor(x, y, rx, ry, strength);
if (z > 0) // add in non-zero amount if (z > 0) // add in non-zero amount
{ {

View File

@ -142,58 +142,21 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes
return coord; return coord;
} }
private double SphericalFactor(double x, double y, double rx, double ry, double size)
{
double z = size * size - ((x - rx) * (x - rx) + (y - ry) * (y - ry));
return z;
}
private double GetBilinearInterpolate(double x, double y, ITerrainChannel map)
{
int w = map.Width;
int h = map.Height;
if (x > w - 2.0)
x = w - 2.0;
if (y > h - 2.0)
y = h - 2.0;
if (x < 0.0)
x = 0.0;
if (y < 0.0)
y = 0.0;
int stepSize = 1;
double h00 = map[(int)x, (int)y];
double h10 = map[(int)x + stepSize, (int)y];
double h01 = map[(int)x, (int)y + stepSize];
double h11 = map[(int)x + stepSize, (int)y + stepSize];
double h1 = h00;
double h2 = h10;
double h3 = h01;
double h4 = h11;
double a00 = h1;
double a10 = h2 - h1;
double a01 = h3 - h1;
double a11 = h1 - h2 - h3 + h4;
double partialx = x - (int)x;
double partialz = y - (int)y;
double hi = a00 + (a10 * partialx) + (a01 * partialz) + (a11 * partialx * partialz);
return hi;
}
#endregion #endregion
#region ITerrainPaintableEffect Members #region ITerrainPaintableEffect Members
public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration) public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration)
{ {
strength = TerrainUtil.MetersToSphericalStrength(strength);
int x, y; int x, y;
for (x = 0; x < map.Width; x++) for (x = 0; x < map.Width; x++)
{ {
for (y = 0; y < map.Height; y++) for (y = 0; y < map.Height; y++)
{ {
double z = SphericalFactor(x, y, rx, ry, strength); double z = TerrainUtil.SphericalFactor(x, y, rx, ry, strength);
if (z > 0) // add in non-zero amount if (z > 0) // add in non-zero amount
{ {

View File

@ -0,0 +1,51 @@
using System;
using OpenSim.Region.Environment.Interfaces;
namespace OpenSim.Region.Environment.Modules.Terrain
{
public static class TerrainUtil
{
public static double MetersToSphericalStrength(double size)
{
return Math.Pow(2, size);
}
public static double SphericalFactor(double x, double y, double rx, double ry, double size)
{
return size * size - ((x - rx) * (x - rx) + (y - ry) * (y - ry));
}
public static double GetBilinearInterpolate(double x, double y, ITerrainChannel map)
{
int w = map.Width;
int h = map.Height;
if (x > w - 2.0)
x = w - 2.0;
if (y > h - 2.0)
y = h - 2.0;
if (x < 0.0)
x = 0.0;
if (y < 0.0)
y = 0.0;
int stepSize = 1;
double h00 = map[(int)x, (int)y];
double h10 = map[(int)x + stepSize, (int)y];
double h01 = map[(int)x, (int)y + stepSize];
double h11 = map[(int)x + stepSize, (int)y + stepSize];
double h1 = h00;
double h2 = h10;
double h3 = h01;
double h4 = h11;
double a00 = h1;
double a10 = h2 - h1;
double a01 = h3 - h1;
double a11 = h1 - h2 - h3 + h4;
double partialx = x - (int)x;
double partialz = y - (int)y;
double hi = a00 + (a10 * partialx) + (a01 * partialz) + (a11 * partialx * partialz);
return hi;
}
}
}