diff options
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs index a83d966..09aee17 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | |||
@@ -618,15 +618,17 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
618 | private float? m_knownWaterLevel; | 618 | private float? m_knownWaterLevel; |
619 | private Vector3? m_knownPosition; | 619 | private Vector3? m_knownPosition; |
620 | private Vector3? m_knownVelocity; | 620 | private Vector3? m_knownVelocity; |
621 | private Vector3? m_knownForce; | ||
621 | private Quaternion? m_knownOrientation; | 622 | private Quaternion? m_knownOrientation; |
622 | private Vector3? m_knownRotationalVelocity; | 623 | private Vector3? m_knownRotationalVelocity; |
623 | private Vector3? m_knownRotationalForce; | 624 | private Vector3? m_knownRotationalForce; |
624 | 625 | ||
625 | private const int m_knownChangedPosition = 1 << 0; | 626 | private const int m_knownChangedPosition = 1 << 0; |
626 | private const int m_knownChangedVelocity = 1 << 1; | 627 | private const int m_knownChangedVelocity = 1 << 1; |
627 | private const int m_knownChangedOrientation = 1 << 2; | 628 | private const int m_knownChangedForce = 1 << 2; |
628 | private const int m_knownChangedRotationalVelocity = 1 << 3; | 629 | private const int m_knownChangedOrientation = 1 << 3; |
629 | private const int m_knownChangedRotationalForce = 1 << 4; | 630 | private const int m_knownChangedRotationalVelocity = 1 << 4; |
631 | private const int m_knownChangedRotationalForce = 1 << 5; | ||
630 | 632 | ||
631 | private void ForgetKnownVehicleProperties() | 633 | private void ForgetKnownVehicleProperties() |
632 | { | 634 | { |
@@ -634,6 +636,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
634 | m_knownWaterLevel = null; | 636 | m_knownWaterLevel = null; |
635 | m_knownPosition = null; | 637 | m_knownPosition = null; |
636 | m_knownVelocity = null; | 638 | m_knownVelocity = null; |
639 | m_knownForce = null; | ||
637 | m_knownOrientation = null; | 640 | m_knownOrientation = null; |
638 | m_knownRotationalVelocity = null; | 641 | m_knownRotationalVelocity = null; |
639 | m_knownRotationalForce = null; | 642 | m_knownRotationalForce = null; |
@@ -652,6 +655,9 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
652 | Prim.ForceVelocity = VehicleVelocity; | 655 | Prim.ForceVelocity = VehicleVelocity; |
653 | BulletSimAPI.SetInterpolationLinearVelocity2(Prim.PhysBody.ptr, VehicleVelocity); | 656 | BulletSimAPI.SetInterpolationLinearVelocity2(Prim.PhysBody.ptr, VehicleVelocity); |
654 | } | 657 | } |
658 | if ((m_knownChanged & m_knownChangedForce) != 0) | ||
659 | Prim.AddForce((Vector3)m_knownForce, false, true); | ||
660 | |||
655 | if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0) | 661 | if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0) |
656 | { | 662 | { |
657 | Prim.ForceRotationalVelocity = VehicleRotationalVelocity; | 663 | Prim.ForceRotationalVelocity = VehicleRotationalVelocity; |
@@ -730,6 +736,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
730 | } | 736 | } |
731 | } | 737 | } |
732 | 738 | ||
739 | private void VehicleAddForce(Vector3 aForce) | ||
740 | { | ||
741 | m_knownForce += aForce; | ||
742 | m_knownChanged |= m_knownChangedForce; | ||
743 | } | ||
744 | |||
733 | private Vector3 VehicleRotationalVelocity | 745 | private Vector3 VehicleRotationalVelocity |
734 | { | 746 | { |
735 | get | 747 | get |
@@ -784,10 +796,9 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
784 | linearMotorContribution *= VehicleOrientation; | 796 | linearMotorContribution *= VehicleOrientation; |
785 | 797 | ||
786 | // ================================================================== | 798 | // ================================================================== |
787 | // Gravity and Buoyancy | 799 | // Buoyancy: force to overcome gravity. |
788 | // There is some gravity, make a gravity force vector that is applied after object velocity. | ||
789 | // m_VehicleBuoyancy: -1=2g; 0=1g; 1=0g; | 800 | // m_VehicleBuoyancy: -1=2g; 0=1g; 1=0g; |
790 | Vector3 grav = Prim.PhysicsScene.DefaultGravity * (1f - m_VehicleBuoyancy); | 801 | Vector3 buoyancyContribution = Prim.PhysicsScene.DefaultGravity * (m_VehicleBuoyancy - 1f); |
791 | 802 | ||
792 | Vector3 terrainHeightContribution = ComputeLinearTerrainHeightCorrection(pTimestep); | 803 | Vector3 terrainHeightContribution = ComputeLinearTerrainHeightCorrection(pTimestep); |
793 | 804 | ||
@@ -812,14 +823,16 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
812 | newVelocity.Z = 0; | 823 | newVelocity.Z = 0; |
813 | 824 | ||
814 | // ================================================================== | 825 | // ================================================================== |
815 | // Clamp REALLY high or low velocities | 826 | // Clamp high or low velocities |
816 | float newVelocityLengthSq = newVelocity.LengthSquared(); | 827 | float newVelocityLengthSq = newVelocity.LengthSquared(); |
817 | if (newVelocityLengthSq > 1e6f) | 828 | // if (newVelocityLengthSq > 1e6f) |
829 | if (newVelocityLengthSq > 1000f) | ||
818 | { | 830 | { |
819 | newVelocity /= newVelocity.Length(); | 831 | newVelocity /= newVelocity.Length(); |
820 | newVelocity *= 1000f; | 832 | newVelocity *= 1000f; |
821 | } | 833 | } |
822 | else if (newVelocityLengthSq < 1e-6f) | 834 | // else if (newVelocityLengthSq < 1e-6f) |
835 | else if (newVelocityLengthSq < 0.001f) | ||
823 | newVelocity = Vector3.Zero; | 836 | newVelocity = Vector3.Zero; |
824 | 837 | ||
825 | // ================================================================== | 838 | // ================================================================== |
@@ -828,15 +841,16 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
828 | VehicleVelocity = newVelocity; | 841 | VehicleVelocity = newVelocity; |
829 | 842 | ||
830 | // Other linear forces are applied as forces. | 843 | // Other linear forces are applied as forces. |
831 | Vector3 totalDownForce = grav * m_vehicleMass * pTimestep; | 844 | Vector3 totalDownForce = buoyancyContribution * m_vehicleMass; |
832 | if (totalDownForce != Vector3.Zero) | 845 | if (!totalDownForce.ApproxEquals(Vector3.Zero, 0.01f)) |
833 | { | 846 | { |
834 | Prim.AddForce(totalDownForce, false); | 847 | VehicleAddForce(totalDownForce); |
835 | } | 848 | } |
836 | 849 | ||
837 | VDetailLog("{0}, MoveLinear,done,newVel={1},totDown={2},linContrib={3},terrContrib={4},hoverContrib={5},limitContrib={6}", | 850 | VDetailLog("{0}, MoveLinear,done,newVel={1},totDown={2},linContrib={3},terrContrib={4},hoverContrib={5},limitContrib={6},buoyContrib={7}", |
838 | Prim.LocalID, newVelocity, totalDownForce, | 851 | Prim.LocalID, newVelocity, totalDownForce, |
839 | linearMotorContribution, terrainHeightContribution, hoverContribution, limitMotorUpContribution | 852 | linearMotorContribution, terrainHeightContribution, hoverContribution, |
853 | limitMotorUpContribution, buoyancyContribution | ||
840 | ); | 854 | ); |
841 | 855 | ||
842 | } // end MoveLinear() | 856 | } // end MoveLinear() |