aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
authorJohn Hurliman2009-10-29 04:13:51 -0700
committerJohn Hurliman2009-10-29 04:13:51 -0700
commit3f2d6fe4707b6fbb40e775e63c4cd7a7137a9814 (patch)
tree97ab19f47e0a59f0594b07964f3f907ab9833c0e /OpenSim
parentFixing NullReferenceException regression in the previous commit (diff)
downloadopensim-SC-3f2d6fe4707b6fbb40e775e63c4cd7a7137a9814.zip
opensim-SC-3f2d6fe4707b6fbb40e775e63c4cd7a7137a9814.tar.gz
opensim-SC-3f2d6fe4707b6fbb40e775e63c4cd7a7137a9814.tar.bz2
opensim-SC-3f2d6fe4707b6fbb40e775e63c4cd7a7137a9814.tar.xz
Ported the Simian avatar animation system to OpenSim. Landing is currently not working
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs239
1 files changed, 203 insertions, 36 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 7420134..c4f4021 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -130,12 +130,14 @@ namespace OpenSim.Region.Framework.Scenes
130 private bool m_setAlwaysRun; 130 private bool m_setAlwaysRun;
131 131
132 private string m_movementAnimation = "DEFAULT"; 132 private string m_movementAnimation = "DEFAULT";
133 private long m_animPersistUntil = 0; 133 private long m_animPersistUntil;
134 private bool m_allowFalling = false; 134 private int m_animTickFall;
135 private bool m_useFlySlow = false; 135 private int m_animTickJump;
136 private bool m_usePreJump = false; 136 private bool m_allowFalling;
137 private bool m_forceFly = false; 137 private bool m_useFlySlow;
138 private bool m_flyDisabled = false; 138 private bool m_usePreJump;
139 private bool m_forceFly;
140 private bool m_flyDisabled;
139 141
140 private float m_speedModifier = 1.0f; 142 private float m_speedModifier = 1.0f;
141 143
@@ -143,7 +145,7 @@ namespace OpenSim.Region.Framework.Scenes
143 145
144 public bool IsRestrictedToRegion; 146 public bool IsRestrictedToRegion;
145 147
146 public string JID = string.Empty; 148 public string JID = String.Empty;
147 149
148 // Agent moves with a PID controller causing a force to be exerted. 150 // Agent moves with a PID controller causing a force to be exerted.
149 private bool m_newCoarseLocations = true; 151 private bool m_newCoarseLocations = true;
@@ -158,43 +160,43 @@ namespace OpenSim.Region.Framework.Scenes
158 private readonly Vector3[] Dir_Vectors = new Vector3[6]; 160 private readonly Vector3[] Dir_Vectors = new Vector3[6];
159 161
160 // Position of agent's camera in world (region cordinates) 162 // Position of agent's camera in world (region cordinates)
161 protected Vector3 m_CameraCenter = Vector3.Zero; 163 protected Vector3 m_CameraCenter;
162 protected Vector3 m_lastCameraCenter = Vector3.Zero; 164 protected Vector3 m_lastCameraCenter;
163 165
164 protected Timer m_reprioritization_timer; 166 protected Timer m_reprioritization_timer;
165 protected bool m_reprioritizing = false; 167 protected bool m_reprioritizing;
166 protected bool m_reprioritization_called = false; 168 protected bool m_reprioritization_called;
167 169
168 // Use these three vectors to figure out what the agent is looking at 170 // Use these three vectors to figure out what the agent is looking at
169 // Convert it to a Matrix and/or Quaternion 171 // Convert it to a Matrix and/or Quaternion
170 protected Vector3 m_CameraAtAxis = Vector3.Zero; 172 protected Vector3 m_CameraAtAxis;
171 protected Vector3 m_CameraLeftAxis = Vector3.Zero; 173 protected Vector3 m_CameraLeftAxis;
172 protected Vector3 m_CameraUpAxis = Vector3.Zero; 174 protected Vector3 m_CameraUpAxis;
173 private uint m_AgentControlFlags; 175 private uint m_AgentControlFlags;
174 private Quaternion m_headrotation = Quaternion.Identity; 176 private Quaternion m_headrotation = Quaternion.Identity;
175 private byte m_state; 177 private byte m_state;
176 178
177 //Reuse the Vector3 instead of creating a new one on the UpdateMovement method 179 //Reuse the Vector3 instead of creating a new one on the UpdateMovement method
178 private Vector3 movementvector = Vector3.Zero; 180 private Vector3 movementvector;
179 181
180 private bool m_autopilotMoving; 182 private bool m_autopilotMoving;
181 private Vector3 m_autoPilotTarget = Vector3.Zero; 183 private Vector3 m_autoPilotTarget;
182 private bool m_sitAtAutoTarget; 184 private bool m_sitAtAutoTarget;
183 185
184 private string m_nextSitAnimation = String.Empty; 186 private string m_nextSitAnimation = String.Empty;
185 187
186 //PauPaw:Proper PID Controler for autopilot************ 188 //PauPaw:Proper PID Controler for autopilot************
187 private bool m_moveToPositionInProgress; 189 private bool m_moveToPositionInProgress;
188 private Vector3 m_moveToPositionTarget = Vector3.Zero; 190 private Vector3 m_moveToPositionTarget;
189 191
190 private bool m_followCamAuto = false; 192 private bool m_followCamAuto;
191 193
192 private int m_movementUpdateCount = 0; 194 private int m_movementUpdateCount;
193 195
194 private const int NumMovementsBetweenRayCast = 5; 196 private const int NumMovementsBetweenRayCast = 5;
195 197
196 private bool CameraConstraintActive = false; 198 private bool CameraConstraintActive;
197 //private int m_moveToPositionStateStatus = 0; 199 //private int m_moveToPositionStateStatus;
198 //***************************************************** 200 //*****************************************************
199 201
200 // Agent's Draw distance. 202 // Agent's Draw distance.
@@ -444,7 +446,7 @@ namespace OpenSim.Region.Framework.Scenes
444 } 446 }
445 447
446 m_pos = value; 448 m_pos = value;
447 m_parentPosition = new Vector3(0, 0, 0); 449 m_parentPosition = Vector3.Zero;
448 } 450 }
449 } 451 }
450 452
@@ -457,22 +459,21 @@ namespace OpenSim.Region.Framework.Scenes
457 { 459 {
458 PhysicsActor actor = m_physicsActor; 460 PhysicsActor actor = m_physicsActor;
459 if (actor != null) 461 if (actor != null)
460 m_velocity = m_physicsActor.Velocity; 462 m_velocity = actor.Velocity;
461 463
462 return m_velocity; 464 return m_velocity;
463 } 465 }
464 set 466 set
465 { 467 {
466 //m_log.DebugFormat("In {0} setting velocity of {1} to {2}", m_scene.RegionInfo.RegionName, Name, value); 468 //m_log.DebugFormat("In {0} setting velocity of {1} to {2}", m_scene.RegionInfo.RegionName, Name, value);
467 469
468 if (m_physicsActor != null) 470 PhysicsActor actor = m_physicsActor;
471 if (actor != null)
469 { 472 {
470 try 473 try
471 { 474 {
472 lock (m_scene.SyncRoot) 475 lock (m_scene.SyncRoot)
473 { 476 actor.Velocity = value;
474 m_physicsActor.Velocity = value;
475 }
476 } 477 }
477 catch (Exception e) 478 catch (Exception e)
478 { 479 {
@@ -934,7 +935,7 @@ namespace OpenSim.Region.Framework.Scenes
934 isFlying = m_physicsActor.Flying; 935 isFlying = m_physicsActor.Flying;
935 936
936 RemoveFromPhysicalScene(); 937 RemoveFromPhysicalScene();
937 Velocity = new Vector3(0, 0, 0); 938 Velocity = Vector3.Zero;
938 AbsolutePosition = pos; 939 AbsolutePosition = pos;
939 AddToPhysicalScene(isFlying); 940 AddToPhysicalScene(isFlying);
940 if (m_appearance != null) 941 if (m_appearance != null)
@@ -982,12 +983,13 @@ namespace OpenSim.Region.Framework.Scenes
982 983
983 if (m_avHeight != 127.0f) 984 if (m_avHeight != 127.0f)
984 { 985 {
985 AbsolutePosition = AbsolutePosition + new Vector3(0, 0, (m_avHeight / 6f)); 986 AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (m_avHeight / 6f));
986 } 987 }
987 else 988 else
988 { 989 {
989 AbsolutePosition = AbsolutePosition + new Vector3(0, 0, (1.56f / 6f)); 990 AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (1.56f / 6f));
990 } 991 }
992
991 TrySetMovementAnimation("LAND"); 993 TrySetMovementAnimation("LAND");
992 SendFullUpdateToAllClients(); 994 SendFullUpdateToAllClients();
993 } 995 }
@@ -1534,7 +1536,7 @@ namespace OpenSim.Region.Framework.Scenes
1534 if (part != null) 1536 if (part != null)
1535 { 1537 {
1536 AbsolutePosition = part.AbsolutePosition; 1538 AbsolutePosition = part.AbsolutePosition;
1537 Velocity = new Vector3(0, 0, 0); 1539 Velocity = Vector3.Zero;
1538 SendFullUpdateToAllClients(); 1540 SendFullUpdateToAllClients();
1539 1541
1540 //HandleAgentSit(ControllingClient, m_requestedSitTargetUUID); 1542 //HandleAgentSit(ControllingClient, m_requestedSitTargetUUID);
@@ -1851,7 +1853,7 @@ namespace OpenSim.Region.Framework.Scenes
1851 } 1853 }
1852 m_parentID = m_requestedSitTargetID; 1854 m_parentID = m_requestedSitTargetID;
1853 1855
1854 Velocity = new Vector3(0, 0, 0); 1856 Velocity = Vector3.Zero;
1855 RemoveFromPhysicalScene(); 1857 RemoveFromPhysicalScene();
1856 1858
1857 TrySetMovementAnimation(sitAnimation); 1859 TrySetMovementAnimation(sitAnimation);
@@ -2008,7 +2010,7 @@ namespace OpenSim.Region.Framework.Scenes
2008 protected void TrySetMovementAnimation(string anim) 2010 protected void TrySetMovementAnimation(string anim)
2009 { 2011 {
2010 //m_log.DebugFormat("Updating movement animation to {0}", anim); 2012 //m_log.DebugFormat("Updating movement animation to {0}", anim);
2011 2013
2012 if (!m_isChildAgent) 2014 if (!m_isChildAgent)
2013 { 2015 {
2014 if (m_animations.TrySetDefaultAnimation(anim, m_controllingClient.NextAnimationSequenceNumber, UUID.Zero)) 2016 if (m_animations.TrySetDefaultAnimation(anim, m_controllingClient.NextAnimationSequenceNumber, UUID.Zero))
@@ -2239,12 +2241,176 @@ namespace OpenSim.Region.Framework.Scenes
2239 } 2241 }
2240 } 2242 }
2241 2243
2244 public string GetMovementAnimation2()
2245 {
2246 const float FALL_DELAY = 0.33f;
2247 const float PREJUMP_DELAY = 0.25f;
2248
2249 m_allowFalling = true;
2250
2251 AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_AgentControlFlags;
2252 PhysicsActor actor = m_physicsActor;
2253
2254 // Create forward and left vectors from the current avatar rotation
2255 Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(m_bodyRot);
2256 Vector3 fwd = Vector3.Transform(Vector3.UnitX, rotMatrix);
2257 Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix);
2258
2259 // Check control flags
2260 bool heldForward = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS;
2261 bool heldBack = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG;
2262 bool heldLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS;
2263 bool heldRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG;
2264 //bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
2265 //bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
2266 bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS;
2267 bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG;
2268 //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY;
2269 //bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK;
2270
2271 // Direction in which the avatar is trying to move
2272 Vector3 move = Vector3.Zero;
2273 if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; }
2274 if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; }
2275 if (heldLeft) { move.X += left.X; move.Y += left.Y; }
2276 if (heldRight) { move.X -= left.X; move.Y -= left.Y; }
2277 if (heldUp) { move.Z += 1; }
2278 if (heldDown) { move.Z -= 1; }
2279
2280 // Is the avatar trying to move?
2281 bool moving = (move != Vector3.Zero);
2282 bool jumping = m_animTickJump != 0;
2283
2284 #region Flying
2285
2286 if (actor != null && actor.Flying)
2287 {
2288 m_animTickFall = 0;
2289 m_animTickJump = 0;
2290
2291 if (move.X != 0f || move.Y != 0f)
2292 {
2293 return (m_useFlySlow ? "FLYSLOW" : "FLY");
2294 }
2295 else if (move.Z > 0f)
2296 {
2297 return "HOVER_UP";
2298 }
2299 else if (move.Z < 0f)
2300 {
2301 if (actor != null && actor.IsColliding)
2302 return "LAND";
2303 else
2304 return "HOVER_DOWN";
2305 }
2306 else
2307 {
2308 return "HOVER";
2309 }
2310 }
2311
2312 #endregion Flying
2313
2314 #region Falling/Floating/Landing
2315
2316 if (actor == null || !actor.IsColliding)
2317 {
2318 float fallElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
2319
2320 if (m_animTickFall == 0 || (fallElapsed > FALL_DELAY && actor.Velocity.Z >= 0.0f))
2321 {
2322 // Just started falling
2323 m_animTickFall = Environment.TickCount;
2324 }
2325 else if (!jumping && fallElapsed > FALL_DELAY)
2326 {
2327 // Falling long enough to trigger the animation
2328 return "FALLDOWN";
2329 }
2330
2331 return m_movementAnimation;
2332 }
2333
2334 #endregion Falling/Floating/Landing
2335
2336 #region Ground Movement
2337
2338 if (m_movementAnimation == "FALLDOWN")
2339 {
2340 m_animTickFall = Environment.TickCount;
2341
2342 // TODO: SOFT_LAND support
2343 return "LAND";
2344 }
2345 else if (m_movementAnimation == "LAND")
2346 {
2347 float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
2348
2349 if (landElapsed <= FALL_DELAY)
2350 return "LAND";
2351 }
2352
2353 m_animTickFall = 0;
2354
2355 if (move.Z > 0f)
2356 {
2357 // Jumping
2358 if (!jumping)
2359 {
2360 // Begin prejump
2361 m_animTickJump = Environment.TickCount;
2362 return "PREJUMP";
2363 }
2364 else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 1000.0f)
2365 {
2366 // Start actual jump
2367 if (m_animTickJump == -1)
2368 {
2369 // Already jumping! End the current jump
2370 m_animTickJump = 0;
2371 return "JUMP";
2372 }
2373
2374 m_animTickJump = -1;
2375 return "JUMP";
2376 }
2377 }
2378 else
2379 {
2380 // Not jumping
2381 m_animTickJump = 0;
2382
2383 if (move.X != 0f || move.Y != 0f)
2384 {
2385 // Walking / crouchwalking / running
2386 if (move.Z < 0f)
2387 return "CROUCHWALK";
2388 else if (m_setAlwaysRun)
2389 return "RUN";
2390 else
2391 return "WALK";
2392 }
2393 else
2394 {
2395 // Not walking
2396 if (move.Z < 0f)
2397 return "CROUCH";
2398 else
2399 return "STAND";
2400 }
2401 }
2402
2403 #endregion Ground Movement
2404
2405 return m_movementAnimation;
2406 }
2407
2242 /// <summary> 2408 /// <summary>
2243 /// Update the movement animation of this avatar according to its current state 2409 /// Update the movement animation of this avatar according to its current state
2244 /// </summary> 2410 /// </summary>
2245 protected void UpdateMovementAnimations() 2411 protected void UpdateMovementAnimations()
2246 { 2412 {
2247 string movementAnimation = GetMovementAnimation(); 2413 string movementAnimation = GetMovementAnimation2();
2248 2414
2249 if (movementAnimation == "FALLDOWN" && m_allowFalling == false) 2415 if (movementAnimation == "FALLDOWN" && m_allowFalling == false)
2250 { 2416 {
@@ -2367,7 +2533,8 @@ namespace OpenSim.Region.Framework.Scenes
2367 2533
2368 if (m_isChildAgent == false) 2534 if (m_isChildAgent == false)
2369 { 2535 {
2370 Vector3 velocity = (m_physicsActor != null) ? m_physicsActor.Velocity : Vector3.Zero; 2536 PhysicsActor actor = m_physicsActor;
2537 Vector3 velocity = (actor != null) ? actor.Velocity : Vector3.Zero;
2371 2538
2372 // Throw away duplicate or insignificant updates 2539 // Throw away duplicate or insignificant updates
2373 if (!m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) || 2540 if (!m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||