From e0b2ee80f9a0325405124a189d2d36a5e9478efc Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 26 May 2018 23:03:27 +0100 Subject: [PATCH] fix a bug on warp3d.dll --- .../World/Warp3DMap/Warp3DImageModule.cs | 128 +++++++++--------- bin/Warp3D.dll | Bin 74240 -> 74240 bytes 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs index d76bdf7316..69c7b57a25 100644 --- a/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs +++ b/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs @@ -107,7 +107,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap Util.GetConfigVarFromSections(m_config, "TextureOnMapTile", configSections, m_textureTerrain); m_textureAverageTerrain = Util.GetConfigVarFromSections(m_config, "AverageTextureColorOnMapTile", configSections, m_textureAverageTerrain); - if(m_textureAverageTerrain) + if (m_textureAverageTerrain) m_textureTerrain = true; m_texturePrims = Util.GetConfigVarFromSections(m_config, "TexturePrims", configSections, m_texturePrims); @@ -116,7 +116,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap m_renderMeshes = Util.GetConfigVarFromSections(m_config, "RenderMeshes", configSections, m_renderMeshes); - } + } public void AddRegion(Scene scene) { @@ -227,7 +227,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap WarpRenderer renderer = new WarpRenderer(); - if(!renderer.CreateScene(viewWitdh, viewHeigth)) + if (!renderer.CreateScene(viewWitdh, viewHeigth)) return new Bitmap(viewWitdh, viewHeigth); #region Camera @@ -235,16 +235,16 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap warp_Vector pos = ConvertVector(cameraPos); warp_Vector lookat = warp_Vector.add(pos, ConvertVector(cameraDir)); - if(orto) + if (orto) renderer.Scene.defaultCamera.setOrthographic(true, viewWitdh, viewHeigth); else - renderer.Scene.defaultCamera.setFov(fov); - + renderer.Scene.defaultCamera.setFov(fov); + renderer.Scene.defaultCamera.setPos(pos); renderer.Scene.defaultCamera.lookAt(lookat); #endregion Camera - renderer.Scene.setAmbient(warp_Color.getColor(192,191,173)); + renderer.Scene.setAmbient(warp_Color.getColor(192, 191, 173)); renderer.Scene.addLight("Light1", new warp_Light(new warp_Vector(0f, 1f, 8f), warp_Color.White, 0, 320, 40)); CreateWater(renderer); @@ -297,9 +297,9 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap waterHeight, m_scene.RegionInfo.RegionSizeY * 0.5f); - warp_Material waterColorMaterial = new warp_Material(ConvertColor(WATER_COLOR)); - renderer.Scene.addMaterial("WaterColor", waterColorMaterial); - renderer.SetObjectMaterial("Water", "WaterColor"); + warp_Material waterMaterial = new warp_Material(ConvertColor(WATER_COLOR)); + renderer.Scene.addMaterial("WaterMat", waterMaterial); + renderer.SetObjectMaterial("Water", "WaterMat"); } // Add a terrain to the renderer. @@ -321,9 +321,9 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap 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 :( + if (bitWidth > 8) // more than 256 is very heavy :( bitWidth = 8; - if(bitHeight > 8) + if (bitHeight > 8) bitHeight = 8; int twidth = (int)Math.Pow(2, bitWidth); @@ -350,20 +350,20 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap tv = y * invsy; for (x = 0; x < regionsx; x += diff) { - pos = ConvertVector(x , y , (float)terrain[(int)x, (int)y]); - obj.addVertex(new warp_Vertex(pos, x * invsx, tv )); + pos = ConvertVector(x, y, (float)terrain[(int)x, (int)y]); + obj.addVertex(new warp_Vertex(pos, x * invsx, tv)); } - pos = ConvertVector(x , y , (float)terrain[(int)(x - diff), (int)y]); + pos = ConvertVector(x, y, (float)terrain[(int)(x - diff), (int)y]); obj.addVertex(new warp_Vertex(pos, 1.0f, tv)); } int lastY = (int)(y - diff); for (x = 0; x < regionsx; x += diff) { - pos = ConvertVector(x , y , (float)terrain[(int)x, lastY]); - obj.addVertex(new warp_Vertex(pos, x * invsx, 1.0f)); + pos = ConvertVector(x, y, (float)terrain[(int)x, lastY]); + obj.addVertex(new warp_Vertex(pos, x * invsx, 1.0f)); } - pos = ConvertVector(x , y , (float)terrain[(int)(x - diff), lastY]); + pos = ConvertVector(x, y, (float)terrain[(int)(x - diff), lastY]); obj.addVertex(new warp_Vertex(pos, 1.0f, 1.0f)); // create triangles. @@ -410,7 +410,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap heightRanges[1] = (float)regionInfo.Elevation2NW; heightRanges[2] = (float)regionInfo.Elevation2SE; heightRanges[3] = (float)regionInfo.Elevation2NE; - + warp_Texture texture; using (Bitmap image = TerrainSplat.Splat(terrain, textureIDs, startHeights, heightRanges, m_scene.RegionInfo.WorldLocX, m_scene.RegionInfo.WorldLocY, @@ -419,8 +419,8 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap texture = new warp_Texture(image); warp_Material material = new warp_Material(texture); - renderer.Scene.addMaterial("TerrainColor", material); - renderer.SetObjectMaterial("Terrain", "TerrainColor"); + renderer.Scene.addMaterial("TerrainMat", material); + renderer.SetObjectMaterial("Terrain", "TerrainMat"); } private void CreateAllPrims(WarpRenderer renderer) @@ -429,14 +429,14 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap return; m_scene.ForEachSOG( - delegate(SceneObjectGroup group) + delegate (SceneObjectGroup group) { foreach (SceneObjectPart child in group.Parts) CreatePrim(renderer, child); } ); } - + private void CreatePrim(WarpRenderer renderer, SceneObjectPart prim) { if ((PCode)prim.Shape.PCode != PCode.Prim) @@ -447,14 +447,14 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap warp_Matrix m = warp_Matrix.quaternionMatrix(primRot); float screenFactor = renderer.Scene.EstimateBoxProjectedArea(primPos, ConvertVector(prim.Scale), m); - if(screenFactor < 0) + if (screenFactor < 0) return; int p2 = (int)(-(float)Math.Log(screenFactor) * 1.442695f * 0.5 - 1); - if(p2 < 0) + if (p2 < 0) p2 = 0; - else if(p2 > 3) + else if (p2 > 3) p2 = 3; DetailLevel lod = (DetailLevel)(3 - p2); @@ -479,12 +479,12 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap } else // It's sculptie { - if(m_imgDecoder != null) + if (m_imgDecoder != null) { Image sculpt = m_imgDecoder.DecodeToImage(sculptAsset); - if(sculpt != null) + if (sculpt != null) { - renderMesh = m_primMesher.GenerateFacetedSculptMesh(omvPrim,(Bitmap)sculpt, lod); + renderMesh = m_primMesher.GenerateFacetedSculptMesh(omvPrim, (Bitmap)sculpt, lod); sculpt.Dispose(); } } @@ -519,27 +519,27 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap Primitive.TextureEntryFace teFace = prim.Shape.Textures.GetFace((uint)i); Color4 faceColor = teFace.RGBA; - if(faceColor.A == 0) + if (faceColor.A == 0) continue; string materialName = String.Empty; if (m_texturePrims) { -// if(lod > DetailLevel.Low) + // 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; + // 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, faceColor); + materialName = GetOrCreateMaterial(renderer, faceColor); - if(renderer.Scene.material(materialName).getTexture() == null) + if (renderer.Scene.material(materialName).getTexture() == null) { // uv map details dont not matter for color; for (int j = 0; j < face.Vertices.Count; j++) @@ -549,7 +549,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap warp_Vertex vert = new warp_Vertex(pos, v.TexCoord.X, v.TexCoord.Y); faceObj.addVertex(vert); } - } + } else { float tu; @@ -561,7 +561,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap float rotation = teFace.Rotation; float rc = 0; float rs = 0; - if(rotation != 0) + if (rotation != 0) { rc = (float)Math.Cos(rotation); rs = (float)Math.Sin(rotation); @@ -574,7 +574,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap warp_Vector pos = ConvertVector(v.Position); tu = v.TexCoord.X - 0.5f; tv = 0.5f - v.TexCoord.Y; - if(rotation != 0) + if (rotation != 0) { float tur = tu * rc - tv * rs; float tvr = tu * rs + tv * rc; @@ -593,10 +593,10 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap tv += offsetv; vert = new warp_Vertex(pos, tu, tv); } - + faceObj.addVertex(vert); } - } + } for (int j = 0; j < face.Indices.Count; j += 3) { @@ -628,7 +628,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap bool fetched = false; // Attempt to fetch the texture metadata - string cacheName = "MAPCLR"+face.TextureID.ToString(); + string cacheName = "MAPCLR" + face.TextureID.ToString(); AssetBase metadata = m_scene.AssetService.GetCached(cacheName); if (metadata != null) { @@ -637,7 +637,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap if (map != null) { - ctmp = map["X-RGBA"].AsColor4(); + ctmp = map["X-RGBA"].AsColor4(); fetched = true; } } @@ -704,14 +704,14 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap warp_Texture texture = GetTexture(textureID); if (texture != null) { - if(useAverageTextureColor) - color = warp_Color.multiply(color, texture.averageColor); + if (useAverageTextureColor) + color = warp_Color.multiply(color, texture.averageColor); else mat.setTexture(texture); } else - color = warp_Color.multiply(color, warp_Color.Grey); - + color = warp_Color.multiply(color, warp_Color.Grey); + mat.setColor(color); renderer.Scene.addMaterial(materialName, mat); @@ -721,16 +721,16 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap private warp_Texture GetTexture(UUID id) { warp_Texture ret = null; - if(id == UUID.Zero) + if (id == UUID.Zero) return ret; - if(m_warpTextures.TryGetValue(id.ToString(), out ret)) + if (m_warpTextures.TryGetValue(id.ToString(), out ret)) return ret; byte[] asset = m_scene.AssetService.GetData(id.ToString()); if (asset != null) - { + { try { using (Bitmap img = (Bitmap)m_imgDecoder.DecodeToImage(asset)) @@ -761,7 +761,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap private static warp_Quaternion ConvertQuaternion(Quaternion quat) { - return new warp_Quaternion(quat.X, quat.Z, quat.Y, -quat.W); + return new warp_Quaternion(quat.X, quat.Z, quat.Y, -quat.W); } private static int ConvertColor(Color4 color) @@ -791,8 +791,8 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap try { - using(MemoryStream stream = new MemoryStream(j2kData)) - using(Bitmap bitmap = (Bitmap)J2kImage.FromStream(stream)) + using (MemoryStream stream = new MemoryStream(j2kData)) + using (Bitmap bitmap = (Bitmap)J2kImage.FromStream(stream)) { width = bitmap.Width; height = bitmap.Height; @@ -803,13 +803,13 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap // 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); - for(int x = 0; x < width; x++) + for (int x = 0; x < width; x++) { b += row[x * pixelBytes + 0]; g += row[x * pixelBytes + 1]; @@ -820,11 +820,11 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap } else { - for(int y = 0; y < height; y++) + for (int y = 0; y < height; y++) { byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride); - for(int x = 0; x < width; x++) + for (int x = 0; x < width; x++) { b += row[x * pixelBytes + 0]; g += row[x * pixelBytes + 1]; @@ -843,13 +843,13 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap decimal bm = ((decimal)b / totalPixels) * OO_255; decimal am = ((decimal)a / totalPixels) * OO_255; - if(pixelBytes == 3) + if (pixelBytes == 3) am = 1m; return new Color4((float)rm, (float)gm, (float)bm, (float)am); } - catch(Exception ex) + catch (Exception ex) { m_log.WarnFormat( "[WARP 3D IMAGE MODULE]: Error decoding JPEG2000 texture {0} ({1} bytes): {2}", diff --git a/bin/Warp3D.dll b/bin/Warp3D.dll index 29cd0bfc032bd4c366ca299d26cb863ab841cd5e..7d662d92fa3407121ac30b1aa6a11176c3a7f4a9 100755 GIT binary patch delta 5123 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 SwKqbr=y_j1-8XP;Z~i~<8E5MN delta 5169 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