From 269febc87e1aba24fff09e9fb0d77eee0a73b185 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 29 May 2013 06:32:26 +0100 Subject: [PATCH] let gravity modifier, friction, restitution and density changes be applied to prim. Only have efect on root prim. Density doesn't get effect imediatly, only on next change of size or shape. density change implies a full body rebuild to be done later, after reducing the number of sets sop does. Other parameters should work. **** mainly untested *** --- .../Physics/UbitOdePlugin/ODEDynamics.cs | 19 +++++-- .../Region/Physics/UbitOdePlugin/ODEPrim.cs | 52 ++++++++++++++++++- 2 files changed, 65 insertions(+), 6 deletions(-) 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;