aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs281
1 files changed, 158 insertions, 123 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index db3b834..2d1b0df 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -48,7 +48,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
48 48
49 public AnimationSet Animations 49 public AnimationSet Animations
50 { 50 {
51 get { return m_animations; } 51 get { return m_animations; }
52 } 52 }
53 protected AnimationSet m_animations = new AnimationSet(); 53 protected AnimationSet m_animations = new AnimationSet();
54 54
@@ -56,25 +56,27 @@ namespace OpenSim.Region.Framework.Scenes.Animation
56 /// The current movement animation 56 /// The current movement animation
57 /// </value> 57 /// </value>
58 public string CurrentMovementAnimation { get; private set; } 58 public string CurrentMovementAnimation { get; private set; }
59 59
60 private int m_animTickFall; 60 private int m_animTickFall;
61 public int m_animTickJump; // ScenePresence has to see this to control +Z force 61 private int m_animTickLand;
62 public bool m_jumping = false; 62 private int m_animTickJump;
63 public float m_jumpVelocity = 0f; 63
64// private int m_landing = 0; 64 public bool m_jumping = false;
65
66 // private int m_landing = 0;
65 67
66 /// <summary> 68 /// <summary>
67 /// Is the avatar falling? 69 /// Is the avatar falling?
68 /// </summary> 70 /// </summary>
69 public bool Falling { get; private set; } 71 public bool Falling { get; private set; }
70 72
71 private float m_fallHeight; 73 private float m_lastFallVelocity;
72 74
73 /// <value> 75 /// <value>
74 /// The scene presence that this animator applies to 76 /// The scene presence that this animator applies to
75 /// </value> 77 /// </value>
76 protected ScenePresence m_scenePresence; 78 protected ScenePresence m_scenePresence;
77 79
78 public ScenePresenceAnimator(ScenePresence sp) 80 public ScenePresenceAnimator(ScenePresence sp)
79 { 81 {
80 m_scenePresence = sp; 82 m_scenePresence = sp;
@@ -89,7 +91,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
89 // m_log.DebugFormat("[SCENE PRESENCE ANIMATOR]: Adding animation {0} for {1}", animID, m_scenePresence.Name); 91 // m_log.DebugFormat("[SCENE PRESENCE ANIMATOR]: Adding animation {0} for {1}", animID, m_scenePresence.Name);
90 if (m_scenePresence.Scene.DebugAnimations) 92 if (m_scenePresence.Scene.DebugAnimations)
91 m_log.DebugFormat( 93 m_log.DebugFormat(
92 "[SCENE PRESENCE ANIMATOR]: Adding animation {0} {1} for {2}", 94 "[SCENE PRESENCE ANIMATOR]: Adding animation {0} {1} for {2}",
93 GetAnimName(animID), animID, m_scenePresence.Name); 95 GetAnimName(animID), animID, m_scenePresence.Name);
94 96
95 if (m_animations.Add(animID, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, objectID)) 97 if (m_animations.Add(animID, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, objectID))
@@ -111,7 +113,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
111 if (animID == UUID.Zero) 113 if (animID == UUID.Zero)
112 return; 114 return;
113 115
114// m_log.DebugFormat("[SCENE PRESENCE ANIMATOR]: Adding animation {0} {1} for {2}", animID, name, m_scenePresence.Name); 116 // m_log.DebugFormat("[SCENE PRESENCE ANIMATOR]: Adding animation {0} {1} for {2}", animID, name, m_scenePresence.Name);
115 117
116 AddAnimation(animID, objectID); 118 AddAnimation(animID, objectID);
117 } 119 }
@@ -131,7 +133,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
131 133
132 if (m_scenePresence.Scene.DebugAnimations) 134 if (m_scenePresence.Scene.DebugAnimations)
133 m_log.DebugFormat( 135 m_log.DebugFormat(
134 "[SCENE PRESENCE ANIMATOR]: Removing animation {0} {1} for {2}", 136 "[SCENE PRESENCE ANIMATOR]: Removing animation {0} {1} for {2}",
135 GetAnimName(animID), animID, m_scenePresence.Name); 137 GetAnimName(animID), animID, m_scenePresence.Name);
136 138
137 if (m_animations.Remove(animID, allowNoDefault)) 139 if (m_animations.Remove(animID, allowNoDefault))
@@ -153,7 +155,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
153 else 155 else
154 m_animations.Remove(animID, false); 156 m_animations.Remove(animID, false);
155 } 157 }
156 if(sendPack) 158 if (sendPack)
157 SendAnimPack(); 159 SendAnimPack();
158 } 160 }
159 161
@@ -205,7 +207,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
205 207
206 if (aoSitGndAnim != UUID.Zero) 208 if (aoSitGndAnim != UUID.Zero)
207 { 209 {
208 avnChangeAnim(aoSitGndAnim, false, false); 210 avnChangeAnim(aoSitGndAnim, false, true);
209 aoSitGndAnim = UUID.Zero; 211 aoSitGndAnim = UUID.Zero;
210 } 212 }
211 213
@@ -238,9 +240,9 @@ namespace OpenSim.Region.Framework.Scenes.Animation
238 if (m_animations.TrySetDefaultAnimation( 240 if (m_animations.TrySetDefaultAnimation(
239 anim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, m_scenePresence.UUID)) 241 anim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, m_scenePresence.UUID))
240 { 242 {
241 // m_log.DebugFormat( 243// m_log.DebugFormat(
242 // "[SCENE PRESENCE ANIMATOR]: Updating movement animation to {0} for {1}", 244// "[SCENE PRESENCE ANIMATOR]: Updating movement animation to {0} for {1}",
243 // anim, m_scenePresence.Name); 245// anim, m_scenePresence.Name);
244 246
245 // 16384 is CHANGED_ANIMATION 247 // 16384 is CHANGED_ANIMATION
246 m_scenePresence.SendScriptEventToAttachments("changed", new Object[] { (int)Changed.ANIMATION }); 248 m_scenePresence.SendScriptEventToAttachments("changed", new Object[] { (int)Changed.ANIMATION });
@@ -258,83 +260,119 @@ namespace OpenSim.Region.Framework.Scenes.Animation
258 return ret; 260 return ret;
259 } 261 }
260 262
263 public enum motionControlStates : byte
264 {
265 sitted = 0,
266 flying,
267 falling,
268 jumping,
269 landing,
270 onsurface
271 }
272
273 public motionControlStates currentControlState = motionControlStates.onsurface;
274
261 /// <summary> 275 /// <summary>
262 /// This method determines the proper movement related animation 276 /// This method determines the proper movement related animation
263 /// </summary> 277 /// </summary>
264 private string DetermineMovementAnimation() 278 private string DetermineMovementAnimation()
265 { 279 {
266 const float FALL_DELAY = 800f; 280 const int FALL_DELAY = 800;
267 const float PREJUMP_DELAY = 200f; 281 const int PREJUMP_DELAY = 200;
268 const float JUMP_PERIOD = 800f; 282 const int JUMP_PERIOD = 800;
269 #region Inputs 283 #region Inputs
270 284
285 if (m_scenePresence.IsInTransit)
286 return CurrentMovementAnimation;
287
271 if (m_scenePresence.SitGround) 288 if (m_scenePresence.SitGround)
289 {
290 currentControlState = motionControlStates.sitted;
272 return "SITGROUND"; 291 return "SITGROUND";
292 }
273 if (m_scenePresence.ParentID != 0 || m_scenePresence.ParentUUID != UUID.Zero) 293 if (m_scenePresence.ParentID != 0 || m_scenePresence.ParentUUID != UUID.Zero)
294 {
295 currentControlState = motionControlStates.sitted;
274 return "SIT"; 296 return "SIT";
297 }
275 298
276 AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags; 299 AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags;
277 PhysicsActor actor = m_scenePresence.PhysicsActor; 300 PhysicsActor actor = m_scenePresence.PhysicsActor;
278 301
279 // Create forward and left vectors from the current avatar rotation 302 const AgentManager.ControlFlags ANYXYMASK = (
280 Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(m_scenePresence.Rotation); 303 AgentManager.ControlFlags.AGENT_CONTROL_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS |
281 Vector3 fwd = Vector3.Transform(Vector3.UnitX, rotMatrix); 304 AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG |
282 Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix); 305 AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS |
306 AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG
307 );
283 308
284 // Check control flags 309 // Check control flags
285 bool heldForward = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS); 310/* not in use
286 bool heldBack = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG); 311 bool heldForward = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS)) != 0);
287 bool heldLeft = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS); 312 bool heldBack = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG)) != 0);
288 bool heldRight = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG); 313 bool heldLeft = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS)) != 0);
314 bool heldRight = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG)) != 0);
315*/
289 bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT; 316 bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
290 bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT; 317 bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
291 bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS; 318// bool heldUp = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_UP_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS)) != 0);
292 bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG; 319 // excluded nudge up so it doesn't trigger jump state
320 bool heldUp = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_UP_POS)) != 0);
321 bool heldDown = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG)) != 0);
293 //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY; 322 //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY;
294 //bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK; 323 //bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK;
295 if (heldForward || heldBack || heldLeft || heldRight || heldUp || heldDown) 324
325 bool heldOnXY = ((controlFlags & ANYXYMASK) != 0);
326 if (heldOnXY || heldUp || heldDown)
296 { 327 {
297 heldTurnLeft = false; 328 heldTurnLeft = false;
298 heldTurnRight = false; 329 heldTurnRight = false;
299 } 330 }
300 331
301 // Direction in which the avatar is trying to move
302 Vector3 move = Vector3.Zero;
303 if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; }
304 if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; }
305 if (heldLeft) { move.X += left.X; move.Y += left.Y; }
306 if (heldRight) { move.X -= left.X; move.Y -= left.Y; }
307 if (heldUp) { move.Z += 1; }
308 if (heldDown) { move.Z -= 1; }
309
310 // Is the avatar trying to move?
311// bool moving = (move != Vector3.Zero);
312 #endregion Inputs 332 #endregion Inputs
313 333
334 // no physics actor case
335 if (actor == null)
336 {
337 // well what to do?
338
339 currentControlState = motionControlStates.onsurface;
340 if (heldOnXY)
341 return "WALK";
342
343 return "STAND";
344 }
345
314 #region Flying 346 #region Flying
315 347
316 if (actor != null && actor.Flying) 348 bool isColliding = actor.IsColliding;
349
350 if (actor.Flying)
317 { 351 {
318 m_animTickFall = 0; 352 m_animTickFall = 0;
319 m_animTickJump = 0; 353 m_animTickJump = 0;
320 m_jumping = false; 354 m_jumping = false;
321 Falling = false; 355 Falling = false;
322 m_jumpVelocity = 0f;
323 actor.Selected = false;
324 m_fallHeight = actor.Position.Z; // save latest flying height
325 356
326 if (move.X != 0f || move.Y != 0f) 357 currentControlState = motionControlStates.flying;
358
359 if (heldOnXY)
327 { 360 {
328 return (m_scenePresence.Scene.m_useFlySlow ? "FLYSLOW" : "FLY"); 361 return (m_scenePresence.Scene.m_useFlySlow ? "FLYSLOW" : "FLY");
329 } 362 }
330 else if (move.Z > 0f) 363 else if (heldUp)
331 { 364 {
332 return "HOVER_UP"; 365 return "HOVER_UP";
333 } 366 }
334 else if (move.Z < 0f) 367 else if (heldDown)
335 { 368 {
336 if (actor != null && actor.IsColliding) 369 if (isColliding)
370 {
371 actor.Flying = false;
372 currentControlState = motionControlStates.landing;
373 m_animTickLand = Environment.TickCount;
337 return "LAND"; 374 return "LAND";
375 }
338 else 376 else
339 return "HOVER_DOWN"; 377 return "HOVER_DOWN";
340 } 378 }
@@ -343,81 +381,88 @@ namespace OpenSim.Region.Framework.Scenes.Animation
343 return "HOVER"; 381 return "HOVER";
344 } 382 }
345 } 383 }
384 else
385 {
386 if (isColliding && currentControlState == motionControlStates.flying)
387 {
388 currentControlState = motionControlStates.landing;
389 m_animTickLand = Environment.TickCount;
390 return "LAND";
391 }
392 }
346 393
347 #endregion Flying 394 #endregion Flying
348 395
349 #region Falling/Floating/Landing 396 #region Falling/Floating/Landing
350 397
351 if ((actor == null || !actor.IsColliding) && !m_jumping) 398 if (!isColliding && currentControlState != motionControlStates.jumping)
352 { 399 {
353 float fallElapsed = (float)(Environment.TickCount - m_animTickFall); 400 float fallVelocity = actor.Velocity.Z;
354 float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f;
355 401
356 if (!m_jumping && (fallVelocity < -3.0f)) 402 if (fallVelocity < -2.5f)
357 Falling = true; 403 Falling = true;
358 404
359 if (m_animTickFall == 0 || (fallVelocity >= 0.0f)) 405 if (m_animTickFall == 0 || (fallVelocity >= -0.5f))
360 { 406 {
361 // not falling yet, or going up
362 // reset start of fall time
363 m_animTickFall = Environment.TickCount; 407 m_animTickFall = Environment.TickCount;
364 } 408 }
365 else if (!m_jumping && (fallElapsed > FALL_DELAY) && (fallVelocity < -3.0f) && (m_scenePresence.WasFlying)) 409 else
366 { 410 {
367 // Falling long enough to trigger the animation 411 int fallElapsed = (Environment.TickCount - m_animTickFall);
368 return "FALLDOWN"; 412 if ((fallElapsed > FALL_DELAY) && (fallVelocity < -3.0f))
413 {
414 currentControlState = motionControlStates.falling;
415 m_lastFallVelocity = fallVelocity;
416 // Falling long enough to trigger the animation
417 return "FALLDOWN";
418 }
369 } 419 }
370 420
371 // Check if the user has stopped walking just now 421 // Check if the user has stopped walking just now
372 if (CurrentMovementAnimation == "WALK" && (move == Vector3.Zero)) 422 if (CurrentMovementAnimation == "WALK" && !heldOnXY && !heldDown && !heldUp)
373 return "STAND"; 423 return "STAND";
374 424
375 return CurrentMovementAnimation; 425 return CurrentMovementAnimation;
376 } 426 }
377 427
378 #endregion Falling/Floating/Landing 428 m_animTickFall = 0;
379 429
430 #endregion Falling/Floating/Landing
380 431
381 #region Jumping // section added for jumping... 432 #region Jumping // section added for jumping...
382 433
383 int jumptime; 434 if (isColliding && heldUp && currentControlState != motionControlStates.jumping)
384 jumptime = Environment.TickCount - m_animTickJump; 435 {
385
386 if ((move.Z > 0f) && (!m_jumping))
387 {
388 // Start jumping, prejump 436 // Start jumping, prejump
389 m_animTickFall = 0; 437 currentControlState = motionControlStates.jumping;
390 m_jumping = true; 438 m_jumping = true;
391 Falling = false; 439 Falling = false;
392 actor.Selected = true; // borrowed for jumping flag
393 m_animTickJump = Environment.TickCount; 440 m_animTickJump = Environment.TickCount;
394 m_jumpVelocity = 0.35f;
395 return "PREJUMP"; 441 return "PREJUMP";
396 } 442 }
397 443
398 if (m_jumping) 444 if (currentControlState == motionControlStates.jumping)
399 { 445 {
446 int jumptime = Environment.TickCount - m_animTickJump;
400 if ((jumptime > (JUMP_PERIOD * 1.5f)) && actor.IsColliding) 447 if ((jumptime > (JUMP_PERIOD * 1.5f)) && actor.IsColliding)
401 { 448 {
402 // end jumping 449 // end jumping
403 m_jumping = false; 450 m_jumping = false;
404 Falling = false; 451 Falling = false;
405 actor.Selected = false; // borrowed for jumping flag 452 actor.Selected = false; // borrowed for jumping flag
406 m_jumpVelocity = 0f; 453 m_animTickLand = Environment.TickCount;
407 m_animTickFall = Environment.TickCount; 454 currentControlState = motionControlStates.landing;
408 return "LAND"; 455 return "LAND";
409 } 456 }
410 else if (jumptime > JUMP_PERIOD) 457 else if (jumptime > JUMP_PERIOD)
411 { 458 {
412 // jump down 459 // jump down
413 m_jumpVelocity = 0f;
414 return "JUMP"; 460 return "JUMP";
415 } 461 }
416 else if (jumptime > PREJUMP_DELAY) 462 else if (jumptime > PREJUMP_DELAY)
417 { 463 {
418 // jump up 464 // jump up
419 m_jumping = true; 465 m_jumping = true;
420 m_jumpVelocity = 10f;
421 return "JUMP"; 466 return "JUMP";
422 } 467 }
423 } 468 }
@@ -426,45 +471,52 @@ namespace OpenSim.Region.Framework.Scenes.Animation
426 471
427 #region Ground Movement 472 #region Ground Movement
428 473
429 if (CurrentMovementAnimation == "FALLDOWN") 474 if (currentControlState == motionControlStates.falling)
430 { 475 {
431 Falling = false; 476 Falling = false;
432 m_animTickFall = Environment.TickCount; 477 currentControlState = motionControlStates.landing;
478 m_animTickLand = Environment.TickCount;
433 // TODO: SOFT_LAND support 479 // TODO: SOFT_LAND support
434 float fallHeight = m_fallHeight - actor.Position.Z; 480 float fallVsq = m_lastFallVelocity * m_lastFallVelocity;
435 if (fallHeight > 15.0f) 481 if (fallVsq > 300f) // aprox 20*h
436 return "STANDUP"; 482 return "STANDUP";
437 else if (fallHeight > 8.0f) 483 else if (fallVsq > 160f)
438 return "SOFT_LAND"; 484 return "SOFT_LAND";
439 else 485 else
440 return "LAND"; 486 return "LAND";
441 } 487 }
442 else if ((CurrentMovementAnimation == "LAND") || (CurrentMovementAnimation == "SOFT_LAND") || (CurrentMovementAnimation == "STANDUP")) 488
489
490 if (currentControlState == motionControlStates.landing)
443 { 491 {
444 int landElapsed = Environment.TickCount - m_animTickFall; 492 Falling = false;
493 int landElapsed = Environment.TickCount - m_animTickLand;
445 int limit = 1000; 494 int limit = 1000;
446 if (CurrentMovementAnimation == "LAND") 495 if (CurrentMovementAnimation == "LAND")
447 limit = 350; 496 limit = 350;
448 // NB if the above is set too long a weird anim reset from some place prevents STAND from being sent to client 497 // NB if the above is set too long a weird anim reset from some place prevents STAND from being sent to client
449 498
450 if ((m_animTickFall != 0) && (landElapsed <= limit)) 499 if ((m_animTickLand != 0) && (landElapsed <= limit))
451 { 500 {
452 return CurrentMovementAnimation; 501 return CurrentMovementAnimation;
453 } 502 }
454 else 503 else
455 { 504 {
456 m_fallHeight = actor.Position.Z; // save latest flying height 505 currentControlState = motionControlStates.onsurface;
506 m_animTickLand = 0;
457 return "STAND"; 507 return "STAND";
458 } 508 }
459 } 509 }
460 510
511
461 // next section moved outside paren. and realigned for jumping 512 // next section moved outside paren. and realigned for jumping
462 if (move.X != 0f || move.Y != 0f) 513
514 if (heldOnXY)
463 { 515 {
464 m_fallHeight = actor.Position.Z; // save latest flying height 516 currentControlState = motionControlStates.onsurface;
465 Falling = false; 517 Falling = false;
466 // Walking / crouchwalking / running 518 // Walking / crouchwalking / running
467 if (move.Z < 0f) 519 if (heldDown)
468 { 520 {
469 return "CROUCHWALK"; 521 return "CROUCHWALK";
470 } 522 }
@@ -480,9 +532,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation
480 } 532 }
481 else if (!m_jumping) 533 else if (!m_jumping)
482 { 534 {
535 currentControlState = motionControlStates.onsurface;
483 Falling = false; 536 Falling = false;
484 // Not walking 537 // Not walking
485 if (move.Z < 0) 538 if(heldDown)
486 return "CROUCH"; 539 return "CROUCH";
487 else if (heldTurnLeft) 540 else if (heldTurnLeft)
488 return "TURNLEFT"; 541 return "TURNLEFT";
@@ -493,8 +546,6 @@ namespace OpenSim.Region.Framework.Scenes.Animation
493 } 546 }
494 #endregion Ground Movement 547 #endregion Ground Movement
495 548
496 Falling = false;
497
498 return CurrentMovementAnimation; 549 return CurrentMovementAnimation;
499 } 550 }
500 551
@@ -504,7 +555,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
504 /// <returns>'true' if the animation was changed</returns> 555 /// <returns>'true' if the animation was changed</returns>
505 public bool UpdateMovementAnimations() 556 public bool UpdateMovementAnimations()
506 { 557 {
507// m_log.DebugFormat("[SCENE PRESENCE ANIMATOR]: Updating movement animations for {0}", m_scenePresence.Name); 558 // m_log.DebugFormat("[SCENE PRESENCE ANIMATOR]: Updating movement animations for {0}", m_scenePresence.Name);
508 559
509 bool ret = false; 560 bool ret = false;
510 lock (m_animations) 561 lock (m_animations)
@@ -552,19 +603,19 @@ namespace OpenSim.Region.Framework.Scenes.Animation
552 m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs); 603 m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
553 return animIDs; 604 return animIDs;
554 } 605 }
555 606
556 public BinBVHAnimation GenerateRandomAnimation() 607 public BinBVHAnimation GenerateRandomAnimation()
557 { 608 {
558 int rnditerations = 3; 609 int rnditerations = 3;
559 BinBVHAnimation anim = new BinBVHAnimation(); 610 BinBVHAnimation anim = new BinBVHAnimation();
560 List<string> parts = new List<string>(); 611 List<string> parts = new List<string>();
561 parts.Add("mPelvis");parts.Add("mHead");parts.Add("mTorso"); 612 parts.Add("mPelvis"); parts.Add("mHead"); parts.Add("mTorso");
562 parts.Add("mHipLeft");parts.Add("mHipRight");parts.Add("mHipLeft");parts.Add("mKneeLeft"); 613 parts.Add("mHipLeft"); parts.Add("mHipRight"); parts.Add("mHipLeft"); parts.Add("mKneeLeft");
563 parts.Add("mKneeRight");parts.Add("mCollarLeft");parts.Add("mCollarRight");parts.Add("mNeck"); 614 parts.Add("mKneeRight"); parts.Add("mCollarLeft"); parts.Add("mCollarRight"); parts.Add("mNeck");
564 parts.Add("mElbowLeft");parts.Add("mElbowRight");parts.Add("mWristLeft");parts.Add("mWristRight"); 615 parts.Add("mElbowLeft"); parts.Add("mElbowRight"); parts.Add("mWristLeft"); parts.Add("mWristRight");
565 parts.Add("mShoulderLeft");parts.Add("mShoulderRight");parts.Add("mAnkleLeft");parts.Add("mAnkleRight"); 616 parts.Add("mShoulderLeft"); parts.Add("mShoulderRight"); parts.Add("mAnkleLeft"); parts.Add("mAnkleRight");
566 parts.Add("mEyeRight");parts.Add("mChest");parts.Add("mToeLeft");parts.Add("mToeRight"); 617 parts.Add("mEyeRight"); parts.Add("mChest"); parts.Add("mToeLeft"); parts.Add("mToeRight");
567 parts.Add("mFootLeft");parts.Add("mFootRight");parts.Add("mEyeLeft"); 618 parts.Add("mFootLeft"); parts.Add("mFootRight"); parts.Add("mEyeLeft");
568 anim.HandPose = 1; 619 anim.HandPose = 1;
569 anim.InPoint = 0; 620 anim.InPoint = 0;
570 anim.OutPoint = (rnditerations * .10f); 621 anim.OutPoint = (rnditerations * .10f);
@@ -588,12 +639,12 @@ namespace OpenSim.Region.Framework.Scenes.Animation
588 for (int i = 0; i < rnditerations; i++) 639 for (int i = 0; i < rnditerations; i++)
589 { 640 {
590 anim.Joints[j].rotationkeys[i] = new binBVHJointKey(); 641 anim.Joints[j].rotationkeys[i] = new binBVHJointKey();
591 anim.Joints[j].rotationkeys[i].time = (i*.10f); 642 anim.Joints[j].rotationkeys[i].time = (i * .10f);
592 anim.Joints[j].rotationkeys[i].key_element.X = ((float) rnd.NextDouble()*2 - 1); 643 anim.Joints[j].rotationkeys[i].key_element.X = ((float)rnd.NextDouble() * 2 - 1);
593 anim.Joints[j].rotationkeys[i].key_element.Y = ((float) rnd.NextDouble()*2 - 1); 644 anim.Joints[j].rotationkeys[i].key_element.Y = ((float)rnd.NextDouble() * 2 - 1);
594 anim.Joints[j].rotationkeys[i].key_element.Z = ((float) rnd.NextDouble()*2 - 1); 645 anim.Joints[j].rotationkeys[i].key_element.Z = ((float)rnd.NextDouble() * 2 - 1);
595 anim.Joints[j].positionkeys[i] = new binBVHJointKey(); 646 anim.Joints[j].positionkeys[i] = new binBVHJointKey();
596 anim.Joints[j].positionkeys[i].time = (i*.10f); 647 anim.Joints[j].positionkeys[i].time = (i * .10f);
597 anim.Joints[j].positionkeys[i].key_element.X = 0; 648 anim.Joints[j].positionkeys[i].key_element.X = 0;
598 anim.Joints[j].positionkeys[i].key_element.Y = 0; 649 anim.Joints[j].positionkeys[i].key_element.Y = 0;
599 anim.Joints[j].positionkeys[i].key_element.Z = 0; 650 anim.Joints[j].positionkeys[i].key_element.Z = 0;
@@ -620,22 +671,6 @@ namespace OpenSim.Region.Framework.Scenes.Animation
620 /// <param name="objectIDs"></param> 671 /// <param name="objectIDs"></param>
621 public void SendAnimPack(UUID[] animations, int[] seqs, UUID[] objectIDs) 672 public void SendAnimPack(UUID[] animations, int[] seqs, UUID[] objectIDs)
622 { 673 {
623/*
624 if (m_scenePresence.IsChildAgent)
625 return;
626
627// m_log.DebugFormat(
628// "[SCENE PRESENCE ANIMATOR]: Sending anim pack with animations '{0}', sequence '{1}', uuids '{2}'",
629// string.Join(",", Array.ConvertAll<UUID, string>(animations, a => a.ToString())),
630// string.Join(",", Array.ConvertAll<int, string>(seqs, s => s.ToString())),
631// string.Join(",", Array.ConvertAll<UUID, string>(objectIDs, o => o.ToString())));
632
633 m_scenePresence.Scene.ForEachClient(
634 delegate(IClientAPI client)
635 {
636 client.SendAnimations(animations, seqs, m_scenePresence.ControllingClient.AgentId, objectIDs);
637 });
638 */
639 m_scenePresence.SendAnimPack(animations, seqs, objectIDs); 674 m_scenePresence.SendAnimPack(animations, seqs, objectIDs);
640 } 675 }
641 676
@@ -645,7 +680,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
645 sequenceNums = null; 680 sequenceNums = null;
646 objectIDs = null; 681 objectIDs = null;
647 682
648 if(m_animations != null) 683 if (m_animations != null)
649 m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs); 684 m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
650 } 685 }
651 686
@@ -668,7 +703,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
668 public void SendAnimPack() 703 public void SendAnimPack()
669 { 704 {
670 //m_log.Debug("Sending animation pack to all"); 705 //m_log.Debug("Sending animation pack to all");
671 706
672 if (m_scenePresence.IsChildAgent) 707 if (m_scenePresence.IsChildAgent)
673 return; 708 return;
674 709
@@ -678,7 +713,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
678 713
679 m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs); 714 m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
680 715
681// SendAnimPack(animIDs, sequenceNums, objectIDs); 716 // SendAnimPack(animIDs, sequenceNums, objectIDs);
682 m_scenePresence.SendAnimPack(animIDs, sequenceNums, objectIDs); 717 m_scenePresence.SendAnimPack(animIDs, sequenceNums, objectIDs);
683 } 718 }
684 719