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)