Fixed several unhandled exceptions and performance issues with PrimitiveBaseShape.Textures. This really should be moved from a property to a method if it is going to decode a byte[] into a TextureEntry each time
parent
d722519b31
commit
b4dcdffb50
|
@ -227,8 +227,12 @@ namespace OpenSim.Framework
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
//m_log.DebugFormat("[PRIMITIVE BASE SHAPE]: get m_textureEntry length {0}", m_textureEntry.Length);
|
//m_log.DebugFormat("[SHAPE]: get m_textureEntry length {0}", m_textureEntry.Length);
|
||||||
return new Primitive.TextureEntry(m_textureEntry, 0, m_textureEntry.Length);
|
try { return new Primitive.TextureEntry(m_textureEntry, 0, m_textureEntry.Length); }
|
||||||
|
catch { }
|
||||||
|
|
||||||
|
m_log.Warn("[SHAPE]: Failed to decode texture, length=" + ((m_textureEntry != null) ? m_textureEntry.Length : 0));
|
||||||
|
return new Primitive.TextureEntry(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
set { m_textureEntry = value.GetBytes(); }
|
set { m_textureEntry = value.GetBytes(); }
|
||||||
|
|
|
@ -285,24 +285,22 @@ namespace OpenSim.Region.CoreModules.Scripting.DynamicTexture
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte[] assetData;
|
byte[] assetData = null;
|
||||||
AssetBase oldAsset = null;
|
AssetBase oldAsset = null;
|
||||||
|
|
||||||
if (BlendWithOldTexture)
|
if (BlendWithOldTexture)
|
||||||
{
|
{
|
||||||
UUID lastTextureID = part.Shape.Textures.DefaultTexture.TextureID;
|
Primitive.TextureEntryFace defaultFace = part.Shape.Textures.DefaultTexture;
|
||||||
oldAsset = scene.AssetService.Get(lastTextureID.ToString());
|
if (defaultFace != null)
|
||||||
if (oldAsset != null)
|
|
||||||
{
|
{
|
||||||
assetData = BlendTextures(data, oldAsset.Data, SetNewFrontAlpha, FrontAlpha);
|
oldAsset = scene.AssetService.Get(defaultFace.TextureID.ToString());
|
||||||
}
|
|
||||||
else
|
if (oldAsset != null)
|
||||||
{
|
assetData = BlendTextures(data, oldAsset.Data, SetNewFrontAlpha, FrontAlpha);
|
||||||
assetData = new byte[data.Length];
|
|
||||||
Array.Copy(data, assetData, data.Length);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (assetData == null)
|
||||||
{
|
{
|
||||||
assetData = new byte[data.Length];
|
assetData = new byte[data.Length];
|
||||||
Array.Copy(data, assetData, data.Length);
|
Array.Copy(data, assetData, data.Length);
|
||||||
|
|
|
@ -251,13 +251,12 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
// if you want tree blocks on the map comment the above line and uncomment the below line
|
// if you want tree blocks on the map comment the above line and uncomment the below line
|
||||||
//mapdotspot = Color.PaleGreen;
|
//mapdotspot = Color.PaleGreen;
|
||||||
|
|
||||||
if (part.Shape.Textures == null)
|
Primitive.TextureEntry textureEntry = part.Shape.Textures;
|
||||||
|
|
||||||
|
if (textureEntry == null || textureEntry.DefaultTexture == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (part.Shape.Textures.DefaultTexture == null)
|
Color4 texcolor = textureEntry.DefaultTexture.RGBA;
|
||||||
continue;
|
|
||||||
|
|
||||||
Color4 texcolor = part.Shape.Textures.DefaultTexture.RGBA;
|
|
||||||
|
|
||||||
// Not sure why some of these are null, oh well.
|
// Not sure why some of these are null, oh well.
|
||||||
|
|
||||||
|
|
|
@ -203,44 +203,54 @@ namespace OpenSim.Region.DataSnapshot.Providers
|
||||||
{
|
{
|
||||||
string bestguess = string.Empty;
|
string bestguess = string.Empty;
|
||||||
Dictionary<UUID, int> counts = new Dictionary<UUID, int>();
|
Dictionary<UUID, int> counts = new Dictionary<UUID, int>();
|
||||||
if (sog.RootPart.Shape != null && sog.RootPart.Shape.ProfileShape == ProfileShape.Square &&
|
|
||||||
sog.RootPart.Shape.Textures != null && sog.RootPart.Shape.Textures.FaceTextures != null)
|
|
||||||
{
|
|
||||||
if (sog.RootPart.Shape.Textures.DefaultTexture.TextureID != UUID.Zero &&
|
|
||||||
sog.RootPart.Shape.Textures.DefaultTexture.TextureID != m_DefaultImage &&
|
|
||||||
sog.RootPart.Shape.Textures.DefaultTexture.TextureID != m_BlankImage &&
|
|
||||||
sog.RootPart.Shape.Textures.DefaultTexture.RGBA.A < 50)
|
|
||||||
{
|
|
||||||
counts[sog.RootPart.Shape.Textures.DefaultTexture.TextureID] = 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (Primitive.TextureEntryFace tentry in sog.RootPart.Shape.Textures.FaceTextures)
|
PrimitiveBaseShape shape = sog.RootPart.Shape;
|
||||||
|
if (shape != null && shape.ProfileShape == ProfileShape.Square)
|
||||||
|
{
|
||||||
|
Primitive.TextureEntry textures = shape.Textures;
|
||||||
|
if (textures != null)
|
||||||
{
|
{
|
||||||
if (tentry != null)
|
if (textures.DefaultTexture != null &&
|
||||||
|
textures.DefaultTexture.TextureID != UUID.Zero &&
|
||||||
|
textures.DefaultTexture.TextureID != m_DefaultImage &&
|
||||||
|
textures.DefaultTexture.TextureID != m_BlankImage &&
|
||||||
|
textures.DefaultTexture.RGBA.A < 50f)
|
||||||
{
|
{
|
||||||
if (tentry.TextureID != UUID.Zero && tentry.TextureID != m_DefaultImage && tentry.TextureID != m_BlankImage && tentry.RGBA.A < 50)
|
counts[textures.DefaultTexture.TextureID] = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (textures.FaceTextures != null)
|
||||||
|
{
|
||||||
|
foreach (Primitive.TextureEntryFace tentry in textures.FaceTextures)
|
||||||
{
|
{
|
||||||
int c = 0;
|
if (tentry != null)
|
||||||
counts.TryGetValue(tentry.TextureID, out c);
|
{
|
||||||
counts[tentry.TextureID] = c + 1;
|
if (tentry.TextureID != UUID.Zero && tentry.TextureID != m_DefaultImage && tentry.TextureID != m_BlankImage && tentry.RGBA.A < 50)
|
||||||
// decrease the default texture count
|
{
|
||||||
if (counts.ContainsKey(sog.RootPart.Shape.Textures.DefaultTexture.TextureID))
|
int c = 0;
|
||||||
counts[sog.RootPart.Shape.Textures.DefaultTexture.TextureID] = counts[sog.RootPart.Shape.Textures.DefaultTexture.TextureID] - 1;
|
counts.TryGetValue(tentry.TextureID, out c);
|
||||||
|
counts[tentry.TextureID] = c + 1;
|
||||||
|
// decrease the default texture count
|
||||||
|
if (counts.ContainsKey(textures.DefaultTexture.TextureID))
|
||||||
|
counts[textures.DefaultTexture.TextureID] = counts[textures.DefaultTexture.TextureID] - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Let's pick the most unique texture
|
||||||
|
int min = 9999;
|
||||||
|
foreach (KeyValuePair<UUID, int> kv in counts)
|
||||||
|
{
|
||||||
|
if (kv.Value < min && kv.Value >= 1)
|
||||||
|
{
|
||||||
|
bestguess = kv.Key.ToString();
|
||||||
|
min = kv.Value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Let's pick the most unique texture
|
|
||||||
int min = 9999;
|
|
||||||
foreach (KeyValuePair<UUID, int> kv in counts)
|
|
||||||
{
|
|
||||||
if (kv.Value < min && kv.Value >= 1)
|
|
||||||
{
|
|
||||||
bestguess = kv.Key.ToString();
|
|
||||||
min = kv.Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return bestguess;
|
return bestguess;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -129,19 +129,20 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Primitive.TextureEntry textureEntry = part.Shape.Textures;
|
Primitive.TextureEntry textureEntry = part.Shape.Textures;
|
||||||
|
if (textureEntry != null)
|
||||||
// Get the prim's default texture. This will be used for faces which don't have their own texture
|
|
||||||
assetUuids[textureEntry.DefaultTexture.TextureID] = AssetType.Texture;
|
|
||||||
|
|
||||||
// XXX: Not a great way to iterate through face textures, but there's no
|
|
||||||
// other method available to tell how many faces there actually are
|
|
||||||
//int i = 0;
|
|
||||||
foreach (Primitive.TextureEntryFace texture in textureEntry.FaceTextures)
|
|
||||||
{
|
{
|
||||||
if (texture != null)
|
// Get the prim's default texture. This will be used for faces which don't have their own texture
|
||||||
|
if (textureEntry.DefaultTexture != null)
|
||||||
|
assetUuids[textureEntry.DefaultTexture.TextureID] = AssetType.Texture;
|
||||||
|
|
||||||
|
if (textureEntry.FaceTextures != null)
|
||||||
{
|
{
|
||||||
//m_log.DebugFormat("[ARCHIVER]: Got face {0}", i++);
|
// Loop through the rest of the texture faces (a non-null face means the face is different from DefaultTexture)
|
||||||
assetUuids[texture.TextureID] = AssetType.Texture;
|
foreach (Primitive.TextureEntryFace texture in textureEntry.FaceTextures)
|
||||||
|
{
|
||||||
|
if (texture != null)
|
||||||
|
assetUuids[texture.TextureID] = AssetType.Texture;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue