Fixed updating avatar appearance

Signed-off-by: root <root@grid00001.t-data.com>
bulletsim
Oren Hurvitz 2011-07-04 17:54:14 +03:00 committed by root
parent 9fc7d65df7
commit f97278610c
2 changed files with 20 additions and 11 deletions

View File

@ -196,6 +196,9 @@ namespace OpenSim.Framework
if (appearance.VisualParams != null) if (appearance.VisualParams != null)
m_visualparams = (byte[])appearance.VisualParams.Clone(); m_visualparams = (byte[])appearance.VisualParams.Clone();
m_avatarHeight = appearance.m_avatarHeight;
m_hipOffset = appearance.m_hipOffset;
// Copy the attachment, force append mode since that ensures consistency // Copy the attachment, force append mode since that ensures consistency
m_attachments = new Dictionary<int, List<AvatarAttachment>>(); m_attachments = new Dictionary<int, List<AvatarAttachment>>();
foreach (AvatarAttachment attachment in appearance.GetAttachments()) foreach (AvatarAttachment attachment in appearance.GetAttachments())
@ -237,7 +240,6 @@ namespace OpenSim.Framework
{ {
m_serial = 0; m_serial = 0;
SetDefaultParams();
SetDefaultTexture(); SetDefaultTexture();
//for (int i = 0; i < BAKE_INDICES.Length; i++) //for (int i = 0; i < BAKE_INDICES.Length; i++)

View File

@ -210,7 +210,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
changed = sp.Appearance.SetVisualParams(visualParams); changed = sp.Appearance.SetVisualParams(visualParams);
if (sp.Appearance.AvatarHeight > 0) if (sp.Appearance.AvatarHeight > 0)
sp.SetHeight(sp.Appearance.AvatarHeight); sp.SetHeight(sp.Appearance.AvatarHeight);
} }
// Process the baked texture array // Process the baked texture array
if (textureEntry != null) if (textureEntry != null)
@ -387,11 +387,11 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
// m_log.WarnFormat("[AVFACTORY]: AvatarIsWearing called for {0}", client.AgentId); // m_log.WarnFormat("[AVFACTORY]: AvatarIsWearing called for {0}", client.AgentId);
// we need to clean out the existing textures // we need to clean out the existing textures
sp.Appearance.ResetAppearance(); sp.Appearance.ResetAppearance();
// operate on a copy of the appearance so we don't have to lock anything // operate on a copy of the appearance so we don't have to lock anything yet
AvatarAppearance avatAppearance = new AvatarAppearance(sp.Appearance, false); AvatarAppearance avatAppearance = new AvatarAppearance(sp.Appearance, false);
foreach (AvatarWearingArgs.Wearable wear in e.NowWearing) foreach (AvatarWearingArgs.Wearable wear in e.NowWearing)
{ {
if (wear.Type < AvatarWearable.MAX_WEARABLES) if (wear.Type < AvatarWearable.MAX_WEARABLES)
@ -403,12 +403,19 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
// This could take awhile since it needs to pull inventory // This could take awhile since it needs to pull inventory
SetAppearanceAssets(sp.UUID, ref avatAppearance); SetAppearanceAssets(sp.UUID, ref avatAppearance);
// could get fancier with the locks here, but in the spirit of "last write wins" lock (m_setAppearanceLock)
// this should work correctly, also, we don't need to send the appearance here {
// since the "iswearing" will trigger a new set of visual param and baked texture changes // Update only those fields that we have changed. This is important because the viewer
// when those complete, the new appearance will be sent // often sends AvatarIsWearing and SetAppearance packets at once, and AvatarIsWearing
sp.Appearance = avatAppearance; // shouldn't overwrite the changes made in SetAppearance.
QueueAppearanceSave(client.AgentId); sp.Appearance.Wearables = avatAppearance.Wearables;
sp.Appearance.Texture = avatAppearance.Texture;
// We don't need to send the appearance here since the "iswearing" will trigger a new set
// of visual param and baked texture changes. When those complete, the new appearance will be sent
QueueAppearanceSave(client.AgentId);
}
} }
private void SetAppearanceAssets(UUID userID, ref AvatarAppearance appearance) private void SetAppearanceAssets(UUID userID, ref AvatarAppearance appearance)