mirror of
https://github.com/opensim/opensim.git
synced 2026-08-07 17:55:48 +08:00
Merge branch 'master' into vehicles
This commit is contained in:
@@ -540,127 +540,5 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
m_localScenes.ForEach(action);
|
||||
}
|
||||
|
||||
public void CacheJ2kDecode(int threads)
|
||||
{
|
||||
if (threads < 1) threads = 1;
|
||||
|
||||
IJ2KDecoder m_decoder = m_localScenes[0].RequestModuleInterface<IJ2KDecoder>();
|
||||
|
||||
List<UUID> assetRequestList = new List<UUID>();
|
||||
|
||||
#region AssetGathering!
|
||||
foreach (Scene scene in m_localScenes)
|
||||
{
|
||||
List<EntityBase> entitles = scene.GetEntities();
|
||||
foreach (EntityBase entity in entitles)
|
||||
{
|
||||
if (entity is SceneObjectGroup)
|
||||
{
|
||||
SceneObjectGroup sog = (SceneObjectGroup) entity;
|
||||
foreach (SceneObjectPart part in sog.Children.Values)
|
||||
{
|
||||
if (part.Shape != null)
|
||||
{
|
||||
if (part.Shape.TextureEntry.Length > 0)
|
||||
{
|
||||
OpenMetaverse.Primitive.TextureEntry te =
|
||||
new Primitive.TextureEntry(part.Shape.TextureEntry, 0,
|
||||
part.Shape.TextureEntry.Length);
|
||||
if (te.DefaultTexture != null) // this has been null for some reason...
|
||||
{
|
||||
if (te.DefaultTexture.TextureID != UUID.Zero)
|
||||
assetRequestList.Add(te.DefaultTexture.TextureID);
|
||||
}
|
||||
for (int i=0; i<te.FaceTextures.Length; i++)
|
||||
{
|
||||
if (te.FaceTextures[i] != null)
|
||||
{
|
||||
if (te.FaceTextures[i].TextureID != UUID.Zero)
|
||||
{
|
||||
assetRequestList.Add(te.FaceTextures[i].TextureID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (part.Shape.SculptTexture != UUID.Zero)
|
||||
{
|
||||
assetRequestList.Add(part.Shape.SculptTexture);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
int entries_per_thread = (assetRequestList.Count / threads) + 1;
|
||||
|
||||
UUID[] arrAssetRequestList = assetRequestList.ToArray();
|
||||
|
||||
List<UUID[]> arrvalus = new List<UUID[]>();
|
||||
|
||||
//split into separate arrays
|
||||
for (int j = 0; j < threads; j++)
|
||||
{
|
||||
List<UUID> val = new List<UUID>();
|
||||
|
||||
for (int k = j * entries_per_thread; k < ((j + 1) * entries_per_thread); k++)
|
||||
{
|
||||
if (k < arrAssetRequestList.Length)
|
||||
{
|
||||
val.Add(arrAssetRequestList[k]);
|
||||
}
|
||||
|
||||
}
|
||||
arrvalus.Add(val.ToArray());
|
||||
}
|
||||
|
||||
for (int l = 0; l < arrvalus.Count; l++)
|
||||
{
|
||||
DecodeThreadContents threadworkItem = new DecodeThreadContents();
|
||||
threadworkItem.sn = m_localScenes[0];
|
||||
threadworkItem.j2kdecode = m_decoder;
|
||||
threadworkItem.arrassets = arrvalus[l];
|
||||
|
||||
System.Threading.Thread decodethread =
|
||||
new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(threadworkItem.run));
|
||||
|
||||
threadworkItem.SetThread(decodethread);
|
||||
|
||||
decodethread.Priority = System.Threading.ThreadPriority.Lowest;
|
||||
decodethread.Name = "J2kCacheDecodeThread_" + l + 1;
|
||||
ThreadTracker.Add(decodethread);
|
||||
decodethread.Start();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class DecodeThreadContents
|
||||
{
|
||||
public Scene sn;
|
||||
public UUID[] arrassets;
|
||||
public IJ2KDecoder j2kdecode;
|
||||
private System.Threading.Thread thisthread;
|
||||
|
||||
public void run(object o)
|
||||
{
|
||||
for (int i=0;i<arrassets.Length;i++)
|
||||
{
|
||||
AssetBase ab = sn.AssetService.Get(arrassets[i].ToString());
|
||||
if (ab != null && ab.Data != null)
|
||||
{
|
||||
j2kdecode.syncdecode(arrassets[i], ab.Data);
|
||||
}
|
||||
}
|
||||
ThreadTracker.Remove(thisthread);
|
||||
}
|
||||
|
||||
public void SetThread(System.Threading.Thread thr)
|
||||
{
|
||||
thisthread = thr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,6 +74,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
|
||||
|
||||
public static byte[] DefaultTexture;
|
||||
|
||||
public UUID currentParcelUUID = UUID.Zero;
|
||||
@@ -2686,7 +2688,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// </summary>
|
||||
/// <param name="texture"></param>
|
||||
/// <param name="visualParam"></param>
|
||||
public void SetAppearance(byte[] texture, List<byte> visualParam)
|
||||
public void SetAppearance(Primitive.TextureEntry textureEntry, byte[] visualParams)
|
||||
{
|
||||
if (m_physicsActor != null)
|
||||
{
|
||||
@@ -2704,7 +2706,30 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
AddToPhysicalScene(flyingTemp);
|
||||
}
|
||||
}
|
||||
m_appearance.SetAppearance(texture, visualParam);
|
||||
|
||||
#region Bake Cache Check
|
||||
|
||||
if (textureEntry != null)
|
||||
{
|
||||
for (int i = 0; i < BAKE_INDICES.Length; i++)
|
||||
{
|
||||
int j = BAKE_INDICES[i];
|
||||
Primitive.TextureEntryFace face = textureEntry.FaceTextures[j];
|
||||
|
||||
if (face != null && face.TextureID != AppearanceManager.DEFAULT_AVATAR_TEXTURE)
|
||||
{
|
||||
if (m_scene.AssetService.Get(face.TextureID.ToString()) == null)
|
||||
{
|
||||
m_log.Warn("[APPEARANCE]: Missing baked texture " + face.TextureID + " (" + (AppearanceManager.TextureIndex)j + ") for avatar " + this.Name);
|
||||
this.ControllingClient.SendRebakeAvatarTextures(face.TextureID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Bake Cache Check
|
||||
|
||||
m_appearance.SetAppearance(textureEntry, visualParams);
|
||||
if (m_appearance.AvatarHeight > 0)
|
||||
SetHeight(m_appearance.AvatarHeight);
|
||||
m_scene.CommsManager.AvatarService.UpdateUserAppearance(m_controllingClient.AgentId, m_appearance);
|
||||
@@ -3255,14 +3280,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
wears[i++] = new AvatarWearable(itemId, assetId);
|
||||
}
|
||||
m_appearance.Wearables = wears;
|
||||
byte[] te = null;
|
||||
if (cAgent.AgentTextures != null)
|
||||
te = cAgent.AgentTextures;
|
||||
Primitive.TextureEntry te;
|
||||
if (cAgent.AgentTextures != null && cAgent.AgentTextures.Length > 1)
|
||||
te = new Primitive.TextureEntry(cAgent.AgentTextures, 0, cAgent.AgentTextures.Length);
|
||||
else
|
||||
te = AvatarAppearance.GetDefaultTexture().GetBytes();
|
||||
te = AvatarAppearance.GetDefaultTexture();
|
||||
if ((cAgent.VisualParams == null) || (cAgent.VisualParams.Length < AvatarAppearance.VISUALPARAM_COUNT))
|
||||
cAgent.VisualParams = AvatarAppearance.GetDefaultVisualParams();
|
||||
m_appearance.SetAppearance(te, new List<byte>(cAgent.VisualParams));
|
||||
m_appearance.SetAppearance(te, (byte[])cAgent.VisualParams.Clone());
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user