diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs index a7dda7acd2..3c952ae7fe 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs @@ -137,6 +137,7 @@ namespace OpenSim.Region.Physics.OdePlugin float m_amdampY; float m_amdampZ; + float m_gravmod; public float FrictionFactor { @@ -146,6 +147,14 @@ namespace OpenSim.Region.Physics.OdePlugin } } + public float GravMod + { + set + { + m_gravmod = value; + } + } + public ODEDynamics(OdePrim rootp) { @@ -153,6 +162,7 @@ namespace OpenSim.Region.Physics.OdePlugin _pParentScene = rootPrim._parent_scene; m_timestep = _pParentScene.ODE_STEPSIZE; m_invtimestep = 1.0f / m_timestep; + m_gravmod = rootPrim.GravModifier; } public void DoSetVehicle(VehicleData vd) @@ -816,7 +826,7 @@ namespace OpenSim.Region.Physics.OdePlugin m_lmEfect = 0; m_ffactor = 1f; } - + // hover if (m_VhoverTimescale < 300 && rootPrim.prim_geom != IntPtr.Zero) { @@ -862,7 +872,7 @@ namespace OpenSim.Region.Physics.OdePlugin force.Z += perr; ldampZ *= -curVel.Z; - force.Z += _pParentScene.gravityz * (1f - m_VehicleBuoyancy); + force.Z += _pParentScene.gravityz * m_gravmod * (1f - m_VehicleBuoyancy); } else // no buoyancy force.Z += _pParentScene.gravityz; @@ -870,7 +880,7 @@ namespace OpenSim.Region.Physics.OdePlugin else { // default gravity and Buoyancy - force.Z += _pParentScene.gravityz * (1f - m_VehicleBuoyancy); + force.Z += _pParentScene.gravityz * m_gravmod * (1f - m_VehicleBuoyancy); } // linear deflection @@ -1063,8 +1073,7 @@ namespace OpenSim.Region.Physics.OdePlugin torque.Y -= curLocalAngVel.Y * m_amdampY; torque.Z -= curLocalAngVel.Z * m_amdampZ; } - - + if (force.X != 0 || force.Y != 0 || force.Z != 0) { diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs index 7cabddd18f..e3f88c688e 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs @@ -115,6 +115,7 @@ namespace OpenSim.Region.Physics.OdePlugin private int body_autodisable_frames; public int bodydisablecontrol; + private float m_gravmod = 1.0f; // Default we're a Geometry @@ -914,6 +915,55 @@ namespace OpenSim.Region.Physics.OdePlugin bounce = _parent_scene.m_materialContactsData[pMaterial].bounce; } + public override float Density + { + get + { + return m_density * 100f; + } + set + { + m_density = value / 100f; + // for not prim mass is not updated since this implies full rebuild of body inertia TODO + } + } + public override float GravModifier + { + get + { + return m_gravmod; + } + set + { + m_gravmod = value; + if (m_vehicle != null) + m_vehicle.GravMod = m_gravmod; + } + } + public override float Friction + { + get + { + return mu; + } + set + { + mu = value; + } + } + + public override float Restitution + { + get + { + return bounce; + } + set + { + bounce = value; + } + } + public void setPrimForRemoval() { AddChange(changes.Remove, null); @@ -3336,7 +3386,7 @@ namespace OpenSim.Region.Physics.OdePlugin } else { - float b = (1.0f - m_buoyancy); + float b = (1.0f - m_buoyancy) * m_gravmod; fx = _parent_scene.gravityx * b; fy = _parent_scene.gravityy * b; fz = _parent_scene.gravityz * b;