aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs69
1 files changed, 43 insertions, 26 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
index 77ec76d..c3d75ea 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
@@ -602,21 +602,22 @@ namespace OpenSim.Region.Physics.BulletSPlugin
602 602
603 #region Known vehicle value functions 603 #region Known vehicle value functions
604 // Vehicle physical parameters that we buffer from constant getting and setting. 604 // Vehicle physical parameters that we buffer from constant getting and setting.
605 // The "m_known*" variables are initialized to 'null', fetched only if referenced 605 // The "m_known*" values are unknown until they are fetched and the m_knownHas flag is set.
606 // and stored back into the physics engine only if updated. 606 // Changing is remembered and the parameter is stored back into the physics engine only if updated.
607 // This does two things: 1) saves continuious calls into unmanaged code, and 607 // This does two things: 1) saves continuious calls into unmanaged code, and
608 // 2) signals when a physics property update must happen back to the simulator 608 // 2) signals when a physics property update must happen back to the simulator
609 // to update values modified for the vehicle. 609 // to update values modified for the vehicle.
610 private int m_knownChanged; 610 private int m_knownChanged;
611 private float? m_knownTerrainHeight; 611 private int m_knownHas;
612 private float? m_knownWaterLevel; 612 private float m_knownTerrainHeight;
613 private Vector3? m_knownPosition; 613 private float m_knownWaterLevel;
614 private Vector3? m_knownVelocity; 614 private Vector3 m_knownPosition;
615 private Vector3 m_knownVelocity;
615 private Vector3 m_knownForce; 616 private Vector3 m_knownForce;
616 private Quaternion? m_knownOrientation; 617 private Quaternion m_knownOrientation;
617 private Vector3? m_knownRotationalVelocity; 618 private Vector3 m_knownRotationalVelocity;
618 private Vector3 m_knownRotationalForce; 619 private Vector3 m_knownRotationalForce;
619 private Vector3? m_knownForwardVelocity; // vehicle relative forward speed 620 private Vector3 m_knownForwardVelocity; // vehicle relative forward speed
620 621
621 private const int m_knownChangedPosition = 1 << 0; 622 private const int m_knownChangedPosition = 1 << 0;
622 private const int m_knownChangedVelocity = 1 << 1; 623 private const int m_knownChangedVelocity = 1 << 1;
@@ -624,18 +625,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
624 private const int m_knownChangedOrientation = 1 << 3; 625 private const int m_knownChangedOrientation = 1 << 3;
625 private const int m_knownChangedRotationalVelocity = 1 << 4; 626 private const int m_knownChangedRotationalVelocity = 1 << 4;
626 private const int m_knownChangedRotationalForce = 1 << 5; 627 private const int m_knownChangedRotationalForce = 1 << 5;
628 private const int m_knownChangedTerrainHeight = 1 << 6;
629 private const int m_knownChangedWaterLevel = 1 << 7;
630 private const int m_knownChangedForwardVelocity = 1 << 7;
627 631
628 private void ForgetKnownVehicleProperties() 632 private void ForgetKnownVehicleProperties()
629 { 633 {
630 m_knownTerrainHeight = null; 634 m_knownHas = 0;
631 m_knownWaterLevel = null;
632 m_knownPosition = null;
633 m_knownVelocity = null;
634 m_knownForce = Vector3.Zero;
635 m_knownOrientation = null;
636 m_knownRotationalVelocity = null;
637 m_knownRotationalForce = Vector3.Zero;
638 m_knownForwardVelocity = null;
639 m_knownChanged = 0; 635 m_knownChanged = 0;
640 } 636 }
641 private void PushKnownChanged() 637 private void PushKnownChanged()
@@ -674,17 +670,23 @@ namespace OpenSim.Region.Physics.BulletSPlugin
674 // is used ot fetch the height only once for each vehicle simulation step. 670 // is used ot fetch the height only once for each vehicle simulation step.
675 private float GetTerrainHeight(Vector3 pos) 671 private float GetTerrainHeight(Vector3 pos)
676 { 672 {
677 if (m_knownTerrainHeight == null) 673 if ((m_knownHas & m_knownChangedTerrainHeight) == 0)
674 {
678 m_knownTerrainHeight = Prim.PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(pos); 675 m_knownTerrainHeight = Prim.PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(pos);
679 return (float)m_knownTerrainHeight; 676 m_knownHas |= m_knownChangedTerrainHeight;
677 }
678 return m_knownTerrainHeight;
680 } 679 }
681 680
682 // Since the computation of water level can be a little involved, this routine 681 // Since the computation of water level can be a little involved, this routine
683 // is used ot fetch the level only once for each vehicle simulation step. 682 // is used ot fetch the level only once for each vehicle simulation step.
684 private float GetWaterLevel(Vector3 pos) 683 private float GetWaterLevel(Vector3 pos)
685 { 684 {
686 if (m_knownWaterLevel == null) 685 if ((m_knownHas & m_knownChangedWaterLevel) == 0)
686 {
687 m_knownWaterLevel = Prim.PhysicsScene.TerrainManager.GetWaterLevelAtXYZ(pos); 687 m_knownWaterLevel = Prim.PhysicsScene.TerrainManager.GetWaterLevelAtXYZ(pos);
688 m_knownHas |= m_knownChangedWaterLevel;
689 }
688 return (float)m_knownWaterLevel; 690 return (float)m_knownWaterLevel;
689 } 691 }
690 692
@@ -692,8 +694,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin
692 { 694 {
693 get 695 get
694 { 696 {
695 if (m_knownPosition == null) 697 if ((m_knownHas & m_knownChangedPosition) == 0)
698 {
696 m_knownPosition = Prim.ForcePosition; 699 m_knownPosition = Prim.ForcePosition;
700 m_knownHas |= m_knownChangedPosition;
701 }
697 return (Vector3)m_knownPosition; 702 return (Vector3)m_knownPosition;
698 } 703 }
699 set 704 set
@@ -707,8 +712,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin
707 { 712 {
708 get 713 get
709 { 714 {
710 if (m_knownOrientation == null) 715 if ((m_knownHas & m_knownChangedOrientation) == 0)
716 {
711 m_knownOrientation = Prim.ForceOrientation; 717 m_knownOrientation = Prim.ForceOrientation;
718 m_knownHas |= m_knownChangedOrientation;
719 }
712 return (Quaternion)m_knownOrientation; 720 return (Quaternion)m_knownOrientation;
713 } 721 }
714 set 722 set
@@ -722,8 +730,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin
722 { 730 {
723 get 731 get
724 { 732 {
725 if (m_knownVelocity == null) 733 if ((m_knownHas & m_knownChangedVelocity) == 0)
734 {
726 m_knownVelocity = Prim.ForceVelocity; 735 m_knownVelocity = Prim.ForceVelocity;
736 m_knownHas |= m_knownChangedVelocity;
737 }
727 return (Vector3)m_knownVelocity; 738 return (Vector3)m_knownVelocity;
728 } 739 }
729 set 740 set
@@ -743,8 +754,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin
743 { 754 {
744 get 755 get
745 { 756 {
746 if (m_knownRotationalVelocity == null) 757 if ((m_knownHas & m_knownChangedRotationalVelocity) == 0)
758 {
747 m_knownRotationalVelocity = Prim.ForceRotationalVelocity; 759 m_knownRotationalVelocity = Prim.ForceRotationalVelocity;
760 m_knownHas |= m_knownChangedRotationalVelocity;
761 }
748 return (Vector3)m_knownRotationalVelocity; 762 return (Vector3)m_knownRotationalVelocity;
749 } 763 }
750 set 764 set
@@ -763,8 +777,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin
763 { 777 {
764 get 778 get
765 { 779 {
766 if (m_knownForwardVelocity == null) 780 if ((m_knownHas & m_knownChangedForwardVelocity) == 0)
781 {
767 m_knownForwardVelocity = VehicleVelocity * Quaternion.Inverse(Quaternion.Normalize(VehicleOrientation)); 782 m_knownForwardVelocity = VehicleVelocity * Quaternion.Inverse(Quaternion.Normalize(VehicleOrientation));
783 m_knownHas |= m_knownChangedForwardVelocity;
784 }
768 return (Vector3)m_knownForwardVelocity; 785 return (Vector3)m_knownForwardVelocity;
769 } 786 }
770 } 787 }