aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics')
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs53
1 files changed, 27 insertions, 26 deletions
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs
index 53a576e..d106677 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs
@@ -773,39 +773,40 @@ namespace OpenSim.Region.Physics.OdePlugin
773 d.Vector3 pos = d.BodyGetPosition(Body); 773 d.Vector3 pos = d.BodyGetPosition(Body);
774 774
775 float t = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y); 775 float t = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y);
776 float perr;
776 777
777 if (t < m_VhoverHeight) // don't go underground 778 // default to global but don't go underground
778 { 779 if (t < m_VhoverHeight)
779 // default to global 780 perr = m_VhoverHeight - pos.Z;
780 float perr = m_VhoverHeight - pos.Z; ; 781 else
782 perr = t - pos.Z; ;
781 783
782 if ((m_flags & VehicleFlag.HOVER_GLOBAL_HEIGHT) == 0) 784 if ((m_flags & VehicleFlag.HOVER_GLOBAL_HEIGHT) == 0)
785 {
786 if ((m_flags & VehicleFlag.HOVER_WATER_ONLY) != 0)
783 { 787 {
784 if ((m_flags & VehicleFlag.HOVER_WATER_ONLY) != 0) 788 perr += _pParentScene.GetWaterLevel();
785 {
786 perr += _pParentScene.GetWaterLevel();
787 }
788 else if ((m_flags & VehicleFlag.HOVER_TERRAIN_ONLY) != 0)
789 {
790 perr += t;
791 }
792 else
793 {
794 float w = _pParentScene.GetWaterLevel();
795 if (t > w)
796 perr += t;
797 else
798 perr += w;
799 }
800 } 789 }
801 if ((m_flags & VehicleFlag.HOVER_UP_ONLY) == 0 || perr > 0) 790 else if ((m_flags & VehicleFlag.HOVER_TERRAIN_ONLY) != 0)
802 { 791 {
803 force.Z += (perr / m_VhoverTimescale / m_VhoverTimescale - curVel.Z * m_VhoverEfficiency) / m_timestep; 792 perr += t;
804 force.Z += _pParentScene.gravityz * (1f - m_VehicleBuoyancy);
805 } 793 }
806 else // no buoyancy 794 else
807 force.Z += _pParentScene.gravityz; 795 {
796 float w = _pParentScene.GetWaterLevel();
797 if (t > w)
798 perr += t;
799 else
800 perr += w;
801 }
802 }
803 if ((m_flags & VehicleFlag.HOVER_UP_ONLY) == 0 || perr > 0)
804 {
805 force.Z += (perr / m_VhoverTimescale / m_VhoverTimescale - curVel.Z * m_VhoverEfficiency) / m_timestep;
806 force.Z += _pParentScene.gravityz * (1f - m_VehicleBuoyancy);
808 } 807 }
808 else // no buoyancy
809 force.Z += _pParentScene.gravityz;
809 } 810 }
810 else 811 else
811 { 812 {