aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework
diff options
context:
space:
mode:
authorMelanie2010-09-27 19:34:16 +0200
committerMelanie2010-09-27 19:34:16 +0200
commit841c84831fedcfa40e0b0fa9c99990f6754591fa (patch)
tree6a1471ea4543d453f21fb367280037652b873f3b /OpenSim/Region/Framework
parentMerge branch 'master' into careminster-presence-refactor (diff)
downloadopensim-SC-841c84831fedcfa40e0b0fa9c99990f6754591fa.zip
opensim-SC-841c84831fedcfa40e0b0fa9c99990f6754591fa.tar.gz
opensim-SC-841c84831fedcfa40e0b0fa9c99990f6754591fa.tar.bz2
opensim-SC-841c84831fedcfa40e0b0fa9c99990f6754591fa.tar.xz
Try to prevent threading issues in SP.SetAppearance by locking it
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs85
1 files changed, 45 insertions, 40 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index b3df1ea..ec3f004 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -229,6 +229,8 @@ namespace OpenSim.Region.Framework.Scenes
229 private const int NumMovementsBetweenRayCast = 5; 229 private const int NumMovementsBetweenRayCast = 5;
230 private List<uint> m_lastColliders = new List<uint>(); 230 private List<uint> m_lastColliders = new List<uint>();
231 231
232 private object m_syncRoot = new Object();
233
232 private bool CameraConstraintActive; 234 private bool CameraConstraintActive;
233 //private int m_moveToPositionStateStatus; 235 //private int m_moveToPositionStateStatus;
234 //***************************************************** 236 //*****************************************************
@@ -2861,66 +2863,69 @@ namespace OpenSim.Region.Framework.Scenes
2861 /// <param name="visualParam"></param> 2863 /// <param name="visualParam"></param>
2862 public void SetAppearance(Primitive.TextureEntry textureEntry, byte[] visualParams) 2864 public void SetAppearance(Primitive.TextureEntry textureEntry, byte[] visualParams)
2863 { 2865 {
2864 if (m_physicsActor != null) 2866 lock (m_syncRoot)
2865 { 2867 {
2866 if (!IsChildAgent) 2868 if (m_physicsActor != null)
2867 { 2869 {
2868 // This may seem like it's redundant, remove the avatar from the physics scene 2870 if (!IsChildAgent)
2869 // just to add it back again, but it saves us from having to update 2871 {
2870 // 3 variables 10 times a second. 2872 // This may seem like it's redundant, remove the avatar from the physics scene
2871 bool flyingTemp = m_physicsActor.Flying; 2873 // just to add it back again, but it saves us from having to update
2872 RemoveFromPhysicalScene(); 2874 // 3 variables 10 times a second.
2873 //m_scene.PhysicsScene.RemoveAvatar(m_physicsActor); 2875 bool flyingTemp = m_physicsActor.Flying;
2876 RemoveFromPhysicalScene();
2877 //m_scene.PhysicsScene.RemoveAvatar(m_physicsActor);
2874 2878
2875 //PhysicsActor = null; 2879 //PhysicsActor = null;
2876 2880
2877 AddToPhysicalScene(flyingTemp); 2881 AddToPhysicalScene(flyingTemp);
2882 }
2878 } 2883 }
2879 }
2880 2884
2881 #region Bake Cache Check 2885 #region Bake Cache Check
2882 2886
2883 if (textureEntry != null) 2887 if (textureEntry != null)
2884 {
2885 for (int i = 0; i < BAKE_INDICES.Length; i++)
2886 { 2888 {
2887 int j = BAKE_INDICES[i]; 2889 for (int i = 0; i < BAKE_INDICES.Length; i++)
2888 Primitive.TextureEntryFace face = textureEntry.FaceTextures[j];
2889
2890 if (face != null && face.TextureID != AppearanceManager.DEFAULT_AVATAR_TEXTURE)
2891 { 2890 {
2892 if (m_scene.AssetService.Get(face.TextureID.ToString()) == null) 2891 int j = BAKE_INDICES[i];
2892 Primitive.TextureEntryFace face = textureEntry.FaceTextures[j];
2893
2894 if (face != null && face.TextureID != AppearanceManager.DEFAULT_AVATAR_TEXTURE)
2893 { 2895 {
2894 m_log.Warn("[APPEARANCE]: Missing baked texture " + face.TextureID + " (" + j + ") for avatar " + this.Name); 2896 if (m_scene.AssetService.Get(face.TextureID.ToString()) == null)
2895 this.ControllingClient.SendRebakeAvatarTextures(face.TextureID); 2897 {
2898 m_log.Warn("[APPEARANCE]: Missing baked texture " + face.TextureID + " (" + j + ") for avatar " + this.Name);
2899 this.ControllingClient.SendRebakeAvatarTextures(face.TextureID);
2900 }
2896 } 2901 }
2897 } 2902 }
2898 }
2899 2903
2900 } 2904 }
2901 2905
2902 2906
2903 #endregion Bake Cache Check 2907 #endregion Bake Cache Check
2904 2908
2905 m_appearance.SetAppearance(textureEntry, visualParams); 2909 m_appearance.SetAppearance(textureEntry, visualParams);
2906 if (m_appearance.AvatarHeight > 0) 2910 if (m_appearance.AvatarHeight > 0)
2907 SetHeight(m_appearance.AvatarHeight); 2911 SetHeight(m_appearance.AvatarHeight);
2908 2912
2909 // This is not needed, because only the transient data changed 2913 // This is not needed, because only the transient data changed
2910 //AvatarData adata = new AvatarData(m_appearance); 2914 //AvatarData adata = new AvatarData(m_appearance);
2911 //m_scene.AvatarService.SetAvatar(m_controllingClient.AgentId, adata); 2915 //m_scene.AvatarService.SetAvatar(m_controllingClient.AgentId, adata);
2912 2916
2913 SendAppearanceToAllOtherAgents(); 2917 SendAppearanceToAllOtherAgents();
2914 if (!m_startAnimationSet) 2918 if (!m_startAnimationSet)
2915 { 2919 {
2916 Animator.UpdateMovementAnimations(); 2920 Animator.UpdateMovementAnimations();
2917 m_startAnimationSet = true; 2921 m_startAnimationSet = true;
2918 } 2922 }
2919 2923
2920 Vector3 pos = m_pos; 2924 Vector3 pos = m_pos;
2921 pos.Z += m_appearance.HipOffset; 2925 pos.Z += m_appearance.HipOffset;
2922 2926
2923 m_controllingClient.SendAvatarDataImmediate(this); 2927 m_controllingClient.SendAvatarDataImmediate(this);
2928 }
2924 } 2929 }
2925 2930
2926 public void SetWearable(int wearableId, AvatarWearable wearable) 2931 public void SetWearable(int wearableId, AvatarWearable wearable)