diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 7cce3b655b..ebf5a06962 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1113,7 +1113,7 @@ namespace OpenSim.Region.Framework.Scenes
}
///
- ///
+ /// Create a terrain texture for this scene
///
public void CreateTerrainTexture(bool temporary)
{
@@ -1125,398 +1125,11 @@ namespace OpenSim.Region.Framework.Scenes
return;
if (terrain == null)
- {
- #region Fallback default maptile generation
+ return;
- int tc = Environment.TickCount;
- m_log.Info("[MAPTILE]: Generating Maptile Step 1: Terrain");
- Bitmap mapbmp = new Bitmap(256, 256);
- double[,] hm = Heightmap.GetDoubles();
- bool ShadowDebugContinue = true;
- //Color prim = Color.FromArgb(120, 120, 120);
- //Vector3 RayEnd = new Vector3(0, 0, 0);
- //Vector3 RayStart = new Vector3(0, 0, 0);
- //Vector3 direction = new Vector3(0, 0, -1);
- //Vector3 AXOrigin = new Vector3();
- //Vector3 AXdirection = new Vector3();
- //Ray testRay = new Ray();
- //EntityIntersection rt = new EntityIntersection();
- bool terraincorruptedwarningsaid = false;
-
- float low = 255;
- float high = 0;
- for (int x = 0; x < 256; x++)
- {
- for (int y = 0; y < 256; y++)
- {
- float hmval = (float)hm[x, y];
- if (hmval < low)
- low = hmval;
- if (hmval > high)
- high = hmval;
- }
- }
-
- float mid = (high + low) * 0.5f;
-
- // temporary initializer
- float hfvalue = (float)m_regInfo.RegionSettings.WaterHeight;
- float hfvaluecompare = hfvalue;
- float hfdiff = hfvalue;
- int hfdiffi = 0;
-
- for (int x = 0; x < 256; x++)
- {
- //int tc = System.Environment.TickCount;
- for (int y = 0; y < 256; y++)
- {
- //RayEnd = new Vector3(x, y, 0);
- //RayStart = new Vector3(x, y, 255);
-
- //direction = Vector3.Norm(RayEnd - RayStart);
- //AXOrigin = new Vector3(RayStart.X, RayStart.Y, RayStart.Z);
- //AXdirection = new Vector3(direction.X, direction.Y, direction.Z);
-
- //testRay = new Ray(AXOrigin, AXdirection);
- //rt = m_sceneGraph.GetClosestIntersectingPrim(testRay);
-
- //if (rt.HitTF)
- //{
- //mapbmp.SetPixel(x, y, prim);
- //}
- //else
- //{
- //float tmpval = (float)hm[x, y];
- float heightvalue = (float)hm[x, y];
-
- if (heightvalue > (float)m_regInfo.RegionSettings.WaterHeight)
- {
- // scale height value
- heightvalue = low + mid * (heightvalue - low) / mid;
-
- if (heightvalue > 255)
- heightvalue = 255;
-
- if (heightvalue < 0)
- heightvalue = 0;
-
- if (Single.IsInfinity(heightvalue) || Single.IsNaN(heightvalue))
- heightvalue = 0;
-
- try
- {
- Color green = Color.FromArgb((int)heightvalue, 100, (int)heightvalue);
-
- // Y flip the cordinates
- mapbmp.SetPixel(x, (256 - y) - 1, green);
-
- //X
- // .
- //
- // Shade the terrain for shadows
- if ((x - 1 > 0) && (y - 1 > 0))
- {
- hfvalue = (float)hm[x, y];
- hfvaluecompare = (float)hm[x - 1, y - 1];
-
- if (Single.IsInfinity(hfvalue) || Single.IsNaN(hfvalue))
- hfvalue = 0;
-
- if (Single.IsInfinity(hfvaluecompare) || Single.IsNaN(hfvaluecompare))
- hfvaluecompare = 0;
-
- hfdiff = hfvaluecompare - hfvalue;
-
- if (hfdiff > 0.3f)
- {
-
- }
- else if (hfdiff < -0.3f)
- {
- // We have to desaturate and blacken the land at the same time
- // we use floats, colors use bytes, so shrink are space down to
- // 0-255
-
- try
- {
- hfdiffi = Math.Abs((int)((hfdiff * 4) + (hfdiff * 0.5))) + 1;
- if (hfdiff % 1 != 0)
- {
- hfdiffi = hfdiffi + Math.Abs((int)(((hfdiff % 1) * 0.5f) * 10f) - 1);
- }
- }
- catch (OverflowException)
- {
- m_log.Debug("[MAPTILE]: Shadow failed at value: " + hfdiff.ToString());
- ShadowDebugContinue = false;
- }
-
- if (ShadowDebugContinue)
- {
- if ((256 - y) - 1 > 0)
- {
- Color Shade = mapbmp.GetPixel(x - 1, (256 - y) - 1);
-
- int r = Shade.R;
-
- int g = Shade.G;
- int b = Shade.B;
- Shade = Color.FromArgb((r - hfdiffi > 0) ? r - hfdiffi : 0, (g - hfdiffi > 0) ? g - hfdiffi : 0, (b - hfdiffi > 0) ? b - hfdiffi : 0);
- //Console.WriteLine("d:" + hfdiff.ToString() + ", i:" + hfdiffi + ", pos: " + x + "," + y + " - R:" + Shade.R.ToString() + ", G:" + Shade.G.ToString() + ", B:" + Shade.G.ToString());
- mapbmp.SetPixel(x - 1, (256 - y) - 1, Shade);
- }
- }
- }
- }
- }
- catch (ArgumentException)
- {
- if (!terraincorruptedwarningsaid)
- {
- m_log.WarnFormat("[MAPIMAGE]: Your terrain is corrupted in region {0}, it might take a few minutes to generate the map image depending on the corruption level", RegionInfo.RegionName);
- terraincorruptedwarningsaid = true;
- }
- Color black = Color.Black;
- mapbmp.SetPixel(x, (256 - y) - 1, black);
- }
- }
- else
- {
- // Y flip the cordinates
- heightvalue = (float)m_regInfo.RegionSettings.WaterHeight - heightvalue;
- if (heightvalue > 19)
- heightvalue = 19;
- if (heightvalue < 0)
- heightvalue = 0;
-
- heightvalue = 100 - (heightvalue * 100) / 19;
-
- if (heightvalue > 255)
- heightvalue = 255;
-
- if (heightvalue < 0)
- heightvalue = 0;
-
- if (Single.IsInfinity(heightvalue) || Single.IsNaN(heightvalue))
- heightvalue = 0;
-
- try
- {
- Color water = Color.FromArgb((int)heightvalue, (int)heightvalue, 255);
- mapbmp.SetPixel(x, (256 - y) - 1, water);
- }
- catch (ArgumentException)
- {
- if (!terraincorruptedwarningsaid)
- {
- m_log.WarnFormat("[MAPIMAGE]: Your terrain is corrupted in region {0}, it might take a few minutes to generate the map image depending on the corruption level", RegionInfo.RegionName);
- terraincorruptedwarningsaid = true;
- }
- Color black = Color.Black;
- mapbmp.SetPixel(x, (256 - y) - 1, black);
- }
- }
- }
- //}
-
- //tc = System.Environment.TickCount - tc;
- //m_log.Info("[MAPTILE]: Completed One row in " + tc + " ms");
- }
-
- m_log.Info("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms");
-
- bool drawPrimVolume = true;
-
- try
- {
- IConfig startupConfig = m_config.Configs["Startup"];
- drawPrimVolume = startupConfig.GetBoolean("DrawPrimOnMapTile", true);
- }
- catch
- {
- m_log.Warn("[MAPTILE]: Failed to load StartupConfig");
- }
-
- if (drawPrimVolume)
- {
- tc = Environment.TickCount;
- m_log.Info("[MAPTILE]: Generating Maptile Step 2: Object Volume Profile");
- List objs = GetEntities();
-
- lock (objs)
- {
- foreach (EntityBase obj in objs)
- {
- // Only draw the contents of SceneObjectGroup
- if (obj is SceneObjectGroup)
- {
- SceneObjectGroup mapdot = (SceneObjectGroup)obj;
- Color mapdotspot = Color.Gray; // Default color when prim color is white
- // Loop over prim in group
- foreach (SceneObjectPart part in mapdot.Children.Values)
- {
- if (part == null)
- continue;
-
- // Draw if the object is at least 1 meter wide in any direction
- if (part.Scale.X > 1f || part.Scale.Y > 1f || part.Scale.Z > 1f)
- {
- // Try to get the RGBA of the default texture entry..
- //
- try
- {
- if (part == null)
- continue;
-
- if (part.Shape == null)
- continue;
-
- if (part.Shape.PCode == (byte)PCode.Tree || part.Shape.PCode == (byte)PCode.NewTree)
- continue; // eliminates trees from this since we don't really have a good tree representation
- // if you want tree blocks on the map comment the above line and uncomment the below line
- //mapdotspot = Color.PaleGreen;
-
- if (part.Shape.Textures == null)
- continue;
-
- if (part.Shape.Textures.DefaultTexture == null)
- continue;
-
- Color4 texcolor = part.Shape.Textures.DefaultTexture.RGBA;
-
- // Not sure why some of these are null, oh well.
-
- int colorr = 255 - (int)(texcolor.R * 255f);
- int colorg = 255 - (int)(texcolor.G * 255f);
- int colorb = 255 - (int)(texcolor.B * 255f);
-
- if (!(colorr == 255 && colorg == 255 && colorb == 255))
- {
- //Try to set the map spot color
- try
- {
- // If the color gets goofy somehow, skip it *shakes fist at Color4
- mapdotspot = Color.FromArgb(colorr, colorg, colorb);
- }
- catch (ArgumentException)
- {
- }
- }
- }
- catch (IndexOutOfRangeException)
- {
- // Windows Array
- }
- catch (ArgumentOutOfRangeException)
- {
- // Mono Array
- }
-
- Vector3 pos = part.GetWorldPosition();
-
- // skip prim outside of retion
- if (pos.X < 0f || pos.X > 256f || pos.Y < 0f || pos.Y > 256f)
- continue;
-
- // skip prim in non-finite position
- if (Single.IsNaN(pos.X) || Single.IsNaN(pos.Y) || Single.IsInfinity(pos.X)
- || Single.IsInfinity(pos.Y))
- continue;
-
- // Figure out if object is under 256m above the height of the terrain
- bool isBelow256AboveTerrain = false;
-
- try
- {
- isBelow256AboveTerrain = (pos.Z < ((float)hm[(int)pos.X, (int)pos.Y] + 256f));
- }
- catch (Exception)
- {
- }
-
- if (isBelow256AboveTerrain)
- {
- // Translate scale by rotation so scale is represented properly when object is rotated
- Vector3 scale = part.Shape.Scale;
- Quaternion rot = part.GetWorldRotation();
- scale *= rot;
-
- // negative scales don't work in this situation
- scale.X = Math.Abs(scale.X);
- scale.Y = Math.Abs(scale.Y);
- scale.Z = Math.Abs(scale.Z);
-
- // This scaling isn't very accurate and doesn't take into account the face rotation :P
- int mapdrawstartX = (int)(pos.X - scale.X);
- int mapdrawstartY = (int)(pos.Y - scale.Y);
- int mapdrawendX = (int)(pos.X + scale.X);
- int mapdrawendY = (int)(pos.Y + scale.Y);
-
- // If object is beyond the edge of the map, don't draw it to avoid errors
- if (mapdrawstartX < 0 || mapdrawstartX > 255 || mapdrawendX < 0 || mapdrawendX > 255
- || mapdrawstartY < 0 || mapdrawstartY > 255 || mapdrawendY < 0
- || mapdrawendY > 255)
- continue;
-
- int wy = 0;
-
- bool breakYN = false; // If we run into an error drawing, break out of the
- // loop so we don't lag to death on error handling
- for (int wx = mapdrawstartX; wx < mapdrawendX; wx++)
- {
- for (wy = mapdrawstartY; wy < mapdrawendY; wy++)
- {
- //m_log.InfoFormat("[MAPDEBUG]: {0},{1}({2})", wx, (255 - wy),wy);
- try
- {
- // Remember, flip the y!
- mapbmp.SetPixel(wx, (255 - wy), mapdotspot);
- }
- catch (ArgumentException)
- {
- breakYN = true;
- }
-
- if (breakYN)
- break;
- }
-
- if (breakYN)
- break;
- }
- } // Object is within 256m Z of terrain
- } // object is at least a meter wide
- } // loop over group children
- } // entitybase is sceneobject group
- } // foreach loop over entities
- } // lock entities objs
-
- m_log.Info("[MAPTILE]: Generating Maptile Step 2: Done in " + (Environment.TickCount - tc) + " ms");
- } // end if drawPrimOnMaptle
-
- byte[] data;
- try
- {
- data = OpenJPEG.EncodeFromImage(mapbmp, false);
- }
- catch (Exception)
- {
- return;
- }
-
- LazySaveGeneratedMaptile(data,temporary);
-
- #endregion
- }
- else
- {
- // Use the module to generate the maptile.
- byte[] data = terrain.WriteJpeg2000Image("defaultstripe.png");
- if (data != null)
- {
- LazySaveGeneratedMaptile(data,temporary);
- }
- }
+ byte[] data = terrain.WriteJpeg2000Image("defaultstripe.png");
+ if (data != null)
+ LazySaveGeneratedMaptile(data, temporary);
}
public void LazySaveGeneratedMaptile(byte[] data, bool temporary)