Experimental decoded sculpt map caching

0.6.6-post-fixes
Dahlia Trimble 2009-05-29 02:46:35 +00:00
parent 1e9cb2f8fc
commit db4f8d1298
3 changed files with 55 additions and 20 deletions

View File

@ -2967,8 +2967,12 @@ namespace OpenSim.Region.Framework.Scenes
{ {
if (part.Shape.SculptEntry && part.Shape.SculptTexture != UUID.Zero) if (part.Shape.SculptEntry && part.Shape.SculptTexture != UUID.Zero)
{ {
m_scene.AssetService.Get( // check if a previously decoded sculpt map has been cached
part.Shape.SculptTexture.ToString(), part, AssetReceived); if (File.Exists(System.IO.Path.Combine("j2kDecodeCache", "smap_" + part.Shape.SculptTexture.ToString())))
part.SculptTextureCallback(part.Shape.SculptTexture, null);
else
m_scene.AssetService.Get(
part.Shape.SculptTexture.ToString(), part, AssetReceived);
} }
} }
} }

View File

@ -2268,7 +2268,7 @@ if (m_shape != null) {
{ {
if (m_shape.SculptEntry) if (m_shape.SculptEntry)
{ {
if (texture != null) //if (texture != null) // null could mean a cached sculpt map has been found
{ {
m_shape.SculptData = texture.Data; m_shape.SculptData = texture.Data;
if (PhysActor != null) if (PhysActor != null)

View File

@ -37,6 +37,7 @@ using System.Drawing.Imaging;
using PrimMesher; using PrimMesher;
using log4net; using log4net;
using System.Reflection; using System.Reflection;
using System.IO;
namespace OpenSim.Region.Physics.Meshing namespace OpenSim.Region.Physics.Meshing
{ {
@ -70,6 +71,8 @@ namespace OpenSim.Region.Physics.Meshing
private const string baseDir = null; //"rawFiles"; private const string baseDir = null; //"rawFiles";
#endif #endif
private string decodedScultMapPath = "j2kDecodeCache";
private float minSizeForComplexMesh = 0.2f; // prims with all dimensions smaller than this will have a bounding box mesh private float minSizeForComplexMesh = 0.2f; // prims with all dimensions smaller than this will have a bounding box mesh
@ -176,34 +179,62 @@ namespace OpenSim.Region.Physics.Meshing
List<Face> faces; List<Face> faces;
Image idata = null; Image idata = null;
string decodedSculptFileName = "";
if (primShape.SculptEntry) if (primShape.SculptEntry)
{ {
if (primShape.SculptData.Length == 0) if (primShape.SculptData.Length == 0)
return null; return null;
try if (primShape.SculptTexture != null)
{ {
ManagedImage managedImage; // we never use this decodedSculptFileName = System.IO.Path.Combine(decodedScultMapPath, "smap_" + primShape.SculptTexture.ToString());
OpenJPEG.DecodeToImage(primShape.SculptData, out managedImage, out idata); try
{
if (File.Exists(decodedSculptFileName))
{
idata = Image.FromFile(decodedSculptFileName);
}
}
catch (Exception e)
{
m_log.Error("[SCULPT]: unable to load cached sculpt map " + decodedSculptFileName + " " + e.Message);
}
if (idata != null)
m_log.Debug("[SCULPT]: loaded cached map asset for map ID: " + primShape.SculptTexture.ToString());
} }
catch (DllNotFoundException)
if (idata == null)
{ {
m_log.Error("[PHYSICS]: OpenJpeg is not installed correctly on this system. Physics Proxy generation failed. Often times this is because of an old version of GLIBC. You must have version 2.4 or above!"); try
return null; {
} ManagedImage managedImage; // we never use this
catch (IndexOutOfRangeException) OpenJPEG.DecodeToImage(primShape.SculptData, out managedImage, out idata);
{
m_log.Error("[PHYSICS]: OpenJpeg was unable to decode this. Physics Proxy generation failed"); //if (File.Exists(System.IO.Path.GetDirectoryName(decodedScultMapPath)))
return null; try { idata.Save(decodedSculptFileName, ImageFormat.MemoryBmp); }
} catch (Exception e) { m_log.Error("[SCULPT]: unable to cache sculpt map " + decodedSculptFileName + " " + e.Message); }
catch (Exception) }
{ catch (DllNotFoundException)
m_log.Error("[PHYSICS]: Unable to generate a Sculpty physics proxy. Sculpty texture decode failed!"); {
return null; m_log.Error("[PHYSICS]: OpenJpeg is not installed correctly on this system. Physics Proxy generation failed. Often times this is because of an old version of GLIBC. You must have version 2.4 or above!");
return null;
}
catch (IndexOutOfRangeException)
{
m_log.Error("[PHYSICS]: OpenJpeg was unable to decode this. Physics Proxy generation failed");
return null;
}
catch (Exception)
{
m_log.Error("[PHYSICS]: Unable to generate a Sculpty physics proxy. Sculpty texture decode failed!");
return null;
}
} }
PrimMesher.SculptMesh.SculptType sculptType; PrimMesher.SculptMesh.SculptType sculptType;
switch ((OpenMetaverse.SculptType)primShape.SculptType) switch ((OpenMetaverse.SculptType)primShape.SculptType)
{ {