* Cleaned up code in Terrain, Tree and Map modules.

* Fixed a bug with Terragen loader where it would do bad things on a non 256x256 sized terrain. Now loads the array correctly. 
* Moved MapImageModule.cs to Modules/World/WorldMap
* Changed Location.RegionHandle to use Helpers.GetUlong instead of doing it ourselves.
0.6.0-stable
Adam Frisby 2008-05-03 20:00:35 +00:00
parent 068163b14b
commit 87b3137928
28 changed files with 273 additions and 345 deletions

View File

@ -1,4 +1,5 @@
using System;
using libsecondlife;
namespace OpenSim.Framework
{
@ -22,7 +23,7 @@ namespace OpenSim.Framework
public ulong RegionHandle
{
get { return ((ulong) m_x << 32 & (ulong) m_y); }
get { return Helpers.UIntsToLong((uint) m_x, (uint) m_y); }
}
public int X

View File

@ -127,10 +127,10 @@ namespace OpenSim.Region.Environment.Modules.World.Sun
{
long m_addticks = (DateTime.Now.Ticks - m_start) * m_dilation;
DateTime dt = new DateTime(m_start + m_addticks);
return (double) dt.Hour + ((double) dt.Minute / 60.0);
return dt.Hour + (dt.Minute / 60.0);
}
private LLVector3 SunPos(double hour)
private static LLVector3 SunPos(double hour)
{
// now we have our radian position
double rad = (hour / m_real_day) * 2 * Math.PI - (Math.PI / 2.0);
@ -138,62 +138,5 @@ namespace OpenSim.Region.Environment.Modules.World.Sun
double x = Math.Cos(rad);
return new LLVector3((float) x, 0f, (float) z);
}
// TODO: clear this out. This is here so that I remember to
// figure out if we need those other packet fields that I've
// left out so far
//
// public void SendViewerTime(int phase)
// {
// Console.WriteLine("SunPhase: {0}", phase);
// SimulatorViewerTimeMessagePacket viewertime = new SimulatorViewerTimeMessagePacket();
// //viewertime.TimeInfo.SecPerDay = 86400;
// // viewertime.TimeInfo.SecPerYear = 31536000;
// viewertime.TimeInfo.SecPerDay = 1000;
// viewertime.TimeInfo.SecPerYear = 365000;
// viewertime.TimeInfo.SunPhase = 1;
// int sunPhase = (phase + 2)/2;
// if ((sunPhase < 6) || (sunPhase > 36))
// {
// viewertime.TimeInfo.SunDirection = new LLVector3(0f, 0.8f, -0.8f);
// Console.WriteLine("sending night");
// }
// else
// {
// if (sunPhase < 12)
// {
// sunPhase = 12;
// }
// sunPhase = sunPhase - 12;
//
// float yValue = 0.1f*(sunPhase);
// Console.WriteLine("Computed SunPhase: {0}, yValue: {1}", sunPhase, yValue);
// if (yValue > 1.2f)
// {
// yValue = yValue - 1.2f;
// }
// if (yValue > 1)
// {
// yValue = 1;
// }
// if (yValue < 0)
// {
// yValue = 0;
// }
// if (sunPhase < 14)
// {
// yValue = 1 - yValue;
// }
// if (sunPhase < 12)
// {
// yValue *= -1;
// }
// viewertime.TimeInfo.SunDirection = new LLVector3(0f, yValue, 0.3f);
// Console.WriteLine("sending sun update " + yValue);
// }
// viewertime.TimeInfo.SunAngVelocity = new LLVector3(0, 0.0f, 10.0f);
// viewertime.TimeInfo.UsecSinceStart = (ulong) Util.UnixTimeSinceEpoch();
// // OutPacket(viewertime);
// }
}
}

View File

@ -26,7 +26,6 @@
*/
using System;
using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Modules.World.Terrain.FloodBrushes;
using OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes;
namespace OpenSim.Region.Environment.Modules.World.Terrain.Effects
@ -37,7 +36,6 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.Effects
public void RunEffect(ITerrainChannel map)
{
SmoothArea smooth = new SmoothArea();
ITerrainPaintableEffect eroder = new WeatherSphere();
bool[,] cliffMask = new bool[map.Width,map.Height];
@ -60,9 +58,9 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.Effects
// Add a little height. (terrain should now be above water, mostly.)
map[x, y] += 20;
int channelsX = 4;
const int channelsX = 4;
int channelWidth = (map.Width / channelsX / 4);
int channelsY = 4;
const int channelsY = 4;
int channelHeight = (map.Height / channelsY / 4);
SetLowerChannel(map, cliffMask, channelMask, x, y, channelsX, channelWidth, map.Width, x);
@ -78,7 +76,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.Effects
{
for (y = 0; y < map.Height; y++)
{
if (cliffMask[x, y] == true)
if (cliffMask[x, y])
eroder.PaintEffect(map, x, y, 4, 0.1);
}
}

View File

@ -61,9 +61,10 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders
ITerrainChannel retval = new TerrainChannel(file.Width, file.Height);
int x, y;
int x;
for (x = 0; x < file.Width; x++)
{
int y;
for (y = 0; y < file.Height; y++)
{
retval[x, y] = file.GetPixel(x, y).GetBrightness() * 128;
@ -103,11 +104,11 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders
/// </summary>
/// <param name="map">The terrain channel to export to bitmap</param>
/// <returns>A System.Drawing.Bitmap containing a grayscale image</returns>
protected Bitmap CreateGrayscaleBitmapFromMap(ITerrainChannel map)
protected static Bitmap CreateGrayscaleBitmapFromMap(ITerrainChannel map)
{
Bitmap bmp = new Bitmap(map.Width, map.Height);
int pallete = 256;
const int pallete = 256;
Color[] grays = new Color[pallete];
for (int i = 0; i < grays.Length; i++)
@ -138,7 +139,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders
/// </summary>
/// <param name="map">The terrain channel to export to bitmap</param>
/// <returns>A System.Drawing.Bitmap containing a coloured image</returns>
protected Bitmap CreateBitmapFromMap(ITerrainChannel map)
protected static Bitmap CreateBitmapFromMap(ITerrainChannel map)
{
Bitmap gradientmapLd = new Bitmap("defaultstripe.png");

View File

@ -65,7 +65,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders
return "JPEG";
}
private Bitmap CreateBitmapFromMap(ITerrainChannel map)
private static Bitmap CreateBitmapFromMap(ITerrainChannel map)
{
Bitmap gradientmapLd = new Bitmap("defaultstripe.png");

View File

@ -42,12 +42,13 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders
FileInfo file = new FileInfo(filename);
FileStream s = file.Open(FileMode.Open, FileAccess.Read);
BinaryReader bs = new BinaryReader(s);
int x, y;
int y;
for (y = 0; y < retval.Height; y++)
{
int x;
for (x = 0; x < retval.Width; x++)
{
retval[x, y] = (double) bs.ReadByte() * ((double) bs.ReadByte() / 127.0);
retval[x, y] = bs.ReadByte() * (bs.ReadByte() / 127.0);
bs.ReadBytes(11); // Advance the stream to next bytes.
}
}
@ -71,18 +72,21 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders
// Generate a smegging big lookup table to speed the operation up (it needs it)
double[] lookupHeightTable = new double[65536];
int i, j, x, y;
int i;
int y;
for (i = 0; i < 256; i++)
{
int j;
for (j = 0; j < 256; j++)
{
lookupHeightTable[i + (j * 256)] = ((double) i * ((double) j / 127.0));
lookupHeightTable[i + (j * 256)] = (i * (j / 127.0));
}
}
// Output the calculated raw
for (y = 0; y < map.Height; y++)
{
int x;
for (x = 0; x < map.Width; x++)
{
double t = map[x, y];
@ -100,15 +104,15 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders
byte red = (byte) (index & 0xFF);
byte green = (byte) ((index >> 8) & 0xFF);
byte blue = 20;
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
const byte blue = 20;
const byte alpha1 = 0;
const byte alpha2 = 0;
const byte alpha3 = 0;
const byte alpha4 = 0;
const byte alpha5 = 255;
const byte alpha6 = 255;
const byte alpha7 = 255;
const byte alpha8 = 255;
byte alpha9 = red;
byte alpha10 = green;

View File

@ -46,9 +46,10 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders
FileInfo file = new FileInfo(filename);
FileStream s = file.Open(FileMode.Open, FileAccess.Read);
BinaryReader bs = new BinaryReader(s);
int x, y;
int y;
for (y = 0; y < retval.Height; y++)
{
int x;
for (x = 0; x < retval.Width; x++)
{
retval[x, y] = bs.ReadSingle();
@ -69,7 +70,6 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders
FileStream s = file.Open(FileMode.Open, FileAccess.Read);
BinaryReader bs = new BinaryReader(s);
int currFileXOffset = 0;
int currFileYOffset = 0;
// if our region isn't on the first Y section of the areas to be landscaped, then
@ -84,11 +84,11 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders
// got to the Y start offset within the file of our region
// so read the file bits associated with our region
int x, y;
int y;
// for each Y within our Y offset
for (y = 0; y < sectionHeight; y++)
{
currFileXOffset = 0;
int currFileXOffset = 0;
// if our region isn't the first X section of the areas to be landscaped, then
// advance the stream to the X start pos of our section in the file
@ -100,6 +100,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders
}
// got to our X offset, so write our regions X line
int x;
for (x = 0; x < sectionWidth; x++)
{
// Read a strip and continue
@ -130,9 +131,10 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders
FileStream s = file.Open(FileMode.Create, FileAccess.Write);
BinaryWriter bs = new BinaryWriter(s);
int x, y;
int y;
for (y = 0; y < map.Height; y++)
{
int x;
for (x = 0; x < map.Width; x++)
{
bs.Write((float) map[x, y]);

View File

@ -50,14 +50,15 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders
BinaryReader bs = new BinaryReader(s);
bool eof = false;
if (ASCIIEncoding.ASCII.GetString(bs.ReadBytes(16)) == "TERRAGENTERRAIN ")
if (Encoding.ASCII.GetString(bs.ReadBytes(16)) == "TERRAGENTERRAIN ")
{
int w = 256;
int h = 256;
// Terragen file
while (eof == false)
{
int w = 256;
int h = 256;
string tmp = ASCIIEncoding.ASCII.GetString(bs.ReadBytes(4));
string tmp = Encoding.ASCII.GetString(bs.ReadBytes(4));
switch (tmp)
{
case "SIZE":
@ -79,12 +80,13 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders
Int16 heightScale = bs.ReadInt16();
Int16 baseHeight = bs.ReadInt16();
retval = new TerrainChannel(w, h);
int x, y;
int x;
for (x = 0; x < w; x++)
{
int y;
for (y = 0; y < h; y++)
{
retval[x, y] = (double) baseHeight + (double) bs.ReadInt16() * (double) heightScale / 65536.0;
retval[x, y] = baseHeight + bs.ReadInt16() * (double) heightScale / 65536.0;
}
}
break;
@ -103,7 +105,6 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FileLoaders
public void SaveFile(string filename, ITerrainChannel map)
{
char[] header = "TERRAGENTERRAIN".ToCharArray();
throw new NotImplementedException();
}

View File

@ -37,7 +37,6 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FloodBrushes
{
double sum = 0.0;
double steps = 0.0;
double avg;
int x, y;
for (x = 0; x < map.Width; x++)
@ -52,7 +51,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FloodBrushes
}
}
avg = sum / steps;
double avg = sum / steps;
double str = 0.1 * strength; // == 0.2 in the default client

View File

@ -36,9 +36,10 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FloodBrushes
public void FloodEffect(ITerrainChannel map, bool[,] fillArea, double strength)
{
int x, y;
int x;
for (x = 0; x < map.Width; x++)
{
int y;
for (y = 0; y < map.Height; y++)
{
if (fillArea[x, y])

View File

@ -35,9 +35,10 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FloodBrushes
public void FloodEffect(ITerrainChannel map, bool[,] fillArea, double strength)
{
int x, y;
int x;
for (x = 0; x < map.Width; x++)
{
int y;
for (y = 0; y < map.Height; y++)
{
if (fillArea[x, y])

View File

@ -42,9 +42,10 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FloodBrushes
public void FloodEffect(ITerrainChannel map, bool[,] fillArea, double strength)
{
int x, y;
int x;
for (x = 0; x < map.Width; x++)
{
int y;
for (y = 0; y < map.Height; y++)
{
if (fillArea[x, y])

View File

@ -92,7 +92,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.FloodBrushes
if (y < 0.0)
y = 0.0;
int stepSize = 1;
const 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];

View File

@ -35,20 +35,20 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
/// </summary>
public class ErodeSphere : ITerrainPaintableEffect
{
private double rainHeight = 0.2;
private int rounds = 10;
private NeighbourSystem type = NeighbourSystem.Moore; // Parameter
private double waterSaturation = 0.30; // Can carry 1% of water in height
private const double rainHeight = 0.2;
private const int rounds = 10;
private const NeighbourSystem type = NeighbourSystem.Moore;
private const double waterSaturation = 0.30;
#region Supporting Functions
private int[] Neighbours(NeighbourSystem type, int index)
private static int[] Neighbours(NeighbourSystem neighbourType, int index)
{
int[] coord = new int[2];
index++;
switch (type)
switch (neighbourType)
{
case NeighbourSystem.Moore:
switch (index)
@ -173,7 +173,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
{
for (y = 0; y < water.Height; y++)
{
double solConst = (1.0 / rounds);
const double solConst = (1.0 / rounds);
double sedDelta = water[x, y] * solConst;
map[x, y] -= sedDelta;
sediment[x, y] += sedDelta;
@ -194,9 +194,8 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
double altitudeTotal = 0.0;
double altitudeMe = map[x, y] + water[x, y];
int NEIGHBOUR_ME = 4;
int NEIGHBOUR_MAX = type == NeighbourSystem.Moore ? 9 : 5;
const int NEIGHBOUR_ME = 4;
const int NEIGHBOUR_MAX = 9;
for (int j = 0; j < NEIGHBOUR_MAX; j++)
{

View File

@ -39,21 +39,16 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
strength = TerrainUtil.MetersToSphericalStrength(strength);
int x, y;
double[,] tweak = new double[map.Width,map.Height];
double area = strength;
double step = strength / 4.0;
double sum = 0.0;
double step2 = 0.0;
double avg = 0.0;
// compute delta map
for (x = 0; x < map.Width; x++)
{
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
{
@ -63,14 +58,14 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
}
}
avg = sum / step2;
double avg = sum / step2;
// blend in map
for (x = 0; x < map.Width; x++)
{
for (y = 0; y < map.Height; y++)
{
double z = SphericalFactor(x, y, rx, ry, strength) * duration;
double z = TerrainUtil.SphericalFactor(x, y, rx, ry, strength) * duration;
if (z > 0) // add in non-zero amount
{
@ -84,11 +79,5 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
}
#endregion
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;
}
}
}

View File

@ -38,13 +38,14 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
{
strength = TerrainUtil.MetersToSphericalStrength(strength);
int x, y;
int x;
for (x = 0; x < map.Width; x++)
{
// Skip everything unlikely to be affected
if (Math.Abs(x - rx) > strength * 1.1)
continue;
int y;
for (y = 0; y < map.Height; y++)
{
// Skip everything unlikely to be affected

View File

@ -39,13 +39,14 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
{
strength = TerrainUtil.MetersToSphericalStrength(strength);
int x, y;
int x;
for (x = 0; x < map.Width; x++)
{
// Skip everything unlikely to be affected
if (Math.Abs(x - rx) > strength * 1.1)
continue;
int y;
for (y = 0; y < map.Height; y++)
{
// Skip everything unlikely to be affected
@ -57,7 +58,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
z *= z;
z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry));
double noise = TerrainUtil.PerlinNoise2D((double) x / (double) Constants.RegionSize, (double) y / (double) Constants.RegionSize, 8, 1.0);
double noise = TerrainUtil.PerlinNoise2D(x / (double) Constants.RegionSize, y / (double) Constants.RegionSize, 8, 1.0);
if (z > 0.0)
map[x, y] += noise * z * duration;

View File

@ -38,18 +38,18 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
/// </summary>
public class OlsenSphere : ITerrainPaintableEffect
{
private double nConst = 1024.0;
private NeighbourSystem type = NeighbourSystem.Moore; // Parameter
private const double nConst = 1024.0;
private const NeighbourSystem type = NeighbourSystem.Moore;
#region Supporting Functions
private int[] Neighbours(NeighbourSystem type, int index)
private static int[] Neighbours(NeighbourSystem neighbourType, int index)
{
int[] coord = new int[2];
index++;
switch (type)
switch (neighbourType)
{
case NeighbourSystem.Moore:
switch (index)
@ -141,12 +141,6 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
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 enum NeighbourSystem
{
Moore,
@ -161,22 +155,22 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
{
strength = TerrainUtil.MetersToSphericalStrength(strength);
int x, y;
int x;
for (x = 0; x < map.Width; x++)
{
int 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
{
int NEIGHBOUR_ME = 4;
int NEIGHBOUR_MAX = type == NeighbourSystem.Moore ? 9 : 5;
const int NEIGHBOUR_ME = 4;
const int NEIGHBOUR_MAX = 9;
double max = Double.MinValue;
int loc = 0;
double cellmax = 0;
for (int j = 0; j < NEIGHBOUR_MAX; j++)
@ -197,7 +191,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
if (coords[1] < 0)
continue;
cellmax = map[x, y] - map[coords[0], coords[1]];
double cellmax = map[x, y] - map[coords[0], coords[1]];
if (cellmax > max)
{
max = cellmax;
@ -206,7 +200,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
}
}
double T = nConst / ((map.Width + map.Height) / 2);
double T = nConst / ((map.Width + map.Height) / 2.0);
// Apply results
if (0 < max && max <= T)
{

View File

@ -38,13 +38,14 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
{
strength = TerrainUtil.MetersToSphericalStrength(strength);
int x, y;
int x;
for (x = 0; x < map.Width; x++)
{
// Skip everything unlikely to be affected
if (Math.Abs(x - rx) > strength * 1.1)
continue;
int y;
for (y = 0; y < map.Height; y++)
{
// Skip everything unlikely to be affected

View File

@ -32,7 +32,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
{
public class RevertSphere : ITerrainPaintableEffect
{
private ITerrainChannel m_revertmap;
private readonly ITerrainChannel m_revertmap;
public RevertSphere(ITerrainChannel revertmap)
{
@ -50,13 +50,14 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
if (duration < 0)
return;
int x, y;
int x;
for (x = 0; x < map.Width; x++)
{
// Skip everything unlikely to be affected
if (Math.Abs(x - rx) > strength * 1.1)
continue;
int y;
for (y = 0; y < map.Height; y++)
{
// Skip everything unlikely to be affected

View File

@ -40,7 +40,6 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
int x, y;
double[,] tweak = new double[map.Width,map.Height];
double n, l;
double area = strength;
double step = strength / 4.0;
@ -56,8 +55,10 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
double average = 0.0;
int avgsteps = 0;
double n;
for (n = 0.0 - area; n < area; n += step)
{
double l;
for (l = 0.0 - area; l < area; l += step)
{
avgsteps++;

View File

@ -34,18 +34,18 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
/// </summary>
public class WeatherSphere : ITerrainPaintableEffect
{
private double talus = 0.2; // Number of meters max difference before stop eroding. Tweakage required.
private NeighbourSystem type = NeighbourSystem.Moore; // Parameter
private const double talus = 0.2;
private const NeighbourSystem type = NeighbourSystem.Moore;
#region Supporting Functions
private int[] Neighbours(NeighbourSystem type, int index)
private static int[] Neighbours(NeighbourSystem neighbourType, int index)
{
int[] coord = new int[2];
index++;
switch (type)
switch (neighbourType)
{
case NeighbourSystem.Moore:
switch (index)
@ -151,19 +151,19 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes
{
strength = TerrainUtil.MetersToSphericalStrength(strength);
int x, y;
int x;
for (x = 0; x < map.Width; x++)
{
int y;
for (y = 0; y < map.Height; y++)
{
double z = TerrainUtil.SphericalFactor(x, y, rx, ry, strength);
if (z > 0) // add in non-zero amount
{
int NEIGHBOUR_ME = 4;
int NEIGHBOUR_MAX = type == NeighbourSystem.Moore ? 9 : 5;
const int NEIGHBOUR_ME = 4;
const int NEIGHBOUR_MAX = 9;
for (int j = 0; j < NEIGHBOUR_MAX; j++)
{

View File

@ -50,7 +50,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
for (y = 0; y < Constants.RegionSize; y++)
{
map[x, y] = TerrainUtil.PerlinNoise2D(x, y, 3, 0.25) * 10;
double spherFac = TerrainUtil.SphericalFactor(x, y, Constants.RegionSize / 2, Constants.RegionSize / 2, 50) * 0.01;
double spherFac = TerrainUtil.SphericalFactor(x, y, Constants.RegionSize / 2.0, Constants.RegionSize / 2.0, 50) * 0.01;
if (map[x, y] < spherFac)
{
map[x, y] = spherFac;
@ -138,10 +138,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
taint[x / 16, y / 16] = false;
return true;
}
else
{
return false;
}
return false;
}
#endregion

View File

@ -31,7 +31,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
{
public class TerrainException : Exception
{
public TerrainException() : base()
public TerrainException()
{
}

View File

@ -79,11 +79,10 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
new Dictionary<StandardTerrainEffects, ITerrainPaintableEffect>();
private ITerrainChannel m_channel;
private Dictionary<Location, ITerrainChannel> m_channels;
private Dictionary<string, ITerrainEffect> m_plugineffects;
private ITerrainChannel m_revert;
private Scene m_scene;
private bool m_tainted = false;
private bool m_tainted;
#region ICommandableModule Members
@ -581,7 +580,6 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
{
double max = Double.MinValue;
double min = double.MaxValue;
double avg;
double sum = 0;
int x;
@ -598,7 +596,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
}
}
avg = sum / (m_channel.Height * m_channel.Width);
double avg = sum / (m_channel.Height * m_channel.Width);
m_log.Info("Channel " + m_channel.Width + "x" + m_channel.Height);
m_log.Info("max/min/avg/sum: " + max + "/" + min + "/" + avg + "/" + sum);

View File

@ -56,7 +56,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
if (y < 0.0)
y = 0.0;
int stepSize = 1;
const 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];
@ -116,14 +116,12 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
public static double PerlinNoise2D(double x, double y, int octaves, double persistence)
{
double frequency = 0.0;
double amplitude = 0.0;
double total = 0.0;
for (int i = 0; i < octaves; i++)
{
frequency = Math.Pow(2, i);
amplitude = Math.Pow(persistence, i);
double frequency = Math.Pow(2, i);
double amplitude = Math.Pow(persistence, i);
total += InterpolatedNoise(x * frequency, y * frequency) * amplitude;
}

View File

@ -66,10 +66,10 @@ namespace OpenSim.Region.Environment.Modules.World.TreePopulator
m_trees = new List<LLUUID>();
m_scene = scene;
m_scene.EventManager.OnPluginConsole += new EventManager.OnPluginConsoleDelegate(EventManager_OnPluginConsole);
m_scene.EventManager.OnPluginConsole += EventManager_OnPluginConsole;
Timer CalculateTrees = new Timer(m_tree_updates);
CalculateTrees.Elapsed += new ElapsedEventHandler(CalculateTrees_Elapsed);
CalculateTrees.Elapsed += CalculateTrees_Elapsed;
CalculateTrees.Start();
m_log.Debug("[TREES]: Initialised tree module");
}
@ -190,10 +190,7 @@ namespace OpenSim.Region.Environment.Modules.World.TreePopulator
break;
}
else
{
selectedTree.SetText(killLikelyhood.ToString(), new Vector3(1.0f, 1.0f, 1.0f), 1.0);
}
selectedTree.SetText(killLikelyhood.ToString(), new Vector3(1.0f, 1.0f, 1.0f), 1.0);
}
else
{

View File

@ -1,168 +1,167 @@
/*
* 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.Drawing;
using Nini.Config;
using OpenJPEGNet;
using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Scenes;
namespace OpenSim.Region.Environment.Modules.World.Terrain
{
internal class MapImageModule : IMapImageGenerator, IRegionModule
{
private Scene m_scene;
#region IMapImageGenerator Members
public byte[] WriteJpeg2000Image(string gradientmap)
{
byte[] imageData = null;
Bitmap bmp = TerrainToBitmap(gradientmap);
try
{
imageData = OpenJPEG.EncodeFromImage(bmp, true);
}
catch (Exception e) // LEGIT: Catching problems caused by OpenJPEG p/invoke
{
Console.WriteLine("Failed generating terrain map: " + e);
}
return imageData;
}
#endregion
#region IRegionModule Members
public void Initialise(Scene scene, IConfigSource source)
{
m_scene = scene;
m_scene.RegisterModuleInterface<IMapImageGenerator>(this);
}
public void PostInitialise()
{
}
public void Close()
{
}
public string Name
{
get { return "MapImageModule"; }
}
public bool IsSharedModule
{
get { return false; }
}
#endregion
private void ShadeBuildings(ref Bitmap map)
{
lock (map)
{
lock (m_scene.Entities)
{
foreach (EntityBase entity in m_scene.Entities.Values)
{
if (entity is SceneObjectGroup)
{
SceneObjectGroup sog = (SceneObjectGroup) entity;
foreach (SceneObjectPart primitive in sog.Children.Values)
{
int x, y, w, h;
x = (int) (primitive.AbsolutePosition.X - (primitive.Scale.X / 2));
y = (int) (primitive.AbsolutePosition.Y - (primitive.Scale.Y / 2));
w = (int) primitive.Scale.X;
h = (int) primitive.Scale.Y;
int dx;
for (dx = x; dx < x + w; dx++)
{
int dy;
for (dy = y; dy < y + h; dy++)
{
if (x < 0 || y < 0)
continue;
if (x >= map.Width || y >= map.Height)
continue;
map.SetPixel(dx, dy, Color.DarkGray);
}
}
}
}
}
}
}
}
private Bitmap TerrainToBitmap(string gradientmap)
{
Bitmap gradientmapLd = new Bitmap(gradientmap);
int pallete = gradientmapLd.Height;
Bitmap bmp = new Bitmap(m_scene.Heightmap.Width, m_scene.Heightmap.Height);
Color[] colours = new Color[pallete];
for (int i = 0; i < pallete; i++)
{
colours[i] = gradientmapLd.GetPixel(0, i);
}
lock (m_scene.Heightmap)
{
ITerrainChannel copy = m_scene.Heightmap;
for (int y = 0; y < copy.Height; y++)
{
for (int x = 0; x < copy.Width; x++)
{
// 512 is the largest possible height before colours clamp
int colorindex = (int) (Math.Max(Math.Min(1.0, copy[x, y] / 512.0), 0.0) * (pallete - 1));
// Handle error conditions
if (colorindex > pallete - 1 || colorindex < 0)
bmp.SetPixel(x, copy.Height - y - 1, Color.Red);
else
bmp.SetPixel(x, copy.Height - y - 1, colours[colorindex]);
}
}
ShadeBuildings(ref bmp);
return bmp;
}
}
}
/*
* 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.Drawing;
using Nini.Config;
using OpenJPEGNet;
using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Scenes;
namespace OpenSim.Region.Environment.Modules.World.WorldMap
{
internal class MapImageModule : IMapImageGenerator, IRegionModule
{
private Scene m_scene;
#region IMapImageGenerator Members
public byte[] WriteJpeg2000Image(string gradientmap)
{
byte[] imageData = null;
Bitmap bmp = TerrainToBitmap(gradientmap);
try
{
imageData = OpenJPEG.EncodeFromImage(bmp, true);
}
catch (Exception e) // LEGIT: Catching problems caused by OpenJPEG p/invoke
{
Console.WriteLine("Failed generating terrain map: " + e);
}
return imageData;
}
#endregion
#region IRegionModule Members
public void Initialise(Scene scene, IConfigSource source)
{
m_scene = scene;
m_scene.RegisterModuleInterface<IMapImageGenerator>(this);
}
public void PostInitialise()
{
}
public void Close()
{
}
public string Name
{
get { return "MapImageModule"; }
}
public bool IsSharedModule
{
get { return false; }
}
#endregion
private void ShadeBuildings(Bitmap map)
{
lock (map)
{
lock (m_scene.Entities)
{
foreach (EntityBase entity in m_scene.Entities.Values)
{
if (entity is SceneObjectGroup)
{
SceneObjectGroup sog = (SceneObjectGroup) entity;
foreach (SceneObjectPart primitive in sog.Children.Values)
{
int x = (int) (primitive.AbsolutePosition.X - (primitive.Scale.X / 2));
int y = (int) (primitive.AbsolutePosition.Y - (primitive.Scale.Y / 2));
int w = (int) primitive.Scale.X;
int h = (int) primitive.Scale.Y;
int dx;
for (dx = x; dx < x + w; dx++)
{
int dy;
for (dy = y; dy < y + h; dy++)
{
if (x < 0 || y < 0)
continue;
if (x >= map.Width || y >= map.Height)
continue;
map.SetPixel(dx, dy, Color.DarkGray);
}
}
}
}
}
}
}
}
private Bitmap TerrainToBitmap(string gradientmap)
{
Bitmap gradientmapLd = new Bitmap(gradientmap);
int pallete = gradientmapLd.Height;
Bitmap bmp = new Bitmap(m_scene.Heightmap.Width, m_scene.Heightmap.Height);
Color[] colours = new Color[pallete];
for (int i = 0; i < pallete; i++)
{
colours[i] = gradientmapLd.GetPixel(0, i);
}
lock (m_scene.Heightmap)
{
ITerrainChannel copy = m_scene.Heightmap;
for (int y = 0; y < copy.Height; y++)
{
for (int x = 0; x < copy.Width; x++)
{
// 512 is the largest possible height before colours clamp
int colorindex = (int) (Math.Max(Math.Min(1.0, copy[x, y] / 512.0), 0.0) * (pallete - 1));
// Handle error conditions
if (colorindex > pallete - 1 || colorindex < 0)
bmp.SetPixel(x, copy.Height - y - 1, Color.Red);
else
bmp.SetPixel(x, copy.Height - y - 1, colours[colorindex]);
}
}
ShadeBuildings(bmp);
return bmp;
}
}
}
}