From 06d6c4abda0700d96bdfbd6aa990b3b4bd04537b Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Tue, 15 May 2018 23:56:12 +0100 Subject: [PATCH] breaking map a bit more... --- .../World/Warp3DMap/TerrainSplat.cs | 187 ++++++----- .../World/Warp3DMap/Warp3DImageModule.cs | 302 ++++++++++-------- .../World/WorldMap/WorldMapModule.cs | 66 ++-- bin/Warp3D.dll | Bin 69632 -> 73728 bytes 4 files changed, 329 insertions(+), 226 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs index 95fa567d4c..51f8f75d70 100644 --- a/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs +++ b/OpenSim/Region/CoreModules/World/Warp3DMap/TerrainSplat.cs @@ -80,10 +80,12 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap /// Note we create a 256x256 dimension texture even if the actual terrain is larger. /// - public static Bitmap Splat(ITerrainChannel terrain, - UUID[] textureIDs, float[] startHeights, float[] heightRanges, + public static Bitmap Splat(ITerrainChannel terrain, UUID[] textureIDs, + float[] startHeights, float[] heightRanges, uint regionPositionX,uint regionPositionY, - IAssetService assetService, bool textureTerrain, bool averagetextureTerrain, bool FlipedY) + IAssetService assetService, IJ2KDecoder decoder, + bool textureTerrain, bool averagetextureTerrain, bool FlipedY, + int twidth, int theight) { Debug.Assert(textureIDs.Length == 4); Debug.Assert(startHeights.Length == 4); @@ -113,27 +115,29 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap for(int i = 0; i < 4; i++) { AssetBase asset = null; - UUID cacheID = UUID.Combine(TERRAIN_CACHE_MAGIC, textureIDs[i]); + + // asset cache indexes are strings + string cacheName ="MAP-Patch" + textureIDs[i].ToString(); // Try to fetch a cached copy of the decoded/resized version of this texture - // asset = assetService.GetCached(cacheID.ToString()); + asset = assetService.GetCached(cacheName); if(asset != null) { try { using(System.IO.MemoryStream stream = new System.IO.MemoryStream(asset.Data)) detailTexture[i] = (Bitmap)Image.FromStream(stream); + + if(detailTexture[i].PixelFormat != PixelFormat.Format24bppRgb || + detailTexture[i].Width != 16 || detailTexture[i].Height != 16) + { + detailTexture[i].Dispose(); + detailTexture[i] = null; + } } catch(Exception ex) { - m_log.Warn("Failed to decode cached terrain texture " + cacheID + - " (textureID: " + textureIDs[i] + "): " + ex.Message); - } - if(detailTexture[i].PixelFormat != PixelFormat.Format24bppRgb || - detailTexture[i].Width != 16 || detailTexture[i].Height != 16) - { - detailTexture[i].Dispose(); - detailTexture[i] = null; + m_log.Warn("Failed to decode cached terrain patch texture" + textureIDs[i] + "): " + ex.Message); } } @@ -143,12 +147,9 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap asset = assetService.Get(textureIDs[i].ToString()); if(asset != null) { - // m_log.DebugFormat( - // "[TERRAIN SPLAT]: Got cached original JPEG2000 terrain texture {0} {1}", i, asset.ID); - try { - detailTexture[i] = (Bitmap)CSJ2K.J2kImage.FromBytes(asset.Data); + detailTexture[i] = (Bitmap)decoder.DecodeToImage(asset.Data); } catch(Exception ex) { @@ -177,8 +178,8 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap Data = data, Description = "PNG", Flags = AssetFlags.Collectable, - FullID = cacheID, - ID = cacheID.ToString(), + FullID = UUID.Zero, + ID = cacheName, Local = true, Name = String.Empty, Temporary = true, @@ -279,46 +280,61 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap #region Layer Map - // Scale difference between actual region size and the 256 texture being created - float xFactor = terrain.Width / 256f; - float yFactor = terrain.Height / 256f; + float xFactor = terrain.Width / twidth; + float yFactor = terrain.Height / theight; #endregion Layer Map #region Texture Compositing - Bitmap output = new Bitmap(256, 256, PixelFormat.Format24bppRgb); - BitmapData outputData = output.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); + Bitmap output = new Bitmap(twidth, theight, PixelFormat.Format24bppRgb); + BitmapData outputData = output.LockBits(new Rectangle(0, 0, twidth, theight), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); // Unsafe work as we lock down the source textures for quicker access and access the // pixel data directly + float invtwitdthMinus1 = 1.0f / (twidth - 1); + float invtheightMinus1 = 1.0f / (theight - 1); + int ty; + int tx; + float pctx; + float pcty; + float height; + float layer; + float layerDiff; + int l0; + int l1; + if(usecolors) { + float a; + float b; if(FlipedY) { unsafe { - for(int y = 0; y < 256; ++y) + for(int y = 0; y < theight; ++y) { - int ty = (int)(y * yFactor); + ty = (int)(y * yFactor); + pcty = y * invtheightMinus1; byte* ptrO = (byte*)outputData.Scan0 + y * outputData.Stride; - for(int x = 0; x < 256; ++x) + for(int x = 0; x < twidth; ++x) { - int tx = (int)(x * xFactor); - float height = (float)terrain[tx, ty]; - float layer = getLayerTex(height, x, y, + tx = (int)(x * xFactor); + pctx = x * invtwitdthMinus1; + height = (float)terrain[tx, ty]; + layer = getLayerTex(height, pctx, pcty, (uint)tx + regionPositionX, (uint)ty + regionPositionY, startHeights, heightRanges); // Select two textures - int l0 = (int)layer; - int l1 = Math.Min(l0 + 1, 3); + l0 = (int)layer; + l1 = Math.Min(l0 + 1, 3); - float layerDiff = layer - l0; + layerDiff = layer - l0; - float a = mapColorsRed[l0]; - float b = mapColorsRed[l1]; + a = mapColorsRed[l0]; + b = mapColorsRed[l1]; *(ptrO++) = (byte)(a + layerDiff * (b - a)); a = mapColorsGreen[l0]; @@ -336,27 +352,28 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap { unsafe { - for(int y = 0; y < 256; ++y) + for(int y = 0; y < theight; ++y) { - int ty = (int)((255 - y) * yFactor); + ty = (int)((theight - y -1) * yFactor); + pcty = 1.0f - y * invtheightMinus1; byte* ptrO = (byte*)outputData.Scan0 + y * outputData.Stride; - for(int x = 0; x < 256; ++x) + for(int x = 0; x < twidth; ++x) { - int tx = (int)(x * xFactor); - float height = (float)terrain[tx, ty]; - float layer = getLayerTex(height, x, (255 - y), + tx = (int)(x * xFactor); + pctx = x * invtwitdthMinus1; + height = (float)terrain[tx, ty]; + layer = getLayerTex(height, pctx , pcty, (uint)tx + regionPositionX, (uint)ty + regionPositionY, startHeights, heightRanges); // Select two textures - int l0 = (int)layer; - int l1 = Math.Min(l0 + 1, 3); + l0 = (int)layer; + l1 = Math.Min(l0 + 1, 3); - float layerDiff = layer - l0; - - float a = mapColorsRed[l0]; - float b = mapColorsRed[l1]; + layerDiff = layer - l0; + a = mapColorsRed[l0]; + b = mapColorsRed[l1]; *(ptrO++) = (byte)(a + layerDiff * (b - a)); a = mapColorsGreen[l0]; @@ -373,6 +390,12 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap } else { + float aB; + float aG; + float aR; + float bB; + float bG; + float bR; unsafe { // Get handles to all of the texture data arrays @@ -386,37 +409,38 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap if(FlipedY) { - for(int y = 0; y < 256; y++) + for(int y = 0; y < theight; y++) { - int ty = (int)(y * yFactor); + ty = (int)(y * yFactor); + pcty = y * invtheightMinus1; int ypatch = ((int)(y * yFactor) & 0x0f) * datas[0].Stride; - - for(int x = 0; x < 256; x++) + for(int x = 0; x < twidth; x++) { - int tx = (int)(x * xFactor); - float height = (float)terrain[tx, ty]; - float layer = getLayerTex(height, x, y, + tx = (int)(x * xFactor); + pctx = x * invtwitdthMinus1; + height = (float)terrain[tx, ty]; + layer = getLayerTex(height, pctx, pcty, (uint)tx + regionPositionX, (uint)ty + regionPositionY, startHeights, heightRanges); // Select two textures - int l0 = (int)layer; - int l1 = Math.Min(l0 + 1, 3); + l0 = (int)layer; + l1 = Math.Min(l0 + 1, 3); int patchOffset = (tx & 0x0f) * 3 + ypatch; byte* ptrA = (byte*)datas[l0].Scan0 + patchOffset; byte* ptrB = (byte*)datas[l1].Scan0 + patchOffset; byte* ptrO = (byte*)outputData.Scan0 + y * outputData.Stride + x * 3; - float aB = *(ptrA + 0); - float aG = *(ptrA + 1); - float aR = *(ptrA + 2); + aB = *(ptrA + 0); + aG = *(ptrA + 1); + aR = *(ptrA + 2); - float bB = *(ptrB + 0); - float bG = *(ptrB + 1); - float bR = *(ptrB + 2); + bB = *(ptrB + 0); + bG = *(ptrB + 1); + bR = *(ptrB + 2); - float layerDiff = layer - l0; + layerDiff = layer - l0; // Interpolate between the two selected textures *(ptrO + 0) = (byte)(aB + layerDiff * (bB - aB)); @@ -427,37 +451,39 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap } else { - for(int y = 0; y < 256; y++) + for(int y = 0; y < theight; y++) { - int ty = (int)((255 - y) * yFactor); + ty = (int)((theight - y - 1) * yFactor); + pcty = 1.0f - y * invtheightMinus1; int ypatch = ((int)(y * yFactor) & 0x0f) * datas[0].Stride; - for(int x = 0; x < 256; x++) + for(int x = 0; x < twidth; x++) { - int tx = (int)(x * xFactor); - float height = (float)terrain[tx, ty]; - float layer = getLayerTex(height, x, (255 - y), + tx = (int)(x * xFactor); + pctx = x * invtwitdthMinus1; + height = (float)terrain[tx, ty]; + layer = getLayerTex(height, pctx, pcty, (uint)tx + regionPositionX, (uint)ty + regionPositionY, startHeights, heightRanges); // Select two textures - int l0 = (int)layer; - int l1 = Math.Min(l0 + 1, 3); + l0 = (int)layer; + l1 = Math.Min(l0 + 1, 3); int patchOffset = (tx & 0x0f) * 3 + ypatch; byte* ptrA = (byte*)datas[l0].Scan0 + patchOffset; byte* ptrB = (byte*)datas[l1].Scan0 + patchOffset; byte* ptrO = (byte*)outputData.Scan0 + y * outputData.Stride + x * 3; - float aB = *(ptrA + 0); - float aG = *(ptrA + 1); - float aR = *(ptrA + 2); + aB = *(ptrA + 0); + aG = *(ptrA + 1); + aR = *(ptrA + 2); - float bB = *(ptrB + 0); - float bG = *(ptrB + 1); - float bR = *(ptrB + 2); + bB = *(ptrB + 0); + bG = *(ptrB + 1); + bR = *(ptrB + 2); - float layerDiff = layer - l0; + layerDiff = layer - l0; // Interpolate between the two selected textures *(ptrO + 0) = (byte)(aB + layerDiff * (bB - aB)); @@ -486,12 +512,9 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap } [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] - private static float getLayerTex(float height, int x, int y, uint sourceX, uint sourceY, + private static float getLayerTex(float height, float pctX, float pctY, uint sourceX, uint sourceY, float[] startHeights, float[] heightRanges) { - float pctX = (float)x / 255f; - float pctY = (float)y / 255f; - // Use bilinear interpolation between the four corners of start height and // height range to select the current values at this position float startHeight = ImageUtils.Bilinear( diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs index 4c0023c2ec..450c67950f 100644 --- a/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs +++ b/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs @@ -50,15 +50,15 @@ using OpenMetaverse.Imaging; using OpenMetaverse.Rendering; using OpenMetaverse.StructuredData; -using WarpRenderer = global::Warp3D.Warp3D; +using WarpRenderer = Warp3D.Warp3D; namespace OpenSim.Region.CoreModules.World.Warp3DMap { [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "Warp3DImageModule")] public class Warp3DImageModule : IMapImageGenerator, INonSharedRegionModule { - private static readonly UUID TEXTURE_METADATA_MAGIC = new UUID("802dc0e0-f080-4931-8b57-d1be8611c4f3"); private static readonly Color4 WATER_COLOR = new Color4(29, 72, 96, 216); +// private static readonly Color4 WATER_COLOR = new Color4(29, 72, 96, 128); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -66,9 +66,13 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap private static string LogHeader = "[WARP 3D IMAGE MODULE]"; #pragma warning restore 414 - private Scene m_scene; + internal Scene m_scene; private IRendering m_primMesher; - private Dictionary m_colors = new Dictionary(); + internal IJ2KDecoder m_imgDecoder; + + // caches per rendering + private Dictionary m_warpTextures = new Dictionary(); + private Dictionary m_colors = new Dictionary(); private IConfigSource m_config; private bool m_drawPrimVolume = true; // true if should render the prims on the tile @@ -132,6 +136,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap public void RegionLoaded(Scene scene) { + m_imgDecoder = m_scene.RequestModuleInterface(); } public void RemoveRegion(Scene scene) @@ -181,10 +186,13 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap viewHeigth = (int)m_scene.RegionInfo.RegionSizeY; orto = true; -// fov = warp_Math.rad2deg(2f * (float)Math.Atan2(viewWitdh,4096f)); +// fov = warp_Math.rad2deg(2f * (float)Math.Atan2(viewWitdh, 4096f)); // orto = false; - Bitmap tile = GenMapTile(); + Bitmap tile = GenImage(); + // image may be reloaded elsewhere, so no compression format + string filename = "MAP-" + m_scene.RegionInfo.RegionID.ToString() + ".png"; + tile.Save(filename, ImageFormat.Png); m_primMesher = null; return tile; } @@ -204,14 +212,15 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap fov = pfov; orto = false; - Bitmap tile = GenMapTile(); + Bitmap tile = GenImage(); m_primMesher = null; return tile; } - private Bitmap GenMapTile() + private Bitmap GenImage() { m_colors.Clear(); + m_warpTextures.Clear(); WarpRenderer renderer = new WarpRenderer(); @@ -233,7 +242,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap #endregion Camera renderer.Scene.setAmbient(warp_Color.getColor(192,191,173)); - renderer.Scene.addLight("Light1", new warp_Light(new warp_Vector(0f, 1f, 8f), 0xffffff, 0, 320, 40)); + renderer.Scene.addLight("Light1", new warp_Light(new warp_Vector(0f, 1f, 8f), warp_Color.White, 0, 320, 40)); CreateWater(renderer); CreateTerrain(renderer); @@ -248,6 +257,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap renderer = null; m_colors.Clear(); + m_warpTextures.Clear(); GC.Collect(); // m_log.Debug("[WARP 3D IMAGE MODULE]: GC.Collect()"); @@ -285,8 +295,6 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap m_scene.RegionInfo.RegionSizeY * 0.5f); warp_Material waterColorMaterial = new warp_Material(ConvertColor(WATER_COLOR)); - waterColorMaterial.setReflectivity(0); // match water color with standard map module thanks lkalif - waterColorMaterial.setTransparency((byte)((1f - WATER_COLOR.A) * 255f)); renderer.Scene.addMaterial("WaterColor", waterColorMaterial); renderer.SetObjectMaterial("Water", "WaterColor"); } @@ -302,7 +310,23 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap float regionsy = m_scene.RegionInfo.RegionSizeY; // 'diff' is the difference in scale between the real region size and the size of terrain we're buiding - float diff = regionsx / 256f; + + int bitWidth; + int bitHeight; + + const double log2inv = 1.4426950408889634073599246810019; + bitWidth = (int)Math.Ceiling((Math.Log(terrain.Width) * log2inv)); + bitHeight = (int)Math.Ceiling((Math.Log(terrain.Height) * log2inv)); + + if(bitWidth > 8) // more than 256 is very heavy :( + bitWidth = 8; + if(bitHeight > 8) + bitHeight = 8; + + int twidth = (int)Math.Pow(2, bitWidth); + int theight = (int)Math.Pow(2, bitHeight); + + float diff = regionsx / twidth; int npointsx = (int)(regionsx / diff); int npointsy = (int)(regionsy / diff); @@ -391,14 +415,13 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap warp_Texture texture; // get texture fliped on Y - using (Bitmap image = TerrainSplat.Splat( - terrain, textureIDs, startHeights, heightRanges, + using (Bitmap image = TerrainSplat.Splat(terrain, textureIDs, startHeights, heightRanges, m_scene.RegionInfo.WorldLocX, m_scene.RegionInfo.WorldLocY, - m_scene.AssetService, m_textureTerrain, m_textureAvegareTerrain, true)) + m_scene.AssetService, m_imgDecoder, m_textureTerrain, m_textureAvegareTerrain, true, + twidth, twidth)) texture = new warp_Texture(image); warp_Material material = new warp_Material(texture); - material.setColor(warp_Color.getColor(255,255,255)); renderer.Scene.addMaterial("TerrainColor", material); renderer.SetObjectMaterial("Terrain", "TerrainColor"); } @@ -416,18 +439,31 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap } ); } - + private void CreatePrim(WarpRenderer renderer, SceneObjectPart prim) { - const float MIN_SIZE_SQUARE = 4f; - if ((PCode)prim.Shape.PCode != PCode.Prim) return; - float primScaleLenSquared = prim.Scale.LengthSquared(); - if (primScaleLenSquared < MIN_SIZE_SQUARE) + warp_Vector primPos = ConvertVector(prim.GetWorldPosition()); + warp_Quaternion primRot = ConvertQuaternion(prim.GetWorldRotation()); + warp_Matrix m = warp_Matrix.quaternionMatrix(primRot); + + float screenFactor = renderer.Scene.EstimateBoxProjectedArea(primPos, ConvertVector(prim.Scale), m); + if(screenFactor < 0) return; + int p2 = (int)( -(float)Math.Log(screenFactor) * 1.442695f * 0.5 - 1); + + if(p2 < 0) + p2 = 0; + else if(p2>3) + p2 = 3; + + DetailLevel lod = (DetailLevel)(3 - p2); + +// DetailLevel lod = DetailLevel.High; + FacetedMesh renderMesh = null; Primitive omvPrim = prim.Shape.ToOmvPrimitive(prim.OffsetPosition, prim.RotationOffset); @@ -443,18 +479,17 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap if (omvPrim.Sculpt.Type == SculptType.Mesh) { AssetMesh meshAsset = new AssetMesh(omvPrim.Sculpt.SculptTexture, sculptAsset); - FacetedMesh.TryDecodeFromAsset(omvPrim, meshAsset, DetailLevel.Highest, out renderMesh); + FacetedMesh.TryDecodeFromAsset(omvPrim, meshAsset, lod, out renderMesh); meshAsset = null; } else // It's sculptie { - IJ2KDecoder imgDecoder = m_scene.RequestModuleInterface(); - if(imgDecoder != null) + if(m_imgDecoder != null) { - Image sculpt = imgDecoder.DecodeToImage(sculptAsset); + Image sculpt = m_imgDecoder.DecodeToImage(sculptAsset); if(sculpt != null) { - renderMesh = m_primMesher.GenerateFacetedSculptMesh(omvPrim,(Bitmap)sculpt, DetailLevel.High); + renderMesh = m_primMesher.GenerateFacetedSculptMesh(omvPrim,(Bitmap)sculpt, lod); sculpt.Dispose(); } } @@ -466,7 +501,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap // If not a mesh or sculptie, try the regular mesher if (renderMesh == null) { - renderMesh = m_primMesher.GenerateFacetedMesh(omvPrim, DetailLevel.High); + renderMesh = m_primMesher.GenerateFacetedMesh(omvPrim, lod); } if (renderMesh == null) @@ -474,10 +509,6 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap string primID = prim.UUID.ToString(); - warp_Vector primPos = ConvertVector(prim.GetWorldPosition()); - warp_Quaternion primRot = ConvertQuaternion(prim.GetWorldRotation()); - warp_Matrix m = warp_Matrix.quaternionMatrix(primRot); - // Create the prim faces // TODO: Implement the useTextures flag behavior for (int i = 0; i < renderMesh.Faces.Count; i++) @@ -493,20 +524,34 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap Primitive.TextureEntryFace teFace = prim.Shape.Textures.GetFace((uint)i); Color4 faceColor = teFace.RGBA; + if(faceColor.A == 0) + continue; string materialName = String.Empty; - if (m_texturePrims && primScaleLenSquared > m_texturePrimSize*m_texturePrimSize) - materialName = GetOrCreateMaterial(renderer, faceColor, teFace.TextureID); + if (m_texturePrims) + { +// if(lod > DetailLevel.Low) + { +// materialName = GetOrCreateMaterial(renderer, faceColor, teFace.TextureID, lod == DetailLevel.Low); + materialName = GetOrCreateMaterial(renderer, faceColor, teFace.TextureID, false); + if(String.IsNullOrEmpty(materialName)) + continue; + int c = renderer.Scene.material(materialName).getColor(); + if((c & warp_Color.MASKALPHA) == 0) + continue; + } + } else - materialName = GetOrCreateMaterial(renderer, GetFaceColor(teFace)); + materialName = GetOrCreateMaterial(renderer, faceColor); if(renderer.Scene.material(materialName).getTexture() == null) { + // uv map details dont not matter for color; for (int j = 0; j < face.Vertices.Count; j++) { Vertex v = face.Vertices[j]; warp_Vector pos = ConvertVector(v.Position); - warp_Vertex vert = new warp_Vertex(pos, v.TexCoord.X, 1.0f - v.TexCoord.Y); + warp_Vertex vert = new warp_Vertex(pos, v.TexCoord.X, v.TexCoord.Y); faceObj.addVertex(vert); } } @@ -575,20 +620,21 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap } } - private Color4 GetFaceColor(Primitive.TextureEntryFace face) + private int GetFaceColor(Primitive.TextureEntryFace face) { - Color4 color; + int color; + Color4 ctmp = Color4.White; if (face.TextureID == UUID.Zero) - return face.RGBA; + return warp_Color.White; if (!m_colors.TryGetValue(face.TextureID, out color)) { bool fetched = false; // Attempt to fetch the texture metadata - UUID metadataID = UUID.Combine(face.TextureID, TEXTURE_METADATA_MAGIC); - AssetBase metadata = m_scene.AssetService.GetCached(metadataID.ToString()); + string cacheName = "MAPCLR"+face.TextureID.ToString(); + AssetBase metadata = m_scene.AssetService.GetCached(cacheName); if (metadata != null) { OSDMap map = null; @@ -596,7 +642,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap if (map != null) { - color = map["X-JPEG2000-RGBA"].AsColor4(); + ctmp = map["X-RGBA"].AsColor4(); fetched = true; } } @@ -609,16 +655,16 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap if (textureAsset != null) { int width, height; - color = GetAverageColor(textureAsset.FullID, textureAsset.Data, out width, out height); + ctmp = GetAverageColor(textureAsset.FullID, textureAsset.Data, out width, out height); - OSDMap data = new OSDMap { { "X-JPEG2000-RGBA", OSD.FromColor4(color) } }; + OSDMap data = new OSDMap { { "X-RGBA", OSD.FromColor4(ctmp) } }; metadata = new AssetBase { Data = System.Text.Encoding.UTF8.GetBytes(OSDParser.SerializeJsonString(data)), - Description = "Metadata for JPEG2000 texture " + face.TextureID.ToString(), + Description = "Metadata for texture color" + face.TextureID.ToString(), Flags = AssetFlags.Collectable, - FullID = metadataID, - ID = metadataID.ToString(), + FullID = UUID.Zero, + ID = cacheName, Local = true, Temporary = true, Name = String.Empty, @@ -628,14 +674,14 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap } else { - color = new Color4(0.5f, 0.5f, 0.5f, 1.0f); + ctmp = new Color4(0.5f, 0.5f, 0.5f, 1.0f); } } - + color = ConvertColor(ctmp); m_colors[face.TextureID] = color; } - return color * face.RGBA; + return color; } private string GetOrCreateMaterial(WarpRenderer renderer, Color4 color) @@ -647,26 +693,32 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap return name; renderer.AddMaterial(name, ConvertColor(color)); - if (color.A < 1f) - renderer.Scene.material(name).setTransparency((byte)((1f - color.A) * 255f)); return name; } - public string GetOrCreateMaterial(WarpRenderer renderer, Color4 faceColor, UUID textureID) + public string GetOrCreateMaterial(WarpRenderer renderer, Color4 faceColor, UUID textureID, bool useAverageTextureColor) { - string materialName = "Color-" + faceColor.ToString() + "-Texture-" + textureID.ToString(); + int color = ConvertColor(faceColor); + string idstr = textureID.ToString() + color.ToString(); + string materialName = "MAPMAT" + idstr; - if (renderer.Scene.material(materialName) == null) + if (renderer.Scene.material(materialName) != null) + return materialName; + + warp_Material mat = new warp_Material(); + warp_Texture texture = GetTexture(textureID); + if (texture != null) { - renderer.AddMaterial(materialName, ConvertColor(faceColor)); - if (faceColor.A < 1f) - { - renderer.Scene.material(materialName).setTransparency((byte) ((1f - faceColor.A)*255f)); - } - warp_Texture texture = GetTexture(textureID); - if (texture != null) - renderer.Scene.material(materialName).setTexture(texture); + if(useAverageTextureColor) + color = warp_Color.multiply(color, texture.averageColor); + else + mat.setTexture(texture); } + else + color = warp_Color.multiply(color, warp_Color.Grey); + + mat.setColor(color); + renderer.Scene.addMaterial(materialName, mat); return materialName; } @@ -674,13 +726,17 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap private warp_Texture GetTexture(UUID id) { warp_Texture ret = null; + if(id == UUID.Zero) + return ret; + + if(m_warpTextures.TryGetValue(id.ToString(), out ret)) + return ret; byte[] asset = m_scene.AssetService.GetData(id.ToString()); if (asset != null) - { + { IJ2KDecoder imgDecoder = m_scene.RequestModuleInterface(); - try { using (Bitmap img = (Bitmap)imgDecoder.DecodeToImage(asset)) @@ -691,7 +747,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap m_log.Warn(string.Format("[WARP 3D IMAGE MODULE]: Failed to decode asset {0}, exception ", id), e); } } - + m_warpTextures[id.ToString()] = ret; return ret; } @@ -716,10 +772,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap private static int ConvertColor(Color4 color) { - int c = warp_Color.getColor((byte)(color.R * 255f), (byte)(color.G * 255f), (byte)(color.B * 255f)); - if (color.A < 1f) - c |= (byte)(color.A * 255f) << 24; - + int c = warp_Color.getColor((byte)(color.R * 255f), (byte)(color.G * 255f), (byte)(color.B * 255f), (byte)(color.A * 255f)); return c; } @@ -734,86 +787,83 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap return normal; } - public static Color4 GetAverageColor(UUID textureID, byte[] j2kData, out int width, out int height) + public Color4 GetAverageColor(UUID textureID, byte[] j2kData, out int width, out int height) { ulong r = 0; ulong g = 0; ulong b = 0; ulong a = 0; + int pixelBytes; - using (MemoryStream stream = new MemoryStream(j2kData)) + try { - try + using(MemoryStream stream = new MemoryStream(j2kData)) + using(Bitmap bitmap = (Bitmap)J2kImage.FromStream(stream)) { - int pixelBytes; + width = bitmap.Width; + height = bitmap.Height; - using (Bitmap bitmap = (Bitmap)J2kImage.FromStream(stream)) + BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, bitmap.PixelFormat); + pixelBytes = (bitmap.PixelFormat == PixelFormat.Format24bppRgb) ? 3 : 4; + + // Sum up the individual channels + unsafe { - width = bitmap.Width; - height = bitmap.Height; - - BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, bitmap.PixelFormat); - pixelBytes = (bitmap.PixelFormat == PixelFormat.Format24bppRgb) ? 3 : 4; - - // Sum up the individual channels - unsafe + if(pixelBytes == 4) { - if (pixelBytes == 4) + for(int y = 0; y < height; y++) { - for (int y = 0; y < height; y++) - { - byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride); + byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride); - for (int x = 0; x < width; x++) - { - b += row[x * pixelBytes + 0]; - g += row[x * pixelBytes + 1]; - r += row[x * pixelBytes + 2]; - a += row[x * pixelBytes + 3]; - } + for(int x = 0; x < width; x++) + { + b += row[x * pixelBytes + 0]; + g += row[x * pixelBytes + 1]; + r += row[x * pixelBytes + 2]; + a += row[x * pixelBytes + 3]; } } - else + } + else + { + for(int y = 0; y < height; y++) { - for (int y = 0; y < height; y++) - { - byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride); + byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride); - for (int x = 0; x < width; x++) - { - b += row[x * pixelBytes + 0]; - g += row[x * pixelBytes + 1]; - r += row[x * pixelBytes + 2]; - } + for(int x = 0; x < width; x++) + { + b += row[x * pixelBytes + 0]; + g += row[x * pixelBytes + 1]; + r += row[x * pixelBytes + 2]; } } } } - - // Get the averages for each channel - const decimal OO_255 = 1m / 255m; - decimal totalPixels = (decimal)(width * height); - - decimal rm = ((decimal)r / totalPixels) * OO_255; - decimal gm = ((decimal)g / totalPixels) * OO_255; - decimal bm = ((decimal)b / totalPixels) * OO_255; - decimal am = ((decimal)a / totalPixels) * OO_255; - - if (pixelBytes == 3) - am = 1m; - - return new Color4((float)rm, (float)gm, (float)bm, (float)am); } - catch (Exception ex) - { - m_log.WarnFormat( - "[WARP 3D IMAGE MODULE]: Error decoding JPEG2000 texture {0} ({1} bytes): {2}", - textureID, j2kData.Length, ex.Message); + // Get the averages for each channel + const decimal OO_255 = 1m / 255m; + decimal totalPixels = (decimal)(width * height); - width = 0; - height = 0; - return new Color4(0.5f, 0.5f, 0.5f, 1.0f); - } + decimal rm = ((decimal)r / totalPixels) * OO_255; + decimal gm = ((decimal)g / totalPixels) * OO_255; + decimal bm = ((decimal)b / totalPixels) * OO_255; + decimal am = ((decimal)a / totalPixels) * OO_255; + + if(pixelBytes == 3) + am = 1m; + + return new Color4((float)rm, (float)gm, (float)bm, (float)am); + + } + catch(Exception ex) + { + m_log.WarnFormat( + "[WARP 3D IMAGE MODULE]: Error decoding JPEG2000 texture {0} ({1} bytes): {2}", + textureID, j2kData.Length, ex.Message); + + width = 0; + height = 0; + return new Color4(0.5f, 0.5f, 0.5f, 1.0f); } } diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index e89934399f..da54c543dd 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs @@ -1409,6 +1409,9 @@ namespace OpenSim.Region.CoreModules.World.WorldMap // assumed this is 1m less than next grid line int regionsView = (int)m_scene.MaxRegionViewDistance; + + string regionName = m_scene.RegionInfo.RegionName; + ulong regionHandle = m_scene.RegionInfo.RegionHandle; int regionSizeX = (int)m_scene.RegionInfo.RegionSizeX; int regionSizeY = (int)m_scene.RegionInfo.RegionSizeY; @@ -1439,25 +1442,52 @@ namespace OpenSim.Region.CoreModules.World.WorldMap g.FillRectangle(sea, 0, 0, spanX, spanY); sea.Dispose(); + Font drawFont = new Font("Arial", 32); + SolidBrush drawBrush = new SolidBrush(Color.White); + List regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID, startX, startY, endX, endY); + startX--; + startY--; + + bool doneLocal = false; + string filename = "MAP-" + m_scene.RegionInfo.RegionID.ToString() + ".png"; + try + { + using(Image localMap = Bitmap.FromFile(filename)) + { + int x = regionX - startX; + int y = regionY - startY; + int sx = regionSizeX; + int sy = regionSizeY; + // y origin is top + g.DrawImage(localMap,new Rectangle(x, spanY - y - sy, sx, sy), + 0, 0, localMap.Width, localMap.Height, GraphicsUnit.Pixel, gatrib); + + if(m_exportPrintRegionName) + { + SizeF stringSize = g.MeasureString(regionName, drawFont); + g.DrawString(regionName, drawFont, drawBrush, x + 30, spanY - y - 30 - stringSize.Height); + } + } + doneLocal = true; + } + catch {} + if(regions.Count > 0) { - Font drawFont = new Font("Arial", 32); - SolidBrush drawBrush = new SolidBrush(Color.White); - ManagedImage managedImage = null; Image image = null; - startX--; - startY--; - foreach(GridRegion r in regions) { if(r.TerrainImage == UUID.Zero) continue; + if(doneLocal && r.RegionHandle == regionHandle) + continue; + AssetBase texAsset = m_scene.AssetService.Get(r.TerrainImage.ToString()); if(texAsset == null) continue; @@ -1472,7 +1502,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap g.DrawImage(image,new Rectangle(x, spanY - y - sy, sx, sy), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, gatrib); - if(m_exportPrintRegionName && r.RegionHandle == m_scene.RegionInfo.RegionHandle) + if(m_exportPrintRegionName && r.RegionHandle == regionHandle) { SizeF stringSize = g.MeasureString(r.RegionName, drawFont); g.DrawString(r.RegionName, drawFont, drawBrush, x + 30, spanY - y - 30 - stringSize.Height); @@ -1483,16 +1513,16 @@ namespace OpenSim.Region.CoreModules.World.WorldMap if(image != null) image.Dispose(); - if(m_exportPrintScale) - { - String drawString = string.Format("{0}m x {1}m", spanX, spanY); - g.DrawString(drawString, drawFont, drawBrush, 30, 30); - } - - drawBrush.Dispose(); - drawFont.Dispose(); } + if(m_exportPrintScale) + { + String drawString = string.Format("{0}m x {1}m", spanX, spanY); + g.DrawString(drawString, drawFont, drawBrush, 30, 30); + } + + drawBrush.Dispose(); + drawFont.Dispose(); gatrib.Dispose(); g.Dispose(); @@ -1689,13 +1719,13 @@ namespace OpenSim.Region.CoreModules.World.WorldMap { float scale = (float)Constants.RegionSize/(float)mb; using(Bitmap scaledbmp = Util.ResizeImageSolid(mapbmp, (int)(bx * scale), (int)(by * scale))) - data = OpenJPEG.EncodeFromImage(scaledbmp, false); + data = OpenJPEG.EncodeFromImage(scaledbmp, true); } else - data = OpenJPEG.EncodeFromImage(mapbmp, false); + data = OpenJPEG.EncodeFromImage(mapbmp, true); } else - data = OpenJPEG.EncodeFromImage(mapbmp, false); + data = OpenJPEG.EncodeFromImage(mapbmp, true); if (data != null && data.Length > 0) { diff --git a/bin/Warp3D.dll b/bin/Warp3D.dll index d80037c433401d67f6acb460ae21f634b92a2932..f78102215b8f69e55dac0d24aca64bd79b026d2e 100755 GIT binary patch literal 73728 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 E0g&=fi2wiq literal 69632 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 P8-0