* 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
parent
068163b14b
commit
87b3137928
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
// }
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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]);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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++)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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++;
|
||||
|
|
|
@ -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++)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -31,7 +31,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
|
|||
{
|
||||
public class TerrainException : Exception
|
||||
{
|
||||
public TerrainException() : base()
|
||||
public TerrainException()
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue