diff options
author | Teravus Ovares | 2009-04-07 16:13:17 +0000 |
---|---|---|
committer | Teravus Ovares | 2009-04-07 16:13:17 +0000 |
commit | 9bbc7e8bf690800affd4d5767959932ad033dd7c (patch) | |
tree | 555c666a712aa4de209c6ccf84107c53a743e308 | |
parent | * Tweak the BulletDotNETPlugin character controller so it feels more finished. (diff) | |
download | opensim-SC-9bbc7e8bf690800affd4d5767959932ad033dd7c.zip opensim-SC-9bbc7e8bf690800affd4d5767959932ad033dd7c.tar.gz opensim-SC-9bbc7e8bf690800affd4d5767959932ad033dd7c.tar.bz2 opensim-SC-9bbc7e8bf690800affd4d5767959932ad033dd7c.tar.xz |
* Added a routine to check if a PhysicsVector and Quaternion is finite
* Now validating input to the Physics scene and warning when something is awry.
* This should help nail down that Non Finite Avatar Position Detected issue.
-rw-r--r-- | OpenSim/Region/Physics/Manager/PhysicsVector.cs | 14 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | 90 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 134 |
3 files changed, 193 insertions, 45 deletions
diff --git a/OpenSim/Region/Physics/Manager/PhysicsVector.cs b/OpenSim/Region/Physics/Manager/PhysicsVector.cs index bbd6464..2a4ac5e 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsVector.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsVector.cs | |||
@@ -153,6 +153,20 @@ namespace OpenSim.Region.Physics.Manager | |||
153 | return v*f; | 153 | return v*f; |
154 | } | 154 | } |
155 | 155 | ||
156 | public static bool isFinite(PhysicsVector v) | ||
157 | { | ||
158 | if (v == null) | ||
159 | return false; | ||
160 | if (Single.IsInfinity(v.X) || Single.IsNaN(v.X)) | ||
161 | return false; | ||
162 | if (Single.IsInfinity(v.Y) || Single.IsNaN(v.Y)) | ||
163 | return false; | ||
164 | if (Single.IsInfinity(v.Z) || Single.IsNaN(v.Z)) | ||
165 | return false; | ||
166 | |||
167 | return true; | ||
168 | } | ||
169 | |||
156 | public virtual bool IsIdentical(PhysicsVector v, float tolerance) | 170 | public virtual bool IsIdentical(PhysicsVector v, float tolerance) |
157 | { | 171 | { |
158 | PhysicsVector diff = this - v; | 172 | PhysicsVector diff = this - v; |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index bf8ca0e..c37b632 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | |||
@@ -380,10 +380,23 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
380 | set | 380 | set |
381 | { | 381 | { |
382 | if (Body == IntPtr.Zero || Shell == IntPtr.Zero) | 382 | if (Body == IntPtr.Zero || Shell == IntPtr.Zero) |
383 | _position.X = value.X; _position.Y = value.Y; _position.Z = value.Z; | 383 | { |
384 | 384 | if (PhysicsVector.isFinite(value)) | |
385 | m_taintPosition.X = value.X; m_taintPosition.Y = value.Y; m_taintPosition.Z = value.Z; | 385 | { |
386 | _parent_scene.AddPhysicsActorTaint(this); | 386 | _position.X = value.X; |
387 | _position.Y = value.Y; | ||
388 | _position.Z = value.Z; | ||
389 | |||
390 | m_taintPosition.X = value.X; | ||
391 | m_taintPosition.Y = value.Y; | ||
392 | m_taintPosition.Z = value.Z; | ||
393 | _parent_scene.AddPhysicsActorTaint(this); | ||
394 | } | ||
395 | else | ||
396 | { | ||
397 | m_log.Warn("[PHYSICS]: Got a NaN Position from Scene on a Character"); | ||
398 | } | ||
399 | } | ||
387 | } | 400 | } |
388 | } | 401 | } |
389 | 402 | ||
@@ -402,15 +415,22 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
402 | get { return new PhysicsVector(CAPSULE_RADIUS*2, CAPSULE_RADIUS*2, CAPSULE_LENGTH); } | 415 | get { return new PhysicsVector(CAPSULE_RADIUS*2, CAPSULE_RADIUS*2, CAPSULE_LENGTH); } |
403 | set | 416 | set |
404 | { | 417 | { |
405 | m_pidControllerActive = true; | 418 | if (PhysicsVector.isFinite(value)) |
406 | 419 | { | |
420 | m_pidControllerActive = true; | ||
421 | |||
407 | PhysicsVector SetSize = value; | 422 | PhysicsVector SetSize = value; |
408 | m_tainted_CAPSULE_LENGTH = (SetSize.Z * 1.15f) - CAPSULE_RADIUS * 2.0f; | 423 | m_tainted_CAPSULE_LENGTH = (SetSize.Z*1.15f) - CAPSULE_RADIUS*2.0f; |
409 | //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); | 424 | //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); |
410 | 425 | ||
411 | Velocity = new PhysicsVector(0f, 0f, 0f); | 426 | Velocity = new PhysicsVector(0f, 0f, 0f); |
412 | 427 | ||
413 | _parent_scene.AddPhysicsActorTaint(this); | 428 | _parent_scene.AddPhysicsActorTaint(this); |
429 | } | ||
430 | else | ||
431 | { | ||
432 | m_log.Warn("[PHYSICS]: Got a NaN Size from Scene on a Character"); | ||
433 | } | ||
414 | } | 434 | } |
415 | } | 435 | } |
416 | 436 | ||
@@ -616,8 +636,15 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
616 | } | 636 | } |
617 | set | 637 | set |
618 | { | 638 | { |
619 | m_pidControllerActive = true; | 639 | if (PhysicsVector.isFinite(value)) |
620 | _target_velocity = value; | 640 | { |
641 | m_pidControllerActive = true; | ||
642 | _target_velocity = value; | ||
643 | } | ||
644 | else | ||
645 | { | ||
646 | m_log.Warn("[PHYSICS]: Got a NaN velocity from Scene in a Character"); | ||
647 | } | ||
621 | } | 648 | } |
622 | } | 649 | } |
623 | 650 | ||
@@ -667,22 +694,29 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
667 | /// <param name="force"></param> | 694 | /// <param name="force"></param> |
668 | public override void AddForce(PhysicsVector force, bool pushforce) | 695 | public override void AddForce(PhysicsVector force, bool pushforce) |
669 | { | 696 | { |
670 | if (pushforce) | 697 | if (PhysicsVector.isFinite(force)) |
671 | { | 698 | { |
672 | m_pidControllerActive = false; | 699 | if (pushforce) |
673 | force *= 100f; | 700 | { |
674 | doForce(force); | 701 | m_pidControllerActive = false; |
675 | //m_log.Debug("Push!"); | 702 | force *= 100f; |
676 | //_target_velocity.X += force.X; | 703 | doForce(force); |
677 | // _target_velocity.Y += force.Y; | 704 | //m_log.Debug("Push!"); |
678 | //_target_velocity.Z += force.Z; | 705 | //_target_velocity.X += force.X; |
706 | // _target_velocity.Y += force.Y; | ||
707 | //_target_velocity.Z += force.Z; | ||
708 | } | ||
709 | else | ||
710 | { | ||
711 | m_pidControllerActive = true; | ||
712 | _target_velocity.X += force.X; | ||
713 | _target_velocity.Y += force.Y; | ||
714 | _target_velocity.Z += force.Z; | ||
715 | } | ||
679 | } | 716 | } |
680 | else | 717 | else |
681 | { | 718 | { |
682 | m_pidControllerActive = true; | 719 | m_log.Warn("[PHYSICS]: Got a NaN force applied to a Character"); |
683 | _target_velocity.X += force.X; | ||
684 | _target_velocity.Y += force.Y; | ||
685 | _target_velocity.Z += force.Z; | ||
686 | } | 720 | } |
687 | //m_lastUpdateSent = false; | 721 | //m_lastUpdateSent = false; |
688 | } | 722 | } |
@@ -847,8 +881,14 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
847 | // end add Kitto Flora | 881 | // end add Kitto Flora |
848 | 882 | ||
849 | } | 883 | } |
850 | 884 | if (PhysicsVector.isFinite(vec)) | |
851 | doForce(vec); | 885 | { |
886 | doForce(vec); | ||
887 | } | ||
888 | else | ||
889 | { | ||
890 | m_log.Warn("[PHYSICS]: Got a NaN force vector in Move()"); | ||
891 | } | ||
852 | } | 892 | } |
853 | 893 | ||
854 | /// <summary> | 894 | /// <summary> |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 56bd289..a55ae76 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | |||
@@ -2325,7 +2325,17 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2325 | public override PhysicsVector Size | 2325 | public override PhysicsVector Size |
2326 | { | 2326 | { |
2327 | get { return _size; } | 2327 | get { return _size; } |
2328 | set { _size = value; } | 2328 | set |
2329 | { | ||
2330 | if (PhysicsVector.isFinite(value)) | ||
2331 | { | ||
2332 | _size = value; | ||
2333 | } | ||
2334 | else | ||
2335 | { | ||
2336 | m_log.Warn("[PHYSICS]: Got NaN Size on object"); | ||
2337 | } | ||
2338 | } | ||
2329 | } | 2339 | } |
2330 | 2340 | ||
2331 | public override float Mass | 2341 | public override float Mass |
@@ -2337,7 +2347,17 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2337 | { | 2347 | { |
2338 | //get { return PhysicsVector.Zero; } | 2348 | //get { return PhysicsVector.Zero; } |
2339 | get { return m_force; } | 2349 | get { return m_force; } |
2340 | set { m_force = value; } | 2350 | set |
2351 | { | ||
2352 | if (PhysicsVector.isFinite(value)) | ||
2353 | { | ||
2354 | m_force = value; | ||
2355 | } | ||
2356 | else | ||
2357 | { | ||
2358 | m_log.Warn("[PHYSICS]: NaN in Force Applied to an Object"); | ||
2359 | } | ||
2360 | } | ||
2341 | } | 2361 | } |
2342 | 2362 | ||
2343 | public override int VehicleType | 2363 | public override int VehicleType |
@@ -2402,10 +2422,18 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2402 | } | 2422 | } |
2403 | set | 2423 | set |
2404 | { | 2424 | { |
2405 | _velocity = value; | 2425 | if (PhysicsVector.isFinite(value)) |
2426 | { | ||
2427 | _velocity = value; | ||
2428 | |||
2429 | m_taintVelocity = value; | ||
2430 | _parent_scene.AddPhysicsActorTaint(this); | ||
2431 | } | ||
2432 | else | ||
2433 | { | ||
2434 | m_log.Warn("[PHYSICS]: Got NaN Velocity in Object"); | ||
2435 | } | ||
2406 | 2436 | ||
2407 | m_taintVelocity = value; | ||
2408 | _parent_scene.AddPhysicsActorTaint(this); | ||
2409 | } | 2437 | } |
2410 | } | 2438 | } |
2411 | 2439 | ||
@@ -2421,8 +2449,15 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2421 | 2449 | ||
2422 | set | 2450 | set |
2423 | { | 2451 | { |
2424 | m_taintTorque = value; | 2452 | if (PhysicsVector.isFinite(value)) |
2425 | _parent_scene.AddPhysicsActorTaint(this); | 2453 | { |
2454 | m_taintTorque = value; | ||
2455 | _parent_scene.AddPhysicsActorTaint(this); | ||
2456 | } | ||
2457 | else | ||
2458 | { | ||
2459 | m_log.Warn("[PHYSICS]: Got NaN Torque in Object"); | ||
2460 | } | ||
2426 | } | 2461 | } |
2427 | } | 2462 | } |
2428 | 2463 | ||
@@ -2441,7 +2476,27 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2441 | public override Quaternion Orientation | 2476 | public override Quaternion Orientation |
2442 | { | 2477 | { |
2443 | get { return _orientation; } | 2478 | get { return _orientation; } |
2444 | set { _orientation = value; } | 2479 | set |
2480 | { | ||
2481 | if (QuaternionIsFinite(value)) | ||
2482 | _orientation = value; | ||
2483 | else | ||
2484 | m_log.Warn("[PHYSICS]: Got NaN quaternion Orientation from Scene in Object"); | ||
2485 | |||
2486 | } | ||
2487 | } | ||
2488 | |||
2489 | internal static bool QuaternionIsFinite(Quaternion q) | ||
2490 | { | ||
2491 | if (Single.IsNaN(q.X) || Single.IsInfinity(q.X)) | ||
2492 | return false; | ||
2493 | if (Single.IsNaN(q.Y) || Single.IsInfinity(q.Y)) | ||
2494 | return false; | ||
2495 | if (Single.IsNaN(q.Z) || Single.IsInfinity(q.Z)) | ||
2496 | return false; | ||
2497 | if (Single.IsNaN(q.W) || Single.IsInfinity(q.W)) | ||
2498 | return false; | ||
2499 | return true; | ||
2445 | } | 2500 | } |
2446 | 2501 | ||
2447 | public override PhysicsVector Acceleration | 2502 | public override PhysicsVector Acceleration |
@@ -2457,15 +2512,29 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2457 | 2512 | ||
2458 | public override void AddForce(PhysicsVector force, bool pushforce) | 2513 | public override void AddForce(PhysicsVector force, bool pushforce) |
2459 | { | 2514 | { |
2460 | m_forcelist.Add(force); | 2515 | if (PhysicsVector.isFinite(force)) |
2461 | m_taintforce = true; | 2516 | { |
2517 | m_forcelist.Add(force); | ||
2518 | m_taintforce = true; | ||
2519 | } | ||
2520 | else | ||
2521 | { | ||
2522 | m_log.Warn("[PHYSICS]: Got Invalid linear force vector from Scene in Object"); | ||
2523 | } | ||
2462 | //m_log.Info("[PHYSICS]: Added Force:" + force.ToString() + " to prim at " + Position.ToString()); | 2524 | //m_log.Info("[PHYSICS]: Added Force:" + force.ToString() + " to prim at " + Position.ToString()); |
2463 | } | 2525 | } |
2464 | 2526 | ||
2465 | public override void AddAngularForce(PhysicsVector force, bool pushforce) | 2527 | public override void AddAngularForce(PhysicsVector force, bool pushforce) |
2466 | { | 2528 | { |
2467 | m_angularforcelist.Add(force); | 2529 | if (PhysicsVector.isFinite(force)) |
2468 | m_taintaddangularforce = true; | 2530 | { |
2531 | m_angularforcelist.Add(force); | ||
2532 | m_taintaddangularforce = true; | ||
2533 | } | ||
2534 | else | ||
2535 | { | ||
2536 | m_log.Warn("[PHYSICS]: Got Invalid Angular force vector from Scene in Object"); | ||
2537 | } | ||
2469 | } | 2538 | } |
2470 | 2539 | ||
2471 | public override PhysicsVector RotationalVelocity | 2540 | public override PhysicsVector RotationalVelocity |
@@ -2482,7 +2551,17 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2482 | 2551 | ||
2483 | return m_rotationalVelocity; | 2552 | return m_rotationalVelocity; |
2484 | } | 2553 | } |
2485 | set { m_rotationalVelocity = value; } | 2554 | set |
2555 | { | ||
2556 | if (PhysicsVector.isFinite(value)) | ||
2557 | { | ||
2558 | m_rotationalVelocity = value; | ||
2559 | } | ||
2560 | else | ||
2561 | { | ||
2562 | m_log.Warn("[PHYSICS]: Got NaN RotationalVelocity in Object"); | ||
2563 | } | ||
2564 | } | ||
2486 | } | 2565 | } |
2487 | 2566 | ||
2488 | public override void CrossingFailure() | 2567 | public override void CrossingFailure() |
@@ -2518,12 +2597,18 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2518 | public override void LockAngularMotion(PhysicsVector axis) | 2597 | public override void LockAngularMotion(PhysicsVector axis) |
2519 | { | 2598 | { |
2520 | // reverse the zero/non zero values for ODE. | 2599 | // reverse the zero/non zero values for ODE. |
2521 | 2600 | if (PhysicsVector.isFinite(axis)) | |
2522 | axis.X = (axis.X > 0) ? 1f : 0f; | 2601 | { |
2523 | axis.Y = (axis.Y > 0) ? 1f : 0f; | 2602 | axis.X = (axis.X > 0) ? 1f : 0f; |
2524 | axis.Z = (axis.Z > 0) ? 1f : 0f; | 2603 | axis.Y = (axis.Y > 0) ? 1f : 0f; |
2525 | m_log.DebugFormat("[axislock]: <{0},{1},{2}>", axis.X, axis.Y, axis.Z); | 2604 | axis.Z = (axis.Z > 0) ? 1f : 0f; |
2526 | m_taintAngularLock = new PhysicsVector(axis.X, axis.Y, axis.Z); ; | 2605 | m_log.DebugFormat("[axislock]: <{0},{1},{2}>", axis.X, axis.Y, axis.Z); |
2606 | m_taintAngularLock = new PhysicsVector(axis.X, axis.Y, axis.Z); | ||
2607 | } | ||
2608 | else | ||
2609 | { | ||
2610 | m_log.Warn("[PHYSICS]: Got NaN locking axis from Scene on Object"); | ||
2611 | } | ||
2527 | } | 2612 | } |
2528 | 2613 | ||
2529 | public void UpdatePositionAndVelocity() | 2614 | public void UpdatePositionAndVelocity() |
@@ -2734,7 +2819,16 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2734 | { | 2819 | { |
2735 | } | 2820 | } |
2736 | 2821 | ||
2737 | public override PhysicsVector PIDTarget { set { m_PIDTarget = value; ; } } | 2822 | public override PhysicsVector PIDTarget |
2823 | { | ||
2824 | set | ||
2825 | { | ||
2826 | if (PhysicsVector.isFinite(value)) | ||
2827 | m_PIDTarget = value; | ||
2828 | else | ||
2829 | m_log.Warn("[PHYSICS]: Got NaN PIDTarget from Scene on Object"); | ||
2830 | } | ||
2831 | } | ||
2738 | public override bool PIDActive { set { m_usePID = value; } } | 2832 | public override bool PIDActive { set { m_usePID = value; } } |
2739 | public override float PIDTau { set { m_PIDTau = value; } } | 2833 | public override float PIDTau { set { m_PIDTau = value; } } |
2740 | 2834 | ||