aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r--OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs147
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs169
2 files changed, 173 insertions, 143 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index db3b834..6003e92 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -56,11 +56,13 @@ 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 private int m_animTickJump;
63
62 public bool m_jumping = false; 64 public bool m_jumping = false;
63 public float m_jumpVelocity = 0f; 65
64// private int m_landing = 0; 66// private int m_landing = 0;
65 67
66 /// <summary> 68 /// <summary>
@@ -68,7 +70,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
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
@@ -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
@@ -258,20 +260,38 @@ 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
271 if (m_scenePresence.SitGround) 285 if (m_scenePresence.SitGround)
286 {
287 currentControlState = motionControlStates.sitted;
272 return "SITGROUND"; 288 return "SITGROUND";
289 }
273 if (m_scenePresence.ParentID != 0 || m_scenePresence.ParentUUID != UUID.Zero) 290 if (m_scenePresence.ParentID != 0 || m_scenePresence.ParentUUID != UUID.Zero)
291 {
292 currentControlState = motionControlStates.sitted;
274 return "SIT"; 293 return "SIT";
294 }
275 295
276 AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags; 296 AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags;
277 PhysicsActor actor = m_scenePresence.PhysicsActor; 297 PhysicsActor actor = m_scenePresence.PhysicsActor;
@@ -311,17 +331,31 @@ namespace OpenSim.Region.Framework.Scenes.Animation
311// bool moving = (move != Vector3.Zero); 331// 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 (move.X != 0f || move.Y != 0f)
341 return "WALK";
342
343 return "STAND";
344 }
345
346
314 #region Flying 347 #region Flying
315 348
316 if (actor != null && actor.Flying) 349 bool isColliding = actor.IsColliding;
350
351 if (actor.Flying)
317 { 352 {
318 m_animTickFall = 0; 353 m_animTickFall = 0;
319 m_animTickJump = 0; 354 m_animTickJump = 0;
320 m_jumping = false; 355 m_jumping = false;
321 Falling = false; 356 Falling = false;
322 m_jumpVelocity = 0f; 357
323 actor.Selected = false; 358 currentControlState = motionControlStates.flying;
324 m_fallHeight = actor.Position.Z; // save latest flying height
325 359
326 if (move.X != 0f || move.Y != 0f) 360 if (move.X != 0f || move.Y != 0f)
327 { 361 {
@@ -333,8 +367,13 @@ namespace OpenSim.Region.Framework.Scenes.Animation
333 } 367 }
334 else if (move.Z < 0f) 368 else if (move.Z < 0f)
335 { 369 {
336 if (actor != null && actor.IsColliding) 370 if (isColliding)
371 {
372 actor.Flying = false;
373 currentControlState = motionControlStates.landing;
374 m_animTickLand = Environment.TickCount;
337 return "LAND"; 375 return "LAND";
376 }
338 else 377 else
339 return "HOVER_DOWN"; 378 return "HOVER_DOWN";
340 } 379 }
@@ -343,29 +382,41 @@ namespace OpenSim.Region.Framework.Scenes.Animation
343 return "HOVER"; 382 return "HOVER";
344 } 383 }
345 } 384 }
385 else
386 {
387 if (isColliding && currentControlState == motionControlStates.flying)
388 {
389 currentControlState = motionControlStates.landing;
390 m_animTickLand = Environment.TickCount;
391 return "LAND";
392 }
393 }
346 394
347 #endregion Flying 395 #endregion Flying
348 396
349 #region Falling/Floating/Landing 397 #region Falling/Floating/Landing
350 398
351 if ((actor == null || !actor.IsColliding) && !m_jumping) 399 if (!isColliding && currentControlState != motionControlStates.jumping)
352 { 400 {
353 float fallElapsed = (float)(Environment.TickCount - m_animTickFall); 401 float fallVelocity = actor.Velocity.Z;
354 float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f;
355 402
356 if (!m_jumping && (fallVelocity < -3.0f)) 403 if (fallVelocity < -2.5f)
357 Falling = true; 404 Falling = true;
358 405
359 if (m_animTickFall == 0 || (fallVelocity >= 0.0f)) 406 if (m_animTickFall == 0 || (fallVelocity >= -0.5f))
360 { 407 {
361 // not falling yet, or going up
362 // reset start of fall time
363 m_animTickFall = Environment.TickCount; 408 m_animTickFall = Environment.TickCount;
364 } 409 }
365 else if (!m_jumping && (fallElapsed > FALL_DELAY) && (fallVelocity < -3.0f) && (m_scenePresence.WasFlying)) 410 else
366 { 411 {
367 // Falling long enough to trigger the animation 412 int fallElapsed = (Environment.TickCount - m_animTickFall);
368 return "FALLDOWN"; 413 if ((fallElapsed > FALL_DELAY) && (fallVelocity < -3.0f))
414 {
415 currentControlState = motionControlStates.falling;
416 m_lastFallVelocity = fallVelocity;
417 // Falling long enough to trigger the animation
418 return "FALLDOWN";
419 }
369 } 420 }
370 421
371 // Check if the user has stopped walking just now 422 // Check if the user has stopped walking just now
@@ -375,49 +426,44 @@ namespace OpenSim.Region.Framework.Scenes.Animation
375 return CurrentMovementAnimation; 426 return CurrentMovementAnimation;
376 } 427 }
377 428
378 #endregion Falling/Floating/Landing 429 m_animTickFall = 0;
379 430
431 #endregion Falling/Floating/Landing
380 432
381 #region Jumping // section added for jumping... 433 #region Jumping // section added for jumping...
382 434
383 int jumptime; 435 if (isColliding && move.Z > 0f && currentControlState != motionControlStates.jumping)
384 jumptime = Environment.TickCount - m_animTickJump;
385
386 if ((move.Z > 0f) && (!m_jumping))
387 { 436 {
388 // Start jumping, prejump 437 // Start jumping, prejump
389 m_animTickFall = 0; 438 currentControlState = motionControlStates.jumping;
390 m_jumping = true; 439 m_jumping = true;
391 Falling = false; 440 Falling = false;
392 actor.Selected = true; // borrowed for jumping flag
393 m_animTickJump = Environment.TickCount; 441 m_animTickJump = Environment.TickCount;
394 m_jumpVelocity = 0.35f;
395 return "PREJUMP"; 442 return "PREJUMP";
396 } 443 }
397 444
398 if (m_jumping) 445 if (currentControlState == motionControlStates.jumping)
399 { 446 {
447 int jumptime = Environment.TickCount - m_animTickJump;
400 if ((jumptime > (JUMP_PERIOD * 1.5f)) && actor.IsColliding) 448 if ((jumptime > (JUMP_PERIOD * 1.5f)) && actor.IsColliding)
401 { 449 {
402 // end jumping 450 // end jumping
403 m_jumping = false; 451 m_jumping = false;
404 Falling = false; 452 Falling = false;
405 actor.Selected = false; // borrowed for jumping flag 453 actor.Selected = false; // borrowed for jumping flag
406 m_jumpVelocity = 0f; 454 m_animTickLand = Environment.TickCount;
407 m_animTickFall = Environment.TickCount; 455 currentControlState = motionControlStates.landing;
408 return "LAND"; 456 return "LAND";
409 } 457 }
410 else if (jumptime > JUMP_PERIOD) 458 else if (jumptime > JUMP_PERIOD)
411 { 459 {
412 // jump down 460 // jump down
413 m_jumpVelocity = 0f;
414 return "JUMP"; 461 return "JUMP";
415 } 462 }
416 else if (jumptime > PREJUMP_DELAY) 463 else if (jumptime > PREJUMP_DELAY)
417 { 464 {
418 // jump up 465 // jump up
419 m_jumping = true; 466 m_jumping = true;
420 m_jumpVelocity = 10f;
421 return "JUMP"; 467 return "JUMP";
422 } 468 }
423 } 469 }
@@ -426,42 +472,48 @@ namespace OpenSim.Region.Framework.Scenes.Animation
426 472
427 #region Ground Movement 473 #region Ground Movement
428 474
429 if (CurrentMovementAnimation == "FALLDOWN") 475 if (currentControlState == motionControlStates.falling)
430 { 476 {
431 Falling = false; 477 Falling = false;
432 m_animTickFall = Environment.TickCount; 478 currentControlState = motionControlStates.landing;
479 m_animTickLand = Environment.TickCount;
433 // TODO: SOFT_LAND support 480 // TODO: SOFT_LAND support
434 float fallHeight = m_fallHeight - actor.Position.Z; 481 float fallVsq =m_lastFallVelocity*m_lastFallVelocity;
435 if (fallHeight > 15.0f) 482 if (fallVsq > 300f) // aprox 20*h
436 return "STANDUP"; 483 return "STANDUP";
437 else if (fallHeight > 8.0f) 484 else if (fallVsq > 160f)
438 return "SOFT_LAND"; 485 return "SOFT_LAND";
439 else 486 else
440 return "LAND"; 487 return "LAND";
441 } 488 }
442 else if ((CurrentMovementAnimation == "LAND") || (CurrentMovementAnimation == "SOFT_LAND") || (CurrentMovementAnimation == "STANDUP")) 489
490
491 if (currentControlState == motionControlStates.landing)
443 { 492 {
444 int landElapsed = Environment.TickCount - m_animTickFall; 493 Falling = false;
494 int landElapsed = Environment.TickCount - m_animTickLand;
445 int limit = 1000; 495 int limit = 1000;
446 if (CurrentMovementAnimation == "LAND") 496 if (CurrentMovementAnimation == "LAND")
447 limit = 350; 497 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 498 // NB if the above is set too long a weird anim reset from some place prevents STAND from being sent to client
449 499
450 if ((m_animTickFall != 0) && (landElapsed <= limit)) 500 if ((m_animTickLand != 0) && (landElapsed <= limit))
451 { 501 {
452 return CurrentMovementAnimation; 502 return CurrentMovementAnimation;
453 } 503 }
454 else 504 else
455 { 505 {
456 m_fallHeight = actor.Position.Z; // save latest flying height 506 currentControlState = motionControlStates.onsurface;
507 m_animTickLand = 0;
457 return "STAND"; 508 return "STAND";
458 } 509 }
459 } 510 }
460 511
512
461 // next section moved outside paren. and realigned for jumping 513 // next section moved outside paren. and realigned for jumping
462 if (move.X != 0f || move.Y != 0f) 514 if (move.X != 0f || move.Y != 0f)
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 (move.Z < 0f)
@@ -480,6 +532,7 @@ 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 (move.Z < 0)
@@ -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
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 5946979..e6a366d 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -287,14 +287,7 @@ namespace OpenSim.Region.Framework.Scenes
287 set { PhysicsActor.Flying = value; } 287 set { PhysicsActor.Flying = value; }
288 } 288 }
289 289
290 // add for fly velocity control 290 public bool IsColliding
291 private bool FlyingOld {get; set;}
292 public bool WasFlying
293 {
294 get; private set;
295 }
296
297 public bool IsColliding
298 { 291 {
299 get { return PhysicsActor != null && PhysicsActor.IsColliding; } 292 get { return PhysicsActor != null && PhysicsActor.IsColliding; }
300 // We would expect setting IsColliding to be private but it's used by a hack in Scene 293 // We would expect setting IsColliding to be private but it's used by a hack in Scene
@@ -936,7 +929,7 @@ namespace OpenSim.Region.Framework.Scenes
936 /// <remarks> 929 /// <remarks>
937 /// AGENT_CONTRL_STOP comes about if user holds down space key on viewers. 930 /// AGENT_CONTRL_STOP comes about if user holds down space key on viewers.
938 /// </remarks> 931 /// </remarks>
939 private float AgentControlStopSlowWhilstMoving = 0.5f; 932 private float AgentControlStopSlowWhilstMoving = 0.2f;
940 933
941 private bool m_forceFly; 934 private bool m_forceFly;
942 935
@@ -2174,7 +2167,7 @@ namespace OpenSim.Region.Framework.Scenes
2174 bool DCFlagKeyPressed = false; 2167 bool DCFlagKeyPressed = false;
2175 Vector3 agent_control_v3 = Vector3.Zero; 2168 Vector3 agent_control_v3 = Vector3.Zero;
2176 2169
2177 bool newFlying = actor.Flying; 2170 bool newFlying = false;
2178 2171
2179 if (ForceFly) 2172 if (ForceFly)
2180 newFlying = true; 2173 newFlying = true;
@@ -2286,11 +2279,11 @@ namespace OpenSim.Region.Framework.Scenes
2286 if (Flying && !ForceFly) 2279 if (Flying && !ForceFly)
2287 { 2280 {
2288 // Need to stop in mid air if user holds down AGENT_CONTROL_STOP 2281 // Need to stop in mid air if user holds down AGENT_CONTROL_STOP
2289 if (AgentControlStopActive) 2282 // if (AgentControlStopActive)
2290 { 2283 // {
2291 agent_control_v3 = Vector3.Zero; 2284 // agent_control_v3 = Vector3.Zero;
2292 } 2285 // }
2293 else 2286 // else
2294 { 2287 {
2295 // Landing detection code 2288 // Landing detection code
2296 2289
@@ -2298,38 +2291,44 @@ namespace OpenSim.Region.Framework.Scenes
2298 bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || 2291 bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) ||
2299 ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); 2292 ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
2300 2293
2301 //m_log.Debug("[CONTROL]: " +flags); 2294 //m_log.Debug("[CONTROL]: " +flags);
2302 // Applies a satisfying roll effect to the avatar when flying. 2295 // Applies a satisfying roll effect to the avatar when flying.
2303 if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) != 0 && (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0) 2296 if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) != 0 && (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0)
2304 { 2297 {
2305 ApplyFlyingRoll( 2298 ApplyFlyingRoll(
2306 FLY_ROLL_RADIANS_PER_UPDATE, 2299 FLY_ROLL_RADIANS_PER_UPDATE,
2307 (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0, 2300 (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0,
2308 (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0); 2301 (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0);
2309 } 2302 }
2310 else if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) != 0 && 2303 else if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) != 0 &&
2311 (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0) 2304 (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0)
2312 { 2305 {
2313 ApplyFlyingRoll( 2306 ApplyFlyingRoll(
2314 -FLY_ROLL_RADIANS_PER_UPDATE, 2307 -FLY_ROLL_RADIANS_PER_UPDATE,
2315 (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0, 2308 (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0,
2316 (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0); 2309 (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0);
2317 } 2310 }
2318 else 2311 else
2319 { 2312 {
2320 if (m_AngularVelocity.Z != 0) 2313 if (m_AngularVelocity.Z != 0)
2321 m_AngularVelocity.Z += CalculateFlyingRollResetToZero(FLY_ROLL_RESET_RADIANS_PER_UPDATE); 2314 m_AngularVelocity.Z += CalculateFlyingRollResetToZero(FLY_ROLL_RESET_RADIANS_PER_UPDATE);
2322 }
2323
2324 if (Flying && IsColliding && controlland)
2325 {
2326 // nesting this check because LengthSquared() is expensive and we don't
2327 // want to do it every step when flying.
2328 if ((Velocity.LengthSquared() <= LAND_VELOCITYMAG_MAX))
2329 StopFlying();
2330 } 2315 }
2316
2317 /*
2318 if (Flying && IsColliding && controlland)
2319 {
2320 // nesting this check because LengthSquared() is expensive and we don't
2321 // want to do it every step when flying.
2322 if ((Velocity.LengthSquared() <= LAND_VELOCITYMAG_MAX))
2323 StopFlying();
2324 }
2325 */
2331 } 2326 }
2332 } 2327 }
2328 else if (IsColliding && agent_control_v3.Z < 0f)
2329 agent_control_v3.Z = 0;
2330// else if(AgentControlStopActive %% Velocity.Z <0.01f)
2331
2333 2332
2334// m_log.DebugFormat("[SCENE PRESENCE]: MovementFlag {0} for {1}", MovementFlag, Name); 2333// m_log.DebugFormat("[SCENE PRESENCE]: MovementFlag {0} for {1}", MovementFlag, Name);
2335 2334
@@ -2342,32 +2341,22 @@ namespace OpenSim.Region.Framework.Scenes
2342 if (update_movementflag 2341 if (update_movementflag
2343 || (update_rotation && DCFlagKeyPressed && (!AgentControlStopActive || MovementFlag != 0))) 2342 || (update_rotation && DCFlagKeyPressed && (!AgentControlStopActive || MovementFlag != 0)))
2344 { 2343 {
2345// if (update_movementflag || !AgentControlStopActive || MovementFlag != 0)
2346// {
2347// m_log.DebugFormat(
2348// "[SCENE PRESENCE]: In {0} adding velocity of {1} to {2}, umf = {3}, mf = {4}, ur = {5}",
2349// m_scene.RegionInfo.RegionName, agent_control_v3, Name,
2350// update_movementflag, MovementFlag, update_rotation);
2351
2352 float speedModifier;
2353 2344
2354 if (AgentControlStopActive) 2345 if (AgentControlStopActive)
2355 speedModifier = AgentControlStopSlowWhilstMoving; 2346 {
2347// if (MovementFlag == 0 && Animator.Falling)
2348 if (MovementFlag == 0 && Animator.currentControlState == ScenePresenceAnimator.motionControlStates.falling)
2349 {
2350 AddNewMovement(agent_control_v3, AgentControlStopSlowWhilstMoving, true);
2351 }
2356 else 2352 else
2357 speedModifier = 1; 2353 AddNewMovement(agent_control_v3, AgentControlStopSlowWhilstMoving);
2354 }
2355
2356 else
2357 AddNewMovement(agent_control_v3);
2358 2358
2359 AddNewMovement(agent_control_v3, speedModifier);
2360// }
2361 } 2359 }
2362// else
2363// {
2364// if (!update_movementflag)
2365// {
2366// m_log.DebugFormat(
2367// "[SCENE PRESENCE]: In {0} ignoring requested update of {1} for {2} as update_movementflag = false",
2368// m_scene.RegionInfo.RegionName, agent_control_v3, Name);
2369// }
2370// }
2371 2360
2372 if (update_movementflag && ParentID == 0) 2361 if (update_movementflag && ParentID == 0)
2373 { 2362 {
@@ -3246,68 +3235,58 @@ namespace OpenSim.Region.Framework.Scenes
3246 /// <param name="vec">The vector in which to move. This is relative to the rotation argument</param> 3235 /// <param name="vec">The vector in which to move. This is relative to the rotation argument</param>
3247 /// <param name="thisAddSpeedModifier"> 3236 /// <param name="thisAddSpeedModifier">
3248 /// Optional additional speed modifier for this particular add. Default is 1</param> 3237 /// Optional additional speed modifier for this particular add. Default is 1</param>
3249 public void AddNewMovement(Vector3 vec, float thisAddSpeedModifier = 1) 3238 public void AddNewMovement(Vector3 vec, float thisAddSpeedModifier = 1, bool breaking = false)
3250 { 3239 {
3251// m_log.DebugFormat( 3240 // m_log.DebugFormat(
3252// "[SCENE PRESENCE]: Adding new movement {0} with rotation {1}, thisAddSpeedModifier {2} for {3}", 3241 // "[SCENE PRESENCE]: Adding new movement {0} with rotation {1}, thisAddSpeedModifier {2} for {3}",
3253// vec, Rotation, thisAddSpeedModifier, Name); 3242 // vec, Rotation, thisAddSpeedModifier, Name);
3254 3243
3255 Vector3 direc = vec * Rotation; 3244 Vector3 direc = vec * Rotation;
3256 direc.Normalize(); 3245 direc.Normalize();
3257 3246
3258 if (Flying != FlyingOld) // add for fly velocity control
3259 {
3260 FlyingOld = Flying; // add for fly velocity control
3261 if (!Flying)
3262 WasFlying = true; // add for fly velocity control
3263 }
3264
3265 if (IsColliding)
3266 WasFlying = false; // add for fly velocity control
3267
3268 if ((vec.Z == 0f) && !Flying) 3247 if ((vec.Z == 0f) && !Flying)
3269 direc.Z = 0f; // Prevent camera WASD up. 3248 direc.Z = 0f; // Prevent camera WASD up.
3270 3249
3271 direc *= 0.03f * 128f * SpeedModifier * thisAddSpeedModifier; 3250 direc *= 0.03f * 128f * SpeedModifier * thisAddSpeedModifier;
3272 3251
3273// m_log.DebugFormat("[SCENE PRESENCE]: Force to apply before modification was {0} for {1}", direc, Name); 3252 // m_log.DebugFormat("[SCENE PRESENCE]: Force to apply before modification was {0} for {1}", direc, Name);
3274 3253
3275 if (PhysicsActor != null) 3254 if (Animator.currentControlState == ScenePresenceAnimator.motionControlStates.falling)
3276 { 3255 {
3277 if (Flying) 3256 if (breaking)
3278 { 3257 direc.Z = -9999f; //hack
3258 else
3259 direc = Vector3.Zero;
3260 }
3261 else if (Flying)
3262 {
3263 if(IsColliding)
3264 direc = Vector3.Zero;
3265 else
3279 direc *= 4.0f; 3266 direc *= 4.0f;
3280 //bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); 3267 }
3281 //if (controlland) 3268 else if (IsColliding)
3282 // m_log.Info("[AGENT]: landCommand"); 3269 {
3283 //if (IsColliding) 3270 if (direc.Z > 2.0f)
3284 // m_log.Info("[AGENT]: colliding");
3285 //if (Flying && IsColliding && controlland)
3286 //{
3287 // StopFlying();
3288 // m_log.Info("[AGENT]: Stop Flying");
3289 //}
3290 }
3291 if (Animator.Falling && WasFlying) // if falling from flying, disable motion add
3292 { 3271 {
3293 direc *= 0.0f; 3272 direc.Z *= 2.6f;
3294 } 3273 }
3295 else if (!Flying && IsColliding) 3274 else if (direc.Z < 0)
3275 direc.Z = 0;
3276/*
3277 float c = CollisionPlane.Z;
3278 if (c > 0.2f && c < 0.94f && (direc.X != 0 || direc.Y != 0))
3296 { 3279 {
3297 if (direc.Z > 2.0f) 3280 float p = direc.X * CollisionPlane.X + direc.Y * CollisionPlane.Y;
3298 { 3281 direc.X -= p * CollisionPlane.X;
3299 direc.Z *= 2.6f; 3282 direc.Y -= p * CollisionPlane.Y;
3300 3283 direc.Z -= p * c;
3301 // TODO: PreJump and jump happen too quickly. Many times prejump gets ignored.
3302// Animator.TrySetMovementAnimation("PREJUMP");
3303// Animator.TrySetMovementAnimation("JUMP");
3304 }
3305 } 3284 }
3285 */
3306 } 3286 }
3307 3287
3308// m_log.DebugFormat("[SCENE PRESENCE]: Setting force to apply to {0} for {1}", direc, Name); 3288 // m_log.DebugFormat("[SCENE PRESENCE]: Setting force to apply to {0} for {1}", direc, Name);
3309 3289
3310 // TODO: Add the force instead of only setting it to support multiple forces per frame?
3311 m_forceToApply = direc; 3290 m_forceToApply = direc;
3312 Animator.UpdateMovementAnimations(); 3291 Animator.UpdateMovementAnimations();
3313 } 3292 }