If the compile-time DynamicTextureModule.ReuseTextures flag is set, check metadata still exists for any reused asset in case some other process has removed it from the cache.
parent
a100723aaf
commit
6c36471f0c
|
@ -186,63 +186,79 @@ namespace OpenSim.Region.CoreModules.Scripting.DynamicTexture
|
||||||
public UUID AddDynamicTextureData(UUID simID, UUID primID, string contentType, string data,
|
public UUID AddDynamicTextureData(UUID simID, UUID primID, string contentType, string data,
|
||||||
string extraParams, int updateTimer, bool SetBlending, int disp, byte AlphaValue, int face)
|
string extraParams, int updateTimer, bool SetBlending, int disp, byte AlphaValue, int face)
|
||||||
{
|
{
|
||||||
if (RenderPlugins.ContainsKey(contentType))
|
if (!RenderPlugins.ContainsKey(contentType))
|
||||||
|
return UUID.Zero;
|
||||||
|
|
||||||
|
Scene scene;
|
||||||
|
RegisteredScenes.TryGetValue(simID, out scene);
|
||||||
|
|
||||||
|
if (scene == null)
|
||||||
|
return UUID.Zero;
|
||||||
|
|
||||||
|
SceneObjectPart part = scene.GetSceneObjectPart(primID);
|
||||||
|
|
||||||
|
if (part == null)
|
||||||
|
return UUID.Zero;
|
||||||
|
|
||||||
|
// If we want to reuse dynamic textures then we have to ignore any request from the caller to expire
|
||||||
|
// them.
|
||||||
|
if (ReuseTextures)
|
||||||
|
disp = disp & ~DISP_EXPIRE;
|
||||||
|
|
||||||
|
DynamicTextureUpdater updater = new DynamicTextureUpdater();
|
||||||
|
updater.SimUUID = simID;
|
||||||
|
updater.PrimID = primID;
|
||||||
|
updater.ContentType = contentType;
|
||||||
|
updater.BodyData = data;
|
||||||
|
updater.UpdateTimer = updateTimer;
|
||||||
|
updater.UpdaterID = UUID.Random();
|
||||||
|
updater.Params = extraParams;
|
||||||
|
updater.BlendWithOldTexture = SetBlending;
|
||||||
|
updater.FrontAlpha = AlphaValue;
|
||||||
|
updater.Face = face;
|
||||||
|
updater.Url = "Local image";
|
||||||
|
updater.Disp = disp;
|
||||||
|
|
||||||
|
object objReusableTextureUUID = null;
|
||||||
|
|
||||||
|
if (ReuseTextures && !updater.BlendWithOldTexture)
|
||||||
{
|
{
|
||||||
// If we want to reuse dynamic textures then we have to ignore any request from the caller to expire
|
string reuseableTextureKey = GenerateReusableTextureKey(data, extraParams);
|
||||||
// them.
|
objReusableTextureUUID = m_reuseableDynamicTextures.Get(reuseableTextureKey);
|
||||||
if (ReuseTextures)
|
|
||||||
disp = disp & ~DISP_EXPIRE;
|
|
||||||
|
|
||||||
DynamicTextureUpdater updater = new DynamicTextureUpdater();
|
if (objReusableTextureUUID != null)
|
||||||
updater.SimUUID = simID;
|
|
||||||
updater.PrimID = primID;
|
|
||||||
updater.ContentType = contentType;
|
|
||||||
updater.BodyData = data;
|
|
||||||
updater.UpdateTimer = updateTimer;
|
|
||||||
updater.UpdaterID = UUID.Random();
|
|
||||||
updater.Params = extraParams;
|
|
||||||
updater.BlendWithOldTexture = SetBlending;
|
|
||||||
updater.FrontAlpha = AlphaValue;
|
|
||||||
updater.Face = face;
|
|
||||||
updater.Url = "Local image";
|
|
||||||
updater.Disp = disp;
|
|
||||||
|
|
||||||
object reusableTextureUUID = null;
|
|
||||||
|
|
||||||
if (ReuseTextures)
|
|
||||||
reusableTextureUUID
|
|
||||||
= m_reuseableDynamicTextures.Get(GenerateReusableTextureKey(data, extraParams));
|
|
||||||
|
|
||||||
// We cannot reuse a dynamic texture if the data is going to be blended with something already there.
|
|
||||||
if (reusableTextureUUID == null || updater.BlendWithOldTexture)
|
|
||||||
{
|
{
|
||||||
lock (Updaters)
|
// If something else has removed this temporary asset from the cache, detect and invalidate
|
||||||
|
// our cached uuid.
|
||||||
|
if (scene.AssetService.GetMetadata(objReusableTextureUUID.ToString()) == null)
|
||||||
{
|
{
|
||||||
if (!Updaters.ContainsKey(updater.UpdaterID))
|
m_reuseableDynamicTextures.Invalidate(reuseableTextureKey);
|
||||||
{
|
objReusableTextureUUID = null;
|
||||||
Updaters.Add(updater.UpdaterID, updater);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RenderPlugins[contentType].AsyncConvertData(updater.UpdaterID, data, extraParams);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// No need to add to updaters as the texture is always the same. Not that this functionality
|
|
||||||
// apppears to be implemented anyway.
|
|
||||||
if (RegisteredScenes.ContainsKey(updater.SimUUID))
|
|
||||||
{
|
|
||||||
SceneObjectPart part = RegisteredScenes[updater.SimUUID].GetSceneObjectPart(updater.PrimID);
|
|
||||||
|
|
||||||
if (part != null)
|
|
||||||
updater.UpdatePart(part, (UUID)reusableTextureUUID);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return updater.UpdaterID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return UUID.Zero;
|
// We cannot reuse a dynamic texture if the data is going to be blended with something already there.
|
||||||
|
if (objReusableTextureUUID == null)
|
||||||
|
{
|
||||||
|
lock (Updaters)
|
||||||
|
{
|
||||||
|
if (!Updaters.ContainsKey(updater.UpdaterID))
|
||||||
|
{
|
||||||
|
Updaters.Add(updater.UpdaterID, updater);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderPlugins[contentType].AsyncConvertData(updater.UpdaterID, data, extraParams);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// No need to add to updaters as the texture is always the same. Not that this functionality
|
||||||
|
// apppears to be implemented anyway.
|
||||||
|
updater.UpdatePart(part, (UUID)objReusableTextureUUID);
|
||||||
|
}
|
||||||
|
|
||||||
|
return updater.UpdaterID;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GenerateReusableTextureKey(string data, string extraParams)
|
private string GenerateReusableTextureKey(string data, string extraParams)
|
||||||
|
|
Loading…
Reference in New Issue