aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Scenes/ScenePresence.cs
diff options
context:
space:
mode:
authorJeff Ames2007-12-10 15:08:44 +0000
committerJeff Ames2007-12-10 15:08:44 +0000
commit40fd37f95af68a213b0c3a465858c27fa7c8cfdf (patch)
tree27424718d3b777adee5088deecd813573223bc33 /OpenSim/Region/Environment/Scenes/ScenePresence.cs
parentmore work on texture downloading. (diff)
downloadopensim-SC-40fd37f95af68a213b0c3a465858c27fa7c8cfdf.zip
opensim-SC-40fd37f95af68a213b0c3a465858c27fa7c8cfdf.tar.gz
opensim-SC-40fd37f95af68a213b0c3a465858c27fa7c8cfdf.tar.bz2
opensim-SC-40fd37f95af68a213b0c3a465858c27fa7c8cfdf.tar.xz
Refactored animation handling in ScenePresence. Now maintains a list of current animations.
* Fixes weirdness when typing and sitting at the same time * Should fix bug #32 (getting stuck in edit appearance pose) * Crouchwalk and possibly jump may need more looking into
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs179
1 files changed, 101 insertions, 78 deletions
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index 21c0f3f..c277011 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -43,8 +43,8 @@ namespace OpenSim.Region.Environment.Scenes
43 public static AvatarAnimations Animations; 43 public static AvatarAnimations Animations;
44 public static byte[] DefaultTexture; 44 public static byte[] DefaultTexture;
45 45
46 public LLUUID CurrentAnimation; 46 private List<LLUUID> m_animations = new List<LLUUID>();
47 public int AnimationSeq; 47 private List<int> m_animationSeqs = new List<int>();
48 48
49 private bool m_updateflag = false; 49 private bool m_updateflag = false;
50 private byte m_movementflag = 0; 50 private byte m_movementflag = 0;
@@ -55,7 +55,6 @@ namespace OpenSim.Region.Environment.Scenes
55 private float m_sitAvatarHeight = 2.0f; 55 private float m_sitAvatarHeight = 2.0f;
56 private float m_godlevel = 0; 56 private float m_godlevel = 0;
57 57
58 private bool m_isTyping = false;
59 private bool m_setAlwaysRun = false; 58 private bool m_setAlwaysRun = false;
60 59
61 private Quaternion m_bodyRot; 60 private Quaternion m_bodyRot;
@@ -74,7 +73,6 @@ namespace OpenSim.Region.Environment.Scenes
74 private readonly Vector3[] Dir_Vectors = new Vector3[6]; 73 private readonly Vector3[] Dir_Vectors = new Vector3[6];
75 private LLVector3 lastPhysPos = new LLVector3(); 74 private LLVector3 lastPhysPos = new LLVector3();
76 75
77
78 // Position of agent's camera in world 76 // Position of agent's camera in world
79 protected Vector3 m_CameraCenter = new Vector3(0, 0, 0); 77 protected Vector3 m_CameraCenter = new Vector3(0, 0, 0);
80 78
@@ -286,6 +284,9 @@ namespace OpenSim.Region.Environment.Scenes
286 Animations = new AvatarAnimations(); 284 Animations = new AvatarAnimations();
287 Animations.LoadAnims(); 285 Animations.LoadAnims();
288 286
287 m_animations.Add(Animations.AnimsLLUUID["STAND"]);
288 m_animationSeqs.Add(1);
289
289 RegisterToEvents(); 290 RegisterToEvents();
290 291
291 SetDirectionVectors(); 292 SetDirectionVectors();
@@ -303,7 +304,6 @@ namespace OpenSim.Region.Environment.Scenes
303 m_scene.LandManager.sendLandUpdate(this); 304 m_scene.LandManager.sendLandUpdate(this);
304 } 305 }
305 306
306
307 public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance) 307 public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance)
308 { 308 {
309 //couldn't move the following into SetInitialValues as they are readonly 309 //couldn't move the following into SetInitialValues as they are readonly
@@ -319,6 +319,9 @@ namespace OpenSim.Region.Environment.Scenes
319 Animations = new AvatarAnimations(); 319 Animations = new AvatarAnimations();
320 Animations.LoadAnims(); 320 Animations.LoadAnims();
321 321
322 m_animations.Add(Animations.AnimsLLUUID["STAND"]);
323 m_animationSeqs.Add(1);
324
322 RegisterToEvents(); 325 RegisterToEvents();
323 SetDirectionVectors(); 326 SetDirectionVectors();
324 327
@@ -350,8 +353,9 @@ namespace OpenSim.Region.Environment.Scenes
350 m_controllingClient.OnAgentRequestSit += HandleAgentRequestSit; 353 m_controllingClient.OnAgentRequestSit += HandleAgentRequestSit;
351 m_controllingClient.OnAgentSit += HandleAgentSit; 354 m_controllingClient.OnAgentSit += HandleAgentSit;
352 m_controllingClient.OnSetAlwaysRun += HandleSetAlwaysRun; 355 m_controllingClient.OnSetAlwaysRun += HandleSetAlwaysRun;
356 m_controllingClient.OnStartAnim += HandleStartAnim;
357 m_controllingClient.OnStopAnim += HandleStopAnim;
353 358
354 // ControllingClient.OnStartAnim += new StartAnim(this.SendAnimPack);
355 // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange); 359 // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange);
356 //ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement); 360 //ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement);
357 } 361 }
@@ -786,7 +790,7 @@ namespace OpenSim.Region.Environment.Scenes
786 Velocity = new LLVector3(0, 0, 0); 790 Velocity = new LLVector3(0, 0, 0);
787 RemoveFromPhysicalScene(); 791 RemoveFromPhysicalScene();
788 792
789 SendAnimPack(Animations.AnimsLLUUID["SIT"], 1); 793 SetMovementAnimation(Animations.AnimsLLUUID["SIT"], 1);
790 SendFullUpdateToAllClients(); 794 SendFullUpdateToAllClients();
791 } 795 }
792 796
@@ -799,6 +803,57 @@ namespace OpenSim.Region.Environment.Scenes
799 } 803 }
800 } 804 }
801 805
806 public void AddAnimation(LLUUID animID, int seq)
807 {
808 if (!m_animations.Contains(animID))
809 {
810 m_animations.Add(animID);
811 m_animationSeqs.Add(seq);
812 SendAnimPack();
813 }
814 }
815
816 public void RemoveAnimation(LLUUID animID)
817 {
818 if (m_animations.Contains(animID))
819 {
820 if (m_animations[0] == animID)
821 {
822 SetMovementAnimation(Animations.AnimsLLUUID["STAND"], 1);
823 }
824 else
825 {
826 m_animations.Remove(animID);
827 SendAnimPack();
828 }
829 }
830 }
831
832 public void HandleStartAnim(IClientAPI remoteClient, LLUUID animID, int seq)
833 {
834 AddAnimation(animID, seq);
835 }
836
837 public void HandleStopAnim(IClientAPI remoteClient, LLUUID animID)
838 {
839 RemoveAnimation(animID);
840 }
841
842 /// <summary>
843 /// The movement animation is the first element of the animation list,
844 /// reserved for "main" animations that are mutually exclusive,
845 /// like flying and sitting, for example.
846 /// </summary>
847 protected void SetMovementAnimation(LLUUID anim, int seq)
848 {
849 if (m_animations[0] != anim)
850 {
851 m_animations[0] = anim;
852 m_animationSeqs[0] = seq;
853 SendAnimPack();
854 }
855 }
856
802 protected void UpdateMovementAnimations(bool update_movementflag) 857 protected void UpdateMovementAnimations(bool update_movementflag)
803 { 858 {
804 if (update_movementflag) 859 if (update_movementflag)
@@ -807,81 +862,49 @@ namespace OpenSim.Region.Environment.Scenes
807 { 862 {
808 if (m_physicsActor.Flying) 863 if (m_physicsActor.Flying)
809 { 864 {
810 SendAnimPack(Animations.AnimsLLUUID["FLY"], 1); 865 SetMovementAnimation(Animations.AnimsLLUUID["FLY"], 1);
811 } 866 }
812 else 867 else if (((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) &&
868 PhysicsActor.IsColliding)
813 { 869 {
814 if (((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) && 870 SetMovementAnimation(Animations.AnimsLLUUID["CROUCHWALK"], 1);
815 PhysicsActor.IsColliding)
816 {
817 SendAnimPack(Animations.AnimsLLUUID["CROUCHWALK"], 1);
818 }
819 else
820 {
821 if (!PhysicsActor.IsColliding && m_physicsActor.Velocity.Z < -6)
822 {
823 SendAnimPack(Animations.AnimsLLUUID["FALLDOWN"], 1);
824 }
825 else if (!PhysicsActor.IsColliding && Velocity.Z > 0 && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0)
826 {
827 SendAnimPack(Animations.AnimsLLUUID["JUMP"], 1);
828 }
829 else
830 {
831 if (!m_setAlwaysRun)
832 {
833 SendAnimPack(Animations.AnimsLLUUID["WALK"], 1);
834 }
835 else
836 {
837 SendAnimPack(Animations.AnimsLLUUID["RUN"], 1);
838 }
839 }
840 }
841 } 871 }
842 } 872 else if (!PhysicsActor.IsColliding && m_physicsActor.Velocity.Z < -6)
843 else if (m_parentID != 0)
844 {
845 if (m_isTyping)
846 { 873 {
847 SendAnimPack(Animations.AnimsLLUUID["TYPE"], 1); 874 SetMovementAnimation(Animations.AnimsLLUUID["FALLDOWN"], 1);
848 } 875 }
849 else 876 else if (!PhysicsActor.IsColliding && Velocity.Z > 0 && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0)
850 { 877 {
851 // TODO: stop the typing animation, continue sitting 878 SetMovementAnimation(Animations.AnimsLLUUID["JUMP"], 1);
852 SendAnimPack(Animations.AnimsLLUUID["SIT"], 1);
853 } 879 }
880 else if (m_setAlwaysRun)
881 {
882 SetMovementAnimation(Animations.AnimsLLUUID["RUN"], 1);
883 }
884 else
885 SetMovementAnimation(Animations.AnimsLLUUID["WALK"], 1);
854 } 886 }
855 else 887 else
856 { 888 {
857 if (((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) && 889 if (((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) &&
858 PhysicsActor.IsColliding) 890 PhysicsActor.IsColliding)
859 { 891 {
860 SendAnimPack(Animations.AnimsLLUUID["CROUCH"], 1); 892 SetMovementAnimation(Animations.AnimsLLUUID["CROUCH"], 1);
861 } 893 }
862 else if (m_isTyping) 894 else if (!PhysicsActor.IsColliding && m_physicsActor.Velocity.Z < -6 && !m_physicsActor.Flying)
863 { 895 {
864 SendAnimPack(Animations.AnimsLLUUID["TYPE"], 1); 896 SetMovementAnimation(Animations.AnimsLLUUID["FALLDOWN"], 1);
865 } 897 }
866 else 898 else if (!PhysicsActor.IsColliding && Velocity.Z > 0 && !m_physicsActor.Flying && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0)
867 { 899 {
868 if (!PhysicsActor.IsColliding && m_physicsActor.Velocity.Z < -6 && !m_physicsActor.Flying) 900 SetMovementAnimation(Animations.AnimsLLUUID["JUMP"], 1);
869 { 901 }
870 SendAnimPack(Animations.AnimsLLUUID["FALLDOWN"], 1); 902 else if (m_physicsActor.Flying)
871 } 903 {
872 else if (!PhysicsActor.IsColliding && Velocity.Z > 0 && !m_physicsActor.Flying && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0) 904 SetMovementAnimation(Animations.AnimsLLUUID["FLY"], 1);
873 {
874 SendAnimPack(Animations.AnimsLLUUID["JUMP"], 1);
875 }
876 else
877 {
878 if (!m_physicsActor.Flying)
879 {
880 SendAnimPack(Animations.AnimsLLUUID["STAND"], 1);
881 }
882 }
883
884 } 905 }
906 else
907 SetMovementAnimation(Animations.AnimsLLUUID["STAND"], 1);
885 } 908 }
886 } 909 }
887 } 910 }
@@ -912,8 +935,8 @@ namespace OpenSim.Region.Environment.Scenes
912 { 935 {
913 direc.z *= 3; 936 direc.z *= 3;
914 //System.Console.WriteLine("Jump"); 937 //System.Console.WriteLine("Jump");
915 SendAnimPack(Animations.AnimsLLUUID["PREJUMP"], 1); 938 SetMovementAnimation(Animations.AnimsLLUUID["PREJUMP"], 1);
916 SendAnimPack(Animations.AnimsLLUUID["JUMP"], 1); 939 SetMovementAnimation(Animations.AnimsLLUUID["JUMP"], 1);
917 } 940 }
918 } 941 }
919 } 942 }
@@ -932,9 +955,10 @@ namespace OpenSim.Region.Environment.Scenes
932 return; 955 return;
933 } 956 }
934 957
935 m_isTyping = typing; 958 if (typing)
936 959 AddAnimation(Animations.AnimsLLUUID["TYPE"], 1);
937 UpdateMovementAnimations(true); 960 else
961 RemoveAnimation(Animations.AnimsLLUUID["TYPE"]);
938 } 962 }
939 963
940 #endregion 964 #endregion
@@ -1122,15 +1146,14 @@ namespace OpenSim.Region.Environment.Scenes
1122 /// <summary> 1146 /// <summary>
1123 /// 1147 ///
1124 /// </summary> 1148 /// </summary>
1125 /// <param name="animID"></param> 1149 /// <param name="animations"></param>
1126 /// <param name="seq"></param> 1150 /// <param name="seqs"></param>
1127 public void SendAnimPack(LLUUID animID, int seq) 1151 public void SendAnimPack(LLUUID[] animations, int[] seqs)
1128 { 1152 {
1129 CurrentAnimation = animID; 1153 m_scene.Broadcast(delegate(IClientAPI client)
1130 AnimationSeq = seq; 1154 {
1131 LLUUID sourceAgentId = m_controllingClient.AgentId; 1155 client.SendAnimations(animations, seqs, m_controllingClient.AgentId);
1132 1156 });
1133 m_scene.Broadcast(delegate(IClientAPI client) { client.SendAnimation(animID, seq, sourceAgentId); });
1134 } 1157 }
1135 1158
1136 /// <summary> 1159 /// <summary>
@@ -1138,7 +1161,7 @@ namespace OpenSim.Region.Environment.Scenes
1138 /// </summary> 1161 /// </summary>
1139 public void SendAnimPack() 1162 public void SendAnimPack()
1140 { 1163 {
1141 SendAnimPack(CurrentAnimation, AnimationSeq); 1164 SendAnimPack(m_animations.ToArray(), m_animationSeqs.ToArray());
1142 } 1165 }
1143 1166
1144 #endregion 1167 #endregion