From 5e4d6cab00cb29cd088ab7b62ab13aff103b64cb Mon Sep 17 00:00:00 2001 From: onefang Date: Sun, 19 May 2019 21:24:15 +1000 Subject: Dump OpenSim 0.9.0.1 into it's own branch. --- .../World/Warp3DMap/Warp3DImageModule.cs | 239 +++++++++------------ 1 file changed, 96 insertions(+), 143 deletions(-) (limited to 'OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs') diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs index 383a67f..4934ebd 100644 --- a/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs +++ b/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs @@ -35,7 +35,7 @@ using System.Reflection; using CSJ2K; using Nini.Config; using log4net; -using Rednettle.Warp3D; +using Warp3D; using Mono.Addins; using OpenSim.Framework; @@ -76,10 +76,12 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap private bool m_texturePrims = true; // true if should texture the rendered prims private float m_texturePrimSize = 48f; // size of prim before we consider texturing it private bool m_renderMeshes = false; // true if to render meshes rather than just bounding boxes - private bool m_useAntiAliasing = false; // true if to anti-alias the rendered image private bool m_Enabled = false; +// private Bitmap lastImage = null; + private DateTime lastImageTime = DateTime.MinValue; + #region Region Module interface public void Initialise(IConfigSource source) @@ -94,9 +96,9 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap m_Enabled = true; - m_drawPrimVolume + m_drawPrimVolume = Util.GetConfigVarFromSections(m_config, "DrawPrimOnMapTile", configSections, m_drawPrimVolume); - m_textureTerrain + m_textureTerrain = Util.GetConfigVarFromSections(m_config, "TextureOnMapTile", configSections, m_textureTerrain); m_texturePrims = Util.GetConfigVarFromSections(m_config, "TexturePrims", configSections, m_texturePrims); @@ -104,10 +106,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap = Util.GetConfigVarFromSections(m_config, "TexturePrimSize", configSections, m_texturePrimSize); m_renderMeshes = Util.GetConfigVarFromSections(m_config, "RenderMeshes", configSections, m_renderMeshes); - m_useAntiAliasing - = Util.GetConfigVarFromSections(m_config, "UseAntiAliasing", configSections, m_useAntiAliasing); - - } + } public void AddRegion(Scene scene) { @@ -118,14 +117,9 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap List renderers = RenderingLoader.ListRenderers(Util.ExecutingDirectory()); if (renderers.Count > 0) - { - m_primMesher = RenderingLoader.LoadRenderer(renderers[0]); - m_log.DebugFormat("[WARP 3D IMAGE MODULE]: Loaded prim mesher {0}", m_primMesher); - } + m_log.Info("[MAPTILE]: Loaded prim mesher " + renderers[0]); else - { - m_log.Debug("[WARP 3D IMAGE MODULE]: No prim mesher loaded, prim rendering will be disabled"); - } + m_log.Info("[MAPTILE]: No prim mesher loaded, prim rendering will be disabled"); m_scene.RegisterModuleInterface(this); } @@ -158,18 +152,36 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap public Bitmap CreateMapTile() { - // Vector3 camPos = new Vector3(127.5f, 127.5f, 221.7025033688163f); - // Camera above the middle of the region + /* this must be on all map, not just its image + if ((DateTime.Now - lastImageTime).TotalSeconds < 3600) + { + return (Bitmap)lastImage.Clone(); + } + */ + + List renderers = RenderingLoader.ListRenderers(Util.ExecutingDirectory()); + if (renderers.Count > 0) + { + m_primMesher = RenderingLoader.LoadRenderer(renderers[0]); + } + Vector3 camPos = new Vector3( - m_scene.RegionInfo.RegionSizeX/2 - 0.5f, - m_scene.RegionInfo.RegionSizeY/2 - 0.5f, + m_scene.RegionInfo.RegionSizeX / 2 - 0.5f, + m_scene.RegionInfo.RegionSizeY / 2 - 0.5f, 221.7025033688163f); // Viewport viewing down onto the region Viewport viewport = new Viewport(camPos, -Vector3.UnitZ, 1024f, 0.1f, (int)m_scene.RegionInfo.RegionSizeX, (int)m_scene.RegionInfo.RegionSizeY, - (float)m_scene.RegionInfo.RegionSizeX, (float)m_scene.RegionInfo.RegionSizeY ); - // Fill the viewport and return the image - return CreateMapTile(viewport, false); + (float)m_scene.RegionInfo.RegionSizeX, (float)m_scene.RegionInfo.RegionSizeY); + + Bitmap tile = CreateMapTile(viewport, false); + m_primMesher = null; + return tile; +/* + lastImage = tile; + lastImageTime = DateTime.Now; + return (Bitmap)lastImage.Clone(); + */ } public Bitmap CreateViewImage(Vector3 camPos, Vector3 camDir, float fov, int width, int height, bool useTextures) @@ -185,21 +197,14 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap int width = viewport.Width; int height = viewport.Height; - if (m_useAntiAliasing) - { - width *= 2; - height *= 2; - } - WarpRenderer renderer = new WarpRenderer(); - renderer.CreateScene(width, height); - renderer.Scene.autoCalcNormals = false; + if(!renderer.CreateScene(width, height)) + return new Bitmap(width,height); #region Camera warp_Vector pos = ConvertVector(viewport.Position); - pos.z -= 0.001f; // Works around an issue with the Warp3D camera warp_Vector lookat = warp_Vector.add(ConvertVector(viewport.Position), ConvertVector(viewport.LookDirection)); renderer.Scene.defaultCamera.setPos(pos); @@ -207,9 +212,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap if (viewport.Orthographic) { - renderer.Scene.defaultCamera.isOrthographic = true; - renderer.Scene.defaultCamera.orthoViewWidth = viewport.OrthoWindowWidth; - renderer.Scene.defaultCamera.orthoViewHeight = viewport.OrthoWindowHeight; + renderer.Scene.defaultCamera.setOrthographic(true,viewport.OrthoWindowWidth, viewport.OrthoWindowHeight); } else { @@ -231,24 +234,8 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap renderer.Render(); Bitmap bitmap = renderer.Scene.getImage(); - if (m_useAntiAliasing) - { - using (Bitmap origBitmap = bitmap) - bitmap = ImageUtils.ResizeImage(origBitmap, viewport.Width, viewport.Height); - } - - // XXX: It shouldn't really be necesary to force a GC here as one should occur anyway pretty shortly - // afterwards. It's generally regarded as a bad idea to manually GC. If Warp3D is using lots of memory - // then this may be some issue with the Warp3D code itself, though it's also quite possible that generating - // this map tile simply takes a lot of memory. - foreach (var o in renderer.Scene.objectData.Values) - { - warp_Object obj = (warp_Object)o; - obj.vertexData = null; - obj.triangleData = null; - } - - renderer.Scene.removeAllObjects(); + renderer.Scene.destroy(); + renderer.Reset(); renderer = null; viewport = null; @@ -285,12 +272,12 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap float waterHeight = (float)m_scene.RegionInfo.RegionSettings.WaterHeight; renderer.AddPlane("Water", m_scene.RegionInfo.RegionSizeX * 0.5f); - renderer.Scene.sceneobject("Water").setPos(m_scene.RegionInfo.RegionSizeX/2 - 0.5f, + renderer.Scene.sceneobject("Water").setPos(m_scene.RegionInfo.RegionSizeX * 0.5f - 0.5f, waterHeight, - m_scene.RegionInfo.RegionSizeY/2 - 0.5f ); + m_scene.RegionInfo.RegionSizeY * 0.5f - 0.5f); warp_Material waterColorMaterial = new warp_Material(ConvertColor(WATER_COLOR)); - waterColorMaterial.setReflectivity(0); // match water color with standard map module thanks lkalif + 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"); @@ -303,53 +290,53 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap { ITerrainChannel terrain = m_scene.Heightmap; + float regionsx = m_scene.RegionInfo.RegionSizeX; + 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 = (float)m_scene.RegionInfo.RegionSizeX / 256f; + float diff = regionsx / 256f; - warp_Object obj = new warp_Object(256 * 256, 255 * 255 * 2); + int npointsx =(int)(regionsx / diff); + int npointsy =(int)(regionsy / diff); + + float invsx = 1.0f / regionsx; + float invsy = 1.0f / (float)m_scene.RegionInfo.RegionSizeY; // Create all the vertices for the terrain - for (float y = 0; y < m_scene.RegionInfo.RegionSizeY; y += diff) + warp_Object obj = new warp_Object(); + for (float y = 0; y < regionsy; y += diff) { - for (float x = 0; x < m_scene.RegionInfo.RegionSizeX; x += diff) + for (float x = 0; x < regionsx; x += diff) { - warp_Vector pos = ConvertVector(x, y, (float)terrain[(int)x, (int)y]); - obj.addVertex(new warp_Vertex(pos, - x / (float)m_scene.RegionInfo.RegionSizeX, - (((float)m_scene.RegionInfo.RegionSizeY) - y) / m_scene.RegionInfo.RegionSizeY) ); + warp_Vector pos = ConvertVector(x , y , (float)terrain[(int)x, (int)y]); + obj.addVertex(new warp_Vertex(pos, x * invsx, 1.0f - y * invsy)); } } - // Now that we have all the vertices, make another pass and create - // the normals for each of the surface triangles and - // create the list of triangle indices. - for (float y = 0; y < m_scene.RegionInfo.RegionSizeY; y += diff) + // Now that we have all the vertices, make another pass and + // create the list of triangle indices. + float invdiff = 1.0f / diff; + int limx = npointsx - 1; + int limy = npointsy - 1; + for (float y = 0; y < regionsy; y += diff) { - for (float x = 0; x < m_scene.RegionInfo.RegionSizeX; x += diff) + for (float x = 0; x < regionsx; x += diff) { - float newX = x / diff; - float newY = y / diff; - if (newX < 255 && newY < 255) + float newX = x * invdiff; + float newY = y * invdiff; + if (newX < limx && newY < limy) { - int v = (int)newY * 256 + (int)newX; - - // Normal for a triangle made up of three adjacent vertices - Vector3 v1 = new Vector3(newX, newY, (float)terrain[(int)x, (int)y]); - Vector3 v2 = new Vector3(newX + 1, newY, (float)terrain[(int)(x + 1), (int)y]); - Vector3 v3 = new Vector3(newX, newY + 1, (float)terrain[(int)x, ((int)(y + 1))]); - warp_Vector norm = ConvertVector(SurfaceNormal(v1, v2, v3)); - norm = norm.reverse(); - obj.vertex(v).n = norm; + int v = (int)newY * npointsx + (int)newX; // Make two triangles for each of the squares in the grid of vertices obj.addTriangle( v, v + 1, - v + 256); + v + npointsx); obj.addTriangle( - v + 256 + 1, - v + 256, + v + npointsx + 1, + v + npointsx, v + 1); } } @@ -382,18 +369,15 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap Util.RegionHandleToWorldLoc(m_scene.RegionInfo.RegionHandle, out globalX, out globalY); warp_Texture texture; - using ( - Bitmap image - = TerrainSplat.Splat(terrain, textureIDs, startHeights, heightRanges, + using (Bitmap image = TerrainSplat.Splat( + terrain, textureIDs, startHeights, heightRanges, new Vector3d(globalX, globalY, 0.0), m_scene.AssetService, textureTerrain)) - { texture = new warp_Texture(image); - } warp_Material material = new warp_Material(texture); material.setReflectivity(50); renderer.Scene.addMaterial("TerrainColor", material); - renderer.Scene.material("TerrainColor").setReflectivity(0); // reduces tile seams a bit thanks lkalif + renderer.Scene.material("TerrainColor").setReflectivity(0); // reduces tile seams a bit thanks lkalif renderer.SetObjectMaterial("Terrain", "TerrainColor"); } @@ -414,11 +398,13 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap private void CreatePrim(WarpRenderer renderer, SceneObjectPart prim, bool useTextures) { - const float MIN_SIZE = 2f; + const float MIN_SIZE_SQUARE = 4f; if ((PCode)prim.Shape.PCode != PCode.Prim) return; - if (prim.Scale.LengthSquared() < MIN_SIZE * MIN_SIZE) + float primScaleLenSquared = prim.Scale.LengthSquared(); + + if (primScaleLenSquared < MIN_SIZE_SQUARE) return; FacetedMesh renderMesh = null; @@ -442,25 +428,14 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap else // It's sculptie { IJ2KDecoder imgDecoder = m_scene.RequestModuleInterface(); - if (imgDecoder != null) + if(imgDecoder != null) { - try + Image sculpt = imgDecoder.DecodeToImage(sculptAsset); + if(sculpt != null) { - Image sculpt = imgDecoder.DecodeToImage(sculptAsset); - if (sculpt != null) - { - renderMesh = m_primMesher.GenerateFacetedSculptMesh(omvPrim, (Bitmap)sculpt, - DetailLevel.Medium); - sculpt.Dispose(); - } - } - catch (Exception e) - { - Vector3 objectPos = prim.ParentGroup.RootPart.AbsolutePosition; -//// TODO - print out owner of SceneObjectPart prim. - m_log.Warn(string.Format("[WARP 3D IMAGE MODULE]: Failed to decode asset {0} @ {1},{2},{3} - {4}.", - omvPrim.Sculpt.SculptTexture, objectPos.X, objectPos.Y, objectPos.Z, - prim.ParentGroup.RootPart.Name)); + renderMesh = m_primMesher.GenerateFacetedSculptMesh(omvPrim,(Bitmap)sculpt, + DetailLevel.Medium); + sculpt.Dispose(); } } } @@ -477,20 +452,6 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap if (renderMesh == null) return; - warp_Vector primPos = ConvertVector(prim.GetWorldPosition()); - warp_Quaternion primRot = ConvertQuaternion(prim.RotationOffset); - - warp_Matrix m = warp_Matrix.quaternionMatrix(primRot); - - if (prim.ParentID != 0) - { - SceneObjectGroup group = m_scene.SceneGraph.GetGroupByPrim(prim.LocalId); - if (group != null) - m.transform(warp_Matrix.quaternionMatrix(ConvertQuaternion(group.RootPart.RotationOffset))); - } - - warp_Vector primScale = ConvertVector(prim.Scale); - string primID = prim.UUID.ToString(); // Create the prim faces @@ -498,27 +459,18 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap for (int i = 0; i < renderMesh.Faces.Count; i++) { Face face = renderMesh.Faces[i]; - string meshName = primID + "-Face-" + i.ToString(); + string meshName = primID + i.ToString(); // Avoid adding duplicate meshes to the scene if (renderer.Scene.objectData.ContainsKey(meshName)) - { continue; - } - - warp_Object faceObj = new warp_Object(face.Vertices.Count, face.Indices.Count / 3); + warp_Object faceObj = new warp_Object(); for (int j = 0; j < face.Vertices.Count; j++) { Vertex v = face.Vertices[j]; - warp_Vector pos = ConvertVector(v.Position); - warp_Vector norm = ConvertVector(v.Normal); - - if (prim.Shape.SculptTexture == UUID.Zero) - norm = norm.reverse(); - warp_Vertex vert = new warp_Vertex(pos, norm, v.TexCoord.X, v.TexCoord.Y); - + warp_Vertex vert = new warp_Vertex(pos, v.TexCoord.X, v.TexCoord.Y); faceObj.addVertex(vert); } @@ -533,17 +485,19 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap Primitive.TextureEntryFace teFace = prim.Shape.Textures.GetFace((uint)i); Color4 faceColor = GetFaceColor(teFace); string materialName = String.Empty; - if (m_texturePrims && prim.Scale.LengthSquared() > m_texturePrimSize*m_texturePrimSize) + if (m_texturePrims && primScaleLenSquared > m_texturePrimSize*m_texturePrimSize) materialName = GetOrCreateMaterial(renderer, faceColor, teFace.TextureID); else materialName = GetOrCreateMaterial(renderer, faceColor); + warp_Vector primPos = ConvertVector(prim.GetWorldPosition()); + warp_Quaternion primRot = ConvertQuaternion(prim.GetWorldRotation()); + warp_Matrix m = warp_Matrix.quaternionMatrix(primRot); faceObj.transform(m); faceObj.setPos(primPos); - faceObj.scaleSelf(primScale.x, primScale.y, primScale.z); + faceObj.scaleSelf(prim.Scale.X, prim.Scale.Z, prim.Scale.Y); renderer.Scene.addObject(meshName, faceObj); - renderer.SetObjectMaterial(meshName, materialName); } } @@ -576,7 +530,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap if (!fetched) { - // Fetch the texture, decode and get the average color, + // Fetch the texture, decode and get the average color, // then save it to a temporary metadata asset AssetBase textureAsset = m_scene.AssetService.Get(face.TextureID.ToString()); if (textureAsset != null) @@ -671,7 +625,6 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap #endregion Rendering Methods #region Static Helpers - // Note: axis change. private static warp_Vector ConvertVector(float x, float y, float z) { @@ -725,10 +678,10 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap { 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 { @@ -737,7 +690,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap for (int y = 0; y < height; y++) { byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride); - + for (int x = 0; x < width; x++) { b += row[x * pixelBytes + 0]; @@ -752,7 +705,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap for (int y = 0; y < height; y++) { byte* row = (byte*)bitmapData.Scan0 + (y * bitmapData.Stride); - + for (int x = 0; x < width; x++) { b += row[x * pixelBytes + 0]; -- cgit v1.1