From a8f1cd7e8643fc6f4f4f12b1af3e52b9830f5a5a Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 29 Feb 2012 19:32:23 +0000 Subject: update ubitODE to current working state --- OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs | 189 ++++++++++++++--------- OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs | 123 +++++++++------ 2 files changed, 199 insertions(+), 113 deletions(-) (limited to 'OpenSim/Region/Physics/UbitOdePlugin') diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs index 0ccdbc0..17f38e8 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs @@ -155,6 +155,8 @@ namespace OpenSim.Region.Physics.OdePlugin public float m_collisionscore; int m_colliderfilter = 0; + public IntPtr collide_geom; // for objects: geom if single prim space it linkset + private float m_density = 10.000006836f; // Aluminum g/cm3; public bool _zeroFlag; @@ -453,8 +455,6 @@ namespace OpenSim.Region.Physics.OdePlugin { get { - // Averate previous velocity with the new one so - // client object interpolation works a 'little' better if (_zeroFlag) return Vector3.Zero; return _velocity; @@ -833,6 +833,7 @@ namespace OpenSim.Region.Physics.OdePlugin body_autodisable_frames = parent_scene.bodyFramesAutoDisable; prim_geom = IntPtr.Zero; + collide_geom = IntPtr.Zero; Body = IntPtr.Zero; if (!size.IsFinite()) @@ -1367,7 +1368,7 @@ namespace OpenSim.Region.Physics.OdePlugin d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); m_collisionscore = 0; - if (m_targetSpace != _parent_scene.ActiveSpace) +// if (m_targetSpace != _parent_scene.ActiveSpace) { if (m_targetSpace != IntPtr.Zero) { @@ -1376,9 +1377,26 @@ namespace OpenSim.Region.Physics.OdePlugin d.SpaceRemove(m_targetSpace, prim_geom); } +// m_targetSpace = _parent_scene.ActiveSpace; +// d.SpaceAdd(m_targetSpace, prim_geom); + } + + + if (childrenPrim.Count == 0) + { + collide_geom = prim_geom; m_targetSpace = _parent_scene.ActiveSpace; d.SpaceAdd(m_targetSpace, prim_geom); } + else + { + m_targetSpace = d.HashSpaceCreate(_parent_scene.ActiveSpace); + d.HashSpaceSetLevels(m_targetSpace, -2, 8); + d.SpaceSetSublevel(m_targetSpace, 3); + d.SpaceSetCleanup(m_targetSpace, false); + d.SpaceAdd(m_targetSpace, prim_geom); + collide_geom = m_targetSpace; + } lock (childrenPrim) { @@ -1396,15 +1414,15 @@ namespace OpenSim.Region.Physics.OdePlugin d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags); prm.m_collisionscore = 0; - if (prm.m_targetSpace != _parent_scene.ActiveSpace) + if (prm.m_targetSpace != m_targetSpace) { if (prm.m_targetSpace != IntPtr.Zero) { - _parent_scene.waitForSpaceUnlock(m_targetSpace); + _parent_scene.waitForSpaceUnlock(prm.m_targetSpace); if (d.SpaceQuery(prm.m_targetSpace, prm.prim_geom)) d.SpaceRemove(prm.m_targetSpace, prm.prim_geom); } - prm.m_targetSpace = _parent_scene.ActiveSpace; + prm.m_targetSpace = m_targetSpace; d.SpaceAdd(m_targetSpace, prm.prim_geom); } @@ -1427,8 +1445,14 @@ namespace OpenSim.Region.Physics.OdePlugin d.GeomDisable(prim_geom); d.BodyDisable(Body); } + else + { + d.BodySetAngularVel(Body, m_rotationalVelocity.X, m_rotationalVelocity.Y, m_rotationalVelocity.Z); + d.BodySetLinearVel(Body, _velocity.X, _velocity.Y, _velocity.Z); + } _parent_scene.addActivePrim(this); + _parent_scene.addActiveGroups(this); } private void DestroyBody() @@ -1473,6 +1497,7 @@ namespace OpenSim.Region.Physics.OdePlugin d.JointDestroy(Amotor); Amotor = IntPtr.Zero; } + _parent_scene.remActiveGroup(this); d.BodyDestroy(Body); } Body = IntPtr.Zero; @@ -2390,8 +2415,8 @@ namespace OpenSim.Region.Physics.OdePlugin else */ DestroyBody(); - Stop(); } + Stop(); } } @@ -2576,7 +2601,8 @@ namespace OpenSim.Region.Physics.OdePlugin if ((bool)newbuilding) { m_building = true; - DestroyBody(); + if (!childPrim) + DestroyBody(); } else { @@ -2648,12 +2674,95 @@ namespace OpenSim.Region.Physics.OdePlugin public void Move() { if (!childPrim && m_isphysical && Body != IntPtr.Zero && - !m_disabled && !m_isSelected && d.BodyIsEnabled(Body) && !m_building) // KF: Only move root prims. + !m_disabled && !m_isSelected && d.BodyIsEnabled(Body) && !m_building && !m_outbounds) + // !m_disabled && !m_isSelected && !m_building && !m_outbounds) { - // if (!d.BodyIsEnabled(Body)) d.BodyEnable(Body); // KF add 161009 +// if (!d.BodyIsEnabled(Body)) d.BodyEnable(Body); // KF add 161009 float timestep = _parent_scene.ODE_STEPSIZE; + // check outside region + d.Vector3 lpos; + d.GeomCopyPosition(prim_geom, out lpos); // root position that is seem by rest of simulator + + if (lpos.Z < -100 || lpos.Z > 100000f) + { + m_outbounds = true; + + lpos.Z = Util.Clip(lpos.Z, -100f, 100000f); + _acceleration.X = 0; + _acceleration.Y = 0; + _acceleration.Z = 0; + + _velocity.X = 0; + _velocity.Y = 0; + _velocity.Z = 0; + m_rotationalVelocity.X = 0; + m_rotationalVelocity.Y = 0; + m_rotationalVelocity.Z = 0; + + d.BodySetLinearVel(Body, 0, 0, 0); // stop it + d.BodySetAngularVel(Body, 0, 0, 0); // stop it + d.BodySetPosition(Body, lpos.X, lpos.Y, lpos.Z); // put it somewhere + m_lastposition = _position; + m_lastorientation = _orientation; + + base.RequestPhysicsterseUpdate(); + + m_throttleUpdates = false; + throttleCounter = 0; + _zeroFlag = true; + + disableBodySoft(); // disable it and colisions + base.RaiseOutOfBounds(_position); + return; + } + + if (lpos.X < 0f) + { + _position.X = Util.Clip(lpos.X, -2f, -0.1f); + m_outbounds = true; + } + else if(lpos.X > _parent_scene.WorldExtents.X) + { + _position.X = Util.Clip(lpos.X, _parent_scene.WorldExtents.X + 0.1f, _parent_scene.WorldExtents.X + 2f); + m_outbounds = true; + } + if (lpos.Y < 0f) + { + _position.Y = Util.Clip(lpos.Y, -2f, -0.1f); + m_outbounds = true; + } + else if(lpos.Y > _parent_scene.WorldExtents.Y) + { + _position.Y = Util.Clip(lpos.Y, _parent_scene.WorldExtents.Y + 0.1f, _parent_scene.WorldExtents.Y + 2f); + m_outbounds = true; + } + + if(m_outbounds) + { + m_lastposition = _position; + m_lastorientation = _orientation; + + d.Vector3 dtmp = d.BodyGetAngularVel(Body); + m_rotationalVelocity.X = dtmp.X; + m_rotationalVelocity.Y = dtmp.Y; + m_rotationalVelocity.Z = dtmp.Z; + + dtmp = d.BodyGetLinearVel(Body); + _velocity.X = dtmp.X; + _velocity.Y = dtmp.Y; + _velocity.Z = dtmp.Z; + + d.BodySetLinearVel(Body, 0, 0, 0); // stop it + d.BodySetAngularVel(Body, 0, 0, 0); + d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); + disableBodySoft(); // stop collisions + base.RequestPhysicsterseUpdate(); + return; + } + + float fx = 0; float fy = 0; float fz = 0; @@ -2862,7 +2971,7 @@ namespace OpenSim.Region.Physics.OdePlugin public void UpdatePositionAndVelocity(float simulatedtime) { // no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit! - if (_parent == null && !m_disabled && !m_building) + if (_parent == null && !m_disabled && !m_building && !m_outbounds) { if (Body != IntPtr.Zero) { @@ -2872,64 +2981,6 @@ namespace OpenSim.Region.Physics.OdePlugin d.Vector3 lpos; d.GeomCopyPosition(prim_geom, out lpos); // root position that is seem by rest of simulator - // we need to use root position since that's all the rest of scene uses - if (lpos.X < 0f || lpos.X > _parent_scene.WorldExtents.X - || lpos.Y < 0f || lpos.Y > _parent_scene.WorldExtents.Y - ) - { - // we are outside current region - // we can't let it keeping moving and having colisions - // since it can be stucked between something like terrain and edge - // so lets stop and disable it until something else kicks it - - _position.X = Util.Clip(lpos.X, -0.2f, _parent_scene.WorldExtents.X + 0.2f); - _position.Y = Util.Clip(lpos.Y, -0.2f, _parent_scene.WorldExtents.Y + 0.2f); - _position.Z = Util.Clip(lpos.Z, -100f, 50000f); - - m_lastposition = _position; -// m_lastorientation = _orientation; - - d.BodySetLinearVel(Body, 0, 0, 0); // stop it -// d.BodySetAngularVel(Body, 0, 0, 0); - d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); - disableBodySoft(); // stop collisions - m_outbounds = true; - base.RequestPhysicsterseUpdate(); - return; - } - - if (lpos.Z < -100 || lpos.Z > 100000f) - { - lpos.Z = Util.Clip(lpos.Z, -100f, 50000f); - - _acceleration.X = 0; - _acceleration.Y = 0; - _acceleration.Z = 0; - - _velocity.X = 0; - _velocity.Y = 0; - _velocity.Z = 0; - m_rotationalVelocity.X = 0; - m_rotationalVelocity.Y = 0; - m_rotationalVelocity.Z = 0; - - d.BodySetLinearVel(Body, 0, 0, 0); // stop it - d.BodySetAngularVel(Body, 0, 0, 0); // stop it - d.BodySetPosition(Body, lpos.X, lpos.Y, lpos.Z); // put it somewhere - m_lastposition = _position; - m_lastorientation = _orientation; - - base.RequestPhysicsterseUpdate(); - - m_throttleUpdates = false; - throttleCounter = 0; - _zeroFlag = true; - - disableBodySoft(); // disable it and colisions - base.RaiseOutOfBounds(_position); - - return; - } d.Quaternion ori; d.GeomCopyQuaternion(prim_geom, out ori); diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs index 6e4c373..ccb4c23 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs @@ -224,6 +224,7 @@ namespace OpenSim.Region.Physics.OdePlugin private readonly HashSet _characters = new HashSet(); private readonly HashSet _prims = new HashSet(); private readonly HashSet _activeprims = new HashSet(); + private readonly HashSet _activegroups = new HashSet(); public OpenSim.Framework.LocklessQueue ChangesQueue = new OpenSim.Framework.LocklessQueue(); @@ -1013,15 +1014,24 @@ namespace OpenSim.Region.Physics.OdePlugin } - // collide active prims with static enviroment lock (_activeprims) { + foreach (OdePrim aprim in _activeprims) + { + aprim.CollisionScore = 0; + aprim.IsColliding = false; + } + } + + // collide active prims with static enviroment + lock (_activegroups) + { try { - foreach (OdePrim prm in _activeprims) + foreach (OdePrim prm in _activegroups) { - if (d.BodyIsEnabled(prm.Body)) - d.SpaceCollide2(StaticSpace, prm.prim_geom, IntPtr.Zero, nearCallback); + if (d.BodyIsEnabled(prm.Body) && !prm.m_outbounds) + d.SpaceCollide2(StaticSpace, prm.collide_geom, IntPtr.Zero, nearCallback); } } catch (AccessViolationException) @@ -1029,7 +1039,6 @@ namespace OpenSim.Region.Physics.OdePlugin m_log.Warn("[PHYSICS]: Unable to collide Active prim to static space"); } } - // finally colide active things amoung them try { @@ -1039,7 +1048,6 @@ namespace OpenSim.Region.Physics.OdePlugin { m_log.Warn("[PHYSICS]: Unable to collide in Active space"); } - // _perloopContact.Clear(); } @@ -1148,13 +1156,20 @@ namespace OpenSim.Region.Physics.OdePlugin public void addActivePrim(OdePrim activatePrim) { - // adds active prim.. (ones that should be iterated over in collisions_optimized + // adds active prim.. lock (_activeprims) { if (!_activeprims.Contains(activatePrim)) _activeprims.Add(activatePrim); - //else - // m_log.Warn("[PHYSICS]: Double Entry in _activeprims detected, potential crash immenent"); + } + } + + public void addActiveGroups(OdePrim activatePrim) + { + lock (_activegroups) + { + if (!_activegroups.Contains(activatePrim)) + _activegroups.Add(activatePrim); } } @@ -1186,6 +1201,13 @@ namespace OpenSim.Region.Physics.OdePlugin _activeprims.Remove(deactivatePrim); } } + public void remActiveGroup(OdePrim deactivatePrim) + { + lock (_activegroups) + { + _activegroups.Remove(deactivatePrim); + } + } public override void RemovePrim(PhysicsActor prim) { @@ -1258,6 +1280,11 @@ namespace OpenSim.Region.Physics.OdePlugin { waitForSpaceUnlock(currentspace); d.SpaceRemove(currentspace, geom); + + if (d.SpaceGetSublevel(currentspace) > 2 && d.SpaceGetNumGeoms(currentspace) == 0) + { + d.SpaceDestroy(currentspace); + } } else { @@ -1274,6 +1301,12 @@ namespace OpenSim.Region.Physics.OdePlugin { waitForSpaceUnlock(currentspace); d.SpaceRemove(currentspace, geom); + + if (d.SpaceGetSublevel(currentspace) > 1 && d.SpaceGetNumGeoms(currentspace) == 0) + { + d.SpaceDestroy(currentspace); + } + } } } @@ -1577,42 +1610,14 @@ namespace OpenSim.Region.Physics.OdePlugin statchanges += Util.EnvironmentTickCountSubtract(statstart); - // Move characters - lock (_characters) - { - List defects = new List(); - foreach (OdeCharacter actor in _characters) - { - if (actor != null) - actor.Move(ODE_STEPSIZE, defects); - } - if (defects.Count != 0) - { - foreach (OdeCharacter defect in defects) - { - RemoveCharacter(defect); - } - } - } - statchmove += Util.EnvironmentTickCountSubtract(statstart); - - // Move other active objects - lock (_activeprims) - { - foreach (OdePrim aprim in _activeprims) - { - aprim.CollisionScore = 0; - aprim.IsColliding = false; - aprim.Move(); - } - } - statactmove += Util.EnvironmentTickCountSubtract(statstart); //if ((framecount % m_randomizeWater) == 0) // randomizeWater(waterlevel); m_rayCastManager.ProcessQueuedRequests(); + + statray += Util.EnvironmentTickCountSubtract(statstart); collision_optimized(); statcol += Util.EnvironmentTickCountSubtract(statstart); @@ -1642,8 +1647,35 @@ namespace OpenSim.Region.Physics.OdePlugin d.WorldQuickStep(world, ODE_STEPSIZE); statstep += Util.EnvironmentTickCountSubtract(statstart); - d.JointGroupEmpty(contactgroup); - totjcontact += m_global_contactcount; + + // Move characters + lock (_characters) + { + List defects = new List(); + foreach (OdeCharacter actor in _characters) + { + if (actor != null) + actor.Move(ODE_STEPSIZE, defects); + } + if (defects.Count != 0) + { + foreach (OdeCharacter defect in defects) + { + RemoveCharacter(defect); + } + } + } + statchmove += Util.EnvironmentTickCountSubtract(statstart); + + // Move other active objects + lock (_activegroups) + { + foreach (OdePrim aprim in _activegroups) + { + aprim.Move(); + } + } + //ode.dunlock(world); } catch (Exception e) @@ -1652,6 +1684,9 @@ namespace OpenSim.Region.Physics.OdePlugin // ode.dunlock(world); } + d.JointGroupEmpty(contactgroup); + totjcontact += m_global_contactcount; + step_time -= ODE_STEPSIZE; nodeframes++; } @@ -1686,10 +1721,10 @@ namespace OpenSim.Region.Physics.OdePlugin } statmovchar = Util.EnvironmentTickCountSubtract(statstart); - lock (_activeprims) + lock (_activegroups) { { - foreach (OdePrim actor in _activeprims) + foreach (OdePrim actor in _activegroups) { if (actor.IsPhysical) { @@ -1966,7 +2001,7 @@ namespace OpenSim.Region.Physics.OdePlugin d.RFromAxisAndAngle(out R, v3.X, v3.Y, v3.Z, angle); d.GeomSetRotation(GroundGeom, ref R); - d.GeomSetPosition(GroundGeom, pOffset.X + (float)Constants.RegionSize * 0.5f - 0.5f, pOffset.Y + (float)Constants.RegionSize * 0.5f - 0.5f, 0); + d.GeomSetPosition(GroundGeom, pOffset.X + (float)Constants.RegionSize * 0.5f, pOffset.Y + (float)Constants.RegionSize * 0.5f, 0); RegionTerrain.Add(pOffset, GroundGeom, GroundGeom); // TerrainHeightFieldHeights.Add(GroundGeom, ODElandMap); TerrainHeightFieldHeights.Add(GroundGeom, _heightmap); -- cgit v1.1 From ee4d3bfad2c9660637c24195a68d3f4484fed0b7 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 29 Feb 2012 19:36:16 +0000 Subject: ubitODE bug fix --- OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'OpenSim/Region/Physics/UbitOdePlugin') diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs index ccb4c23..eb5c687 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs @@ -1302,7 +1302,7 @@ namespace OpenSim.Region.Physics.OdePlugin waitForSpaceUnlock(currentspace); d.SpaceRemove(currentspace, geom); - if (d.SpaceGetSublevel(currentspace) > 1 && d.SpaceGetNumGeoms(currentspace) == 0) + if (d.SpaceGetSublevel(currentspace) > 2 && d.SpaceGetNumGeoms(currentspace) == 0) { d.SpaceDestroy(currentspace); } -- cgit v1.1 From f42fd7fb773cc317f36e747579e9f8e28cfe2049 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 2 Mar 2012 15:05:30 +0000 Subject: update ubitODE --- .../Region/Physics/UbitOdePlugin/ODEDynamics.cs | 60 ++++++++++++++++------ 1 file changed, 45 insertions(+), 15 deletions(-) (limited to 'OpenSim/Region/Physics/UbitOdePlugin') diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs index c9d0909..4f82c24 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs @@ -38,7 +38,7 @@ * settings use. */ -// Ubit 2012 +// Extensive change Ubit 2012 using System; using System.Collections.Generic; @@ -614,6 +614,7 @@ namespace OpenSim.Region.Physics.OdePlugin return vec; } + private const float pi = (float)Math.PI; private const float halfpi = 0.5f * (float)Math.PI; public static Vector3 ubitRot2Euler(Quaternion rot) @@ -884,35 +885,64 @@ namespace OpenSim.Region.Physics.OdePlugin float ftmp = 1.0f / m_verticalAttractionTimescale / m_verticalAttractionTimescale / _pParentScene.ODE_STEPSIZE; float ftmp2 = m_verticalAttractionEfficiency / _pParentScene.ODE_STEPSIZE; - if (Math.Abs(roll) > 0.01) // roll + if (roll > halfpi) + roll = pi - roll; + else if (roll < -halfpi) + roll = -pi - roll; + + float effroll = pitch / halfpi; + effroll *= effroll; + effroll = 1 - effroll; + effroll *= roll; + + if (Math.Abs(effroll) > 0.01) // roll { - torque.X -= -roll * ftmp + curLocalAngVel.X * ftmp2; + torque.X -= -effroll * ftmp + curLocalAngVel.X * ftmp2; } - if (Math.Abs(pitch) > 0.01 && ((m_flags & VehicleFlag.LIMIT_ROLL_ONLY) == 0)) // pitch + if ((m_flags & VehicleFlag.LIMIT_ROLL_ONLY) == 0) { - torque.Y -= -pitch * ftmp + curLocalAngVel.Y * ftmp2; + float effpitch = roll / halfpi; + effpitch *= effpitch; + effpitch = 1 - effpitch; + effpitch *= pitch; + + if (Math.Abs(effpitch) > 0.01) // pitch + { + torque.Y -= -effpitch * ftmp + curLocalAngVel.Y * ftmp2; + } } - if (m_bankingEfficiency != 0 && Math.Abs(roll) > 0.01) + if (m_bankingEfficiency != 0 && Math.Abs(effroll) > 0.01) { - float broll = roll * m_bankingEfficiency; ; + + float broll = effroll; +/* + if (broll > halfpi) + broll = pi - broll; + else if (broll < -halfpi) + broll = -pi - broll; +*/ + broll *= m_bankingEfficiency; if (m_bankingMix != 0) { float vfact = Math.Abs(curLocalVel.X) / 10.0f; if (vfact > 1.0f) vfact = 1.0f; + if (curLocalVel.X >= 0) - broll *= ((1 - m_bankingMix) + vfact); + broll *= (1 + (vfact - 1) * m_bankingMix); else - broll *= -((1 - m_bankingMix) + vfact); + broll *= -(1 + (vfact - 1) * m_bankingMix); } - broll = (broll - curLocalAngVel.Z) / m_bankingTimescale; - // torque.Z += broll; - // make z rot be in world Z not local as seems to be in sl - tmpV.X = 0; - tmpV.Y = 0; - tmpV.Z = broll; + + broll = broll / m_bankingTimescale; + + ftmp = -Math.Abs(m_bankingEfficiency) / m_bankingTimescale; + + tmpV.X = ftmp * curAngVel.X; + tmpV.Y = ftmp * curAngVel.Y; + tmpV.Z = broll + ftmp * curAngVel.Z; tmpV *= irotq; torque.X += tmpV.X; -- cgit v1.1 From 7c931037bd9d43b7de52534870ad15a645fe67d6 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 4 Mar 2012 01:40:12 +0000 Subject: update UbitODE --- .../Region/Physics/UbitOdePlugin/ODEDynamics.cs | 11 ++++ OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs | 12 ++++ OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs | 68 ++++++++++------------ 3 files changed, 55 insertions(+), 36 deletions(-) (limited to 'OpenSim/Region/Physics/UbitOdePlugin') diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs index 4f82c24..0fabb56 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs @@ -120,6 +120,16 @@ namespace OpenSim.Region.Physics.OdePlugin private float m_lmEfect = 0; // current linear motor eficiency private float m_amEfect = 0; // current angular motor eficiency + public bool EngineActive + { + get + { + if (m_lmEfect > 0.01) + return true; + return false; + } + } + public ODEDynamics(OdePrim rootp) { @@ -152,6 +162,7 @@ namespace OpenSim.Region.Physics.OdePlugin m_linearMotorTimescale = vd.m_linearMotorTimescale; if (m_linearMotorTimescale < timestep) m_linearMotorTimescale = timestep; + m_linearMotorOffset = vd.m_linearMotorOffset; //Angular properties diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs index 17f38e8..e5fa1d7 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs @@ -222,6 +222,18 @@ namespace OpenSim.Region.Physics.OdePlugin { get { + if (m_isphysical) + { + ODEDynamics veh; + if (_parent != null) + veh = ((OdePrim)_parent).m_vehicle; + else + veh = m_vehicle; + + if (veh != null) + if (veh.Type != Vehicle.TYPE_NONE && veh.EngineActive) + return new ContactData(0, 0); + } return primContactData; } } diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs index eb5c687..129db5d 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs @@ -155,7 +155,7 @@ namespace OpenSim.Region.Physics.OdePlugin private readonly ILog m_log; // private Dictionary m_storedCollisions = new Dictionary(); - private int threadid = 0; +// private int threadid = 0; private Random fluidRandomizer = new Random(Environment.TickCount); const d.ContactFlags comumContactFlags = d.ContactFlags.SoftERP | d.ContactFlags.SoftCFM |d.ContactFlags.Approx1 | d.ContactFlags.Bounce; @@ -168,7 +168,7 @@ namespace OpenSim.Region.Physics.OdePlugin float frictionMovementMult = 0.3f; float TerrainBounce = 0.1f; - float TerrainFriction = 0.1f; + float TerrainFriction = 0.3f; public float AvatarBounce = 0.3f; public float AvatarFriction = 0;// 0.9f * 0.5f; @@ -189,8 +189,8 @@ namespace OpenSim.Region.Physics.OdePlugin internal IntPtr WaterGeom; - public float avPIDD = 3200f; // make it visible - public float avPIDP = 1400f; // make it visible + public float avPIDD = 2200f; // make it visible + public float avPIDP = 900f; // make it visible private float avCapRadius = 0.37f; private float avDensity = 3f; private float avMovementDivisorWalk = 1.3f; @@ -202,7 +202,7 @@ namespace OpenSim.Region.Physics.OdePlugin public bool forceSimplePrimMeshing = false; public float meshSculptLOD = 32; - public float MeshSculptphysicalLOD = 16; + public float MeshSculptphysicalLOD = 32; public float geomDefaultDensity = 10.000006836f; @@ -212,12 +212,11 @@ namespace OpenSim.Region.Physics.OdePlugin public float bodyPIDD = 35f; public float bodyPIDG = 25; - public int geomCrossingFailuresBeforeOutofbounds = 6; +// public int geomCrossingFailuresBeforeOutofbounds = 6; public int bodyFramesAutoDisable = 20; private float[] _watermap; - private bool m_filterCollisions = true; private d.NearCallback nearCallback; @@ -388,9 +387,6 @@ namespace OpenSim.Region.Physics.OdePlugin // Defaults - avPIDD = 2200.0f; - avPIDP = 900.0f; - int contactsPerCollision = 80; if (m_config != null) @@ -398,57 +394,56 @@ namespace OpenSim.Region.Physics.OdePlugin IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"]; if (physicsconfig != null) { - gravityx = physicsconfig.GetFloat("world_gravityx", 0f); - gravityy = physicsconfig.GetFloat("world_gravityy", 0f); - gravityz = physicsconfig.GetFloat("world_gravityz", -9.8f); + gravityx = physicsconfig.GetFloat("world_gravityx", gravityx); + gravityy = physicsconfig.GetFloat("world_gravityy", gravityy); + gravityz = physicsconfig.GetFloat("world_gravityz", gravityz); - metersInSpace = physicsconfig.GetFloat("meters_in_small_space", 29.9f); + metersInSpace = physicsconfig.GetFloat("meters_in_small_space", metersInSpace); contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", contactsurfacelayer); - ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", 0.020f); - m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", 10); + ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", ODE_STEPSIZE); + m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", m_physicsiterations); avDensity = physicsconfig.GetFloat("av_density", avDensity); - avMovementDivisorWalk = physicsconfig.GetFloat("av_movement_divisor_walk", 1.3f); - avMovementDivisorRun = physicsconfig.GetFloat("av_movement_divisor_run", 0.8f); - avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f); + avMovementDivisorWalk = physicsconfig.GetFloat("av_movement_divisor_walk", avMovementDivisorWalk); + avMovementDivisorRun = physicsconfig.GetFloat("av_movement_divisor_run", avMovementDivisorRun); + avCapRadius = physicsconfig.GetFloat("av_capsule_radius", avCapRadius); - contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", 80); + contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", contactsPerCollision); geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3); geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15); - geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5); +// geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5); - geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", 10.000006836f); - bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", 20); + geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", geomDefaultDensity); + bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", bodyFramesAutoDisable); - bodyPIDD = physicsconfig.GetFloat("body_pid_derivative", 35f); - bodyPIDG = physicsconfig.GetFloat("body_pid_gain", 25f); + bodyPIDD = physicsconfig.GetFloat("body_pid_derivative", bodyPIDD); + bodyPIDG = physicsconfig.GetFloat("body_pid_gain", bodyPIDG); forceSimplePrimMeshing = physicsconfig.GetBoolean("force_simple_prim_meshing", forceSimplePrimMeshing); - meshSculptedPrim = physicsconfig.GetBoolean("mesh_sculpted_prim", true); - meshSculptLOD = physicsconfig.GetFloat("mesh_lod", 32f); - MeshSculptphysicalLOD = physicsconfig.GetFloat("mesh_physical_lod", 16f); - m_filterCollisions = physicsconfig.GetBoolean("filter_collisions", false); + meshSculptedPrim = physicsconfig.GetBoolean("mesh_sculpted_prim", meshSculptedPrim); + meshSculptLOD = physicsconfig.GetFloat("mesh_lod", meshSculptLOD); + MeshSculptphysicalLOD = physicsconfig.GetFloat("mesh_physical_lod", MeshSculptphysicalLOD); if (Environment.OSVersion.Platform == PlatformID.Unix) { - avPIDD = physicsconfig.GetFloat("av_pid_derivative_linux", 2200.0f); - avPIDP = physicsconfig.GetFloat("av_pid_proportional_linux", 900.0f); + avPIDD = physicsconfig.GetFloat("av_pid_derivative_linux", avPIDD); + avPIDP = physicsconfig.GetFloat("av_pid_proportional_linux", avPIDP); } else { - avPIDD = physicsconfig.GetFloat("av_pid_derivative_win", 2200.0f); - avPIDP = physicsconfig.GetFloat("av_pid_proportional_win", 900.0f); + avPIDD = physicsconfig.GetFloat("av_pid_derivative_win", avPIDD); + avPIDP = physicsconfig.GetFloat("av_pid_proportional_win", avPIDP); } physics_logging = physicsconfig.GetBoolean("physics_logging", false); physics_logging_interval = physicsconfig.GetInt("physics_logging_interval", 0); physics_logging_append_existing_logfile = physicsconfig.GetBoolean("physics_logging_append_existing_logfile", false); - minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", 3f); - maximumMassObject = physicsconfig.GetFloat("maximum_mass_object", 10000.01f); + minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", minimumGroundFlightOffset); + maximumMassObject = physicsconfig.GetFloat("maximum_mass_object", maximumMassObject); } } @@ -1941,13 +1936,14 @@ namespace OpenSim.Region.Physics.OdePlugin yy += regionsize; val = heightMap[yy + xx]; + if (val < 0.0f) + val = 0.0f; // no neg terrain as in chode _heightmap[xt + y] = val; if (hfmin > val) hfmin = val; if (hfmax < val) hfmax = val; - } xt += heightmapHeightSamples; } -- cgit v1.1 From 01fcd400d7651be5f4aae3547a0489a7ccc5d7f7 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 4 Mar 2012 04:26:05 +0000 Subject: update UbitOde --- .../Region/Physics/UbitOdePlugin/ODECharacter.cs | 12 +++-- .../Region/Physics/UbitOdePlugin/ODEDynamics.cs | 19 ++++--- OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs | 39 +++++++------- OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs | 59 ++++++++++------------ 4 files changed, 66 insertions(+), 63 deletions(-) (limited to 'OpenSim/Region/Physics/UbitOdePlugin') diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs index 793e281..94cadb2 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs @@ -136,7 +136,8 @@ namespace OpenSim.Region.Physics.OdePlugin public UUID m_uuid; public bool bad = false; - public ContactData AvatarContactData = new ContactData(10f, 0.3f); + float mu; + float bounce; public OdeCharacter(String avName, OdeScene parent_scene, Vector3 pos, Vector3 size, float pid_d, float pid_p, float capsule_radius, float density, float walk_divisor, float rundivisor) { @@ -168,8 +169,8 @@ namespace OpenSim.Region.Physics.OdePlugin m_density = density; m_mass = 80f; // sure we have a default - AvatarContactData.mu = parent_scene.AvatarFriction; - AvatarContactData.bounce = parent_scene.AvatarBounce; + mu = parent_scene.AvatarFriction; + bounce = parent_scene.AvatarBounce; walkDivisor = walk_divisor; runDivisor = rundivisor; @@ -190,9 +191,10 @@ namespace OpenSim.Region.Physics.OdePlugin set { return; } } - public override ContactData ContactData + public override void getContactData(ref ContactData cdata) { - get { return AvatarContactData; } + cdata.mu = mu; + cdata.bounce = bounce; } public override bool Building { get; set; } diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs index 0fabb56..d0b4546 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs @@ -119,25 +119,22 @@ namespace OpenSim.Region.Physics.OdePlugin // auxiliar private float m_lmEfect = 0; // current linear motor eficiency private float m_amEfect = 0; // current angular motor eficiency + private float m_ffactor = 1.0f; - public bool EngineActive + public float FrictionFactor { get { - if (m_lmEfect > 0.01) - return true; - return false; + return m_ffactor; } } - public ODEDynamics(OdePrim rootp) { rootPrim = rootp; _pParentScene = rootPrim._parent_scene; } - public void DoSetVehicle(VehicleData vd) { @@ -212,6 +209,7 @@ namespace OpenSim.Region.Physics.OdePlugin m_lmEfect = 0; m_amEfect = 0; + m_ffactor = 1.0f; } internal void ProcessFloatVehicleParam(Vehicle pParam, float pValue) @@ -329,6 +327,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (len > 30.0f) m_linearMotorDirection *= (30.0f / len); m_lmEfect = 1.0f; // turn it on + m_ffactor = 0.01f; if (rootPrim.Body != IntPtr.Zero && !d.BodyIsEnabled(rootPrim.Body) && !rootPrim.m_isSelected && !rootPrim.m_disabled) d.BodyEnable(rootPrim.Body); @@ -379,6 +378,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (len > 30.0f) m_linearMotorDirection *= (30.0f / len); m_lmEfect = 1.0f; // turn it on + m_ffactor = 0.01f; if (rootPrim.Body != IntPtr.Zero && !d.BodyIsEnabled(rootPrim.Body) && !rootPrim.m_isSelected && !rootPrim.m_disabled) d.BodyEnable(rootPrim.Body); @@ -425,6 +425,7 @@ namespace OpenSim.Region.Physics.OdePlugin float invtimestep = _pParentScene.ODE_STEPSIZE; m_lmEfect = 0; m_amEfect = 0; + m_ffactor = 1f; m_linearMotorDirection = Vector3.Zero; m_angularMotorDirection = Vector3.Zero; @@ -602,6 +603,7 @@ namespace OpenSim.Region.Physics.OdePlugin { m_lmEfect = 0; m_amEfect = 0; + m_ffactor = 1f; } public static Vector3 Xrot(Quaternion rot) @@ -752,9 +754,14 @@ namespace OpenSim.Region.Physics.OdePlugin force.Z += tmpV.Z; } m_lmEfect *= (1.0f - 1.0f / m_linearMotorDecayTimescale); + + m_ffactor = 0.01f + 1e-4f * curVel.LengthSquared(); } else + { m_lmEfect = 0; + m_ffactor = 1f; + } // friction if (curLocalVel.X != 0 || curLocalVel.Y != 0 || curLocalVel.Z != 0) diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs index e5fa1d7..db07565 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs @@ -187,7 +187,8 @@ namespace OpenSim.Region.Physics.OdePlugin public ODEDynamics m_vehicle; internal int m_material = (int)Material.Wood; - protected ContactData primContactData = new ContactData { mu = 0f, bounce = 0.1f }; + private float mu; + private float bounce; /// /// Is this prim subject to physics? Even if not, it's still solid for collision purposes. @@ -218,25 +219,23 @@ namespace OpenSim.Region.Physics.OdePlugin } } - public override ContactData ContactData + public override void getContactData(ref ContactData cdata) { - get + cdata.mu = mu; + cdata.bounce = bounce; + + if (m_isphysical) { - if (m_isphysical) - { - ODEDynamics veh; - if (_parent != null) - veh = ((OdePrim)_parent).m_vehicle; - else - veh = m_vehicle; + ODEDynamics veh; + if (_parent != null) + veh = ((OdePrim)_parent).m_vehicle; + else + veh = m_vehicle; - if (veh != null) - if (veh.Type != Vehicle.TYPE_NONE && veh.EngineActive) - return new ContactData(0, 0); - } - return primContactData; + if (veh != null && veh.Type != Vehicle.TYPE_NONE) + cdata.mu *= veh.FrictionFactor; } - } + } public override int PhysicsActorType { @@ -745,8 +744,8 @@ namespace OpenSim.Region.Physics.OdePlugin public override void SetMaterial(int pMaterial) { m_material = pMaterial; - primContactData.mu = _parent_scene.m_materialContactsData[pMaterial].mu; - primContactData.bounce = _parent_scene.m_materialContactsData[pMaterial].bounce; + mu = _parent_scene.m_materialContactsData[pMaterial].mu; + bounce = _parent_scene.m_materialContactsData[pMaterial].bounce; } public void setPrimForRemoval() @@ -899,8 +898,8 @@ namespace OpenSim.Region.Physics.OdePlugin m_isSelected = false; m_delaySelect = false; - primContactData.mu = parent_scene.m_materialContactsData[(int)Material.Wood].mu; - primContactData.bounce = parent_scene.m_materialContactsData[(int)Material.Wood].bounce; + mu = parent_scene.m_materialContactsData[(int)Material.Wood].mu; + bounce = parent_scene.m_materialContactsData[(int)Material.Wood].bounce; CalcPrimBodyData(); diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs index 129db5d..884a5a7 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs @@ -163,8 +163,6 @@ namespace OpenSim.Region.Physics.OdePlugin const float comumSoftContactERP = 0.1f; const float comumContactCFM = 0.0001f; - float frictionScale = 1.0f; - float frictionMovementMult = 0.3f; float TerrainBounce = 0.1f; @@ -450,33 +448,30 @@ namespace OpenSim.Region.Physics.OdePlugin ContactgeomsArray = Marshal.AllocHGlobal(contactsPerCollision * d.ContactGeom.unmanagedSizeOf); GlobalContactsArray = GlobalContactsArray = Marshal.AllocHGlobal(maxContactsbeforedeath * d.Contact.unmanagedSizeOf); - m_materialContactsData[(int)Material.Stone].mu = frictionScale * 0.8f; + m_materialContactsData[(int)Material.Stone].mu = 0.8f; m_materialContactsData[(int)Material.Stone].bounce = 0.4f; - m_materialContactsData[(int)Material.Metal].mu = frictionScale * 0.3f; + m_materialContactsData[(int)Material.Metal].mu = 0.3f; m_materialContactsData[(int)Material.Metal].bounce = 0.4f; - m_materialContactsData[(int)Material.Glass].mu = frictionScale * 0.2f; + m_materialContactsData[(int)Material.Glass].mu = 0.2f; m_materialContactsData[(int)Material.Glass].bounce = 0.7f; - m_materialContactsData[(int)Material.Wood].mu = frictionScale * 0.6f; + m_materialContactsData[(int)Material.Wood].mu = 0.6f; m_materialContactsData[(int)Material.Wood].bounce = 0.5f; - m_materialContactsData[(int)Material.Flesh].mu = frictionScale * 0.9f; + m_materialContactsData[(int)Material.Flesh].mu = 0.9f; m_materialContactsData[(int)Material.Flesh].bounce = 0.3f; - m_materialContactsData[(int)Material.Plastic].mu = frictionScale * 0.4f; + m_materialContactsData[(int)Material.Plastic].mu = 0.4f; m_materialContactsData[(int)Material.Plastic].bounce = 0.7f; - m_materialContactsData[(int)Material.Rubber].mu = frictionScale * 0.9f; + m_materialContactsData[(int)Material.Rubber].mu = 0.9f; m_materialContactsData[(int)Material.Rubber].bounce = 0.95f; m_materialContactsData[(int)Material.light].mu = 0.0f; m_materialContactsData[(int)Material.light].bounce = 0.0f; - TerrainFriction *= frictionScale; -// AvatarFriction *= frictionScale; - // Set the gravity,, don't disable things automatically (we set it explicitly on some things) d.WorldSetGravity(world, gravityx, gravityy, gravityz); @@ -562,13 +557,6 @@ namespace OpenSim.Region.Physics.OdePlugin } - /// - /// This is our near callback. A geometry is near a body - /// - /// The space that contains the geoms. Remember, spaces are also geoms - /// a geometry or space - /// another geometry or space - /// private bool GetCurContactGeom(int index, ref d.ContactGeom newcontactgeom) { @@ -580,7 +568,13 @@ namespace OpenSim.Region.Physics.OdePlugin return true; } - + /// + /// This is our near callback. A geometry is near a body + /// + /// The space that contains the geoms. Remember, spaces are also geoms + /// a geometry or space + /// another geometry or space + /// private void near(IntPtr space, IntPtr g1, IntPtr g2) { @@ -699,8 +693,8 @@ namespace OpenSim.Region.Physics.OdePlugin // big messy collision analises float mu = 0; float bounce = 0; - ContactData contactdata1; - ContactData contactdata2; + ContactData contactdata1 = new ContactData(0, 0); + ContactData contactdata2 = new ContactData(0, 0); bool erpSoft = false; String name = null; @@ -714,8 +708,9 @@ namespace OpenSim.Region.Physics.OdePlugin switch (p2.PhysicsActorType) { case (int)ActorTypes.Agent: - contactdata1 = p1.ContactData; - contactdata2 = p2.ContactData; + p1.getContactData(ref contactdata1); + p2.getContactData(ref contactdata2); + bounce = contactdata1.bounce * contactdata2.bounce; mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu); @@ -727,8 +722,8 @@ namespace OpenSim.Region.Physics.OdePlugin p2.CollidingObj = true; break; case (int)ActorTypes.Prim: - contactdata1 = p1.ContactData; - contactdata2 = p2.ContactData; + p1.getContactData(ref contactdata1); + p2.getContactData(ref contactdata2); bounce = contactdata1.bounce * contactdata2.bounce; mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu); @@ -749,8 +744,8 @@ namespace OpenSim.Region.Physics.OdePlugin switch (p2.PhysicsActorType) { case (int)ActorTypes.Agent: - contactdata1 = p1.ContactData; - contactdata2 = p2.ContactData; + p1.getContactData(ref contactdata1); + p2.getContactData(ref contactdata2); bounce = contactdata1.bounce * contactdata2.bounce; mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu); @@ -768,8 +763,8 @@ namespace OpenSim.Region.Physics.OdePlugin p1.CollidingObj = true; p2.CollidingObj = true; } - contactdata1 = p1.ContactData; - contactdata2 = p2.ContactData; + p1.getContactData(ref contactdata1); + p2.getContactData(ref contactdata2); bounce = contactdata1.bounce * contactdata2.bounce; erpSoft = true; mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu); @@ -784,7 +779,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (name == "Terrain") { erpSoft = true; - contactdata1 = p1.ContactData; + p1.getContactData(ref contactdata1); bounce = contactdata1.bounce * TerrainBounce; mu = (float)Math.Sqrt(contactdata1.mu * TerrainFriction); if (Math.Abs(p1.Velocity.X) > 0.1f || Math.Abs(p1.Velocity.Y) > 0.1f) @@ -811,7 +806,7 @@ namespace OpenSim.Region.Physics.OdePlugin { erpSoft = true; p2.CollidingGround = true; - contactdata2 = p2.ContactData; + p2.getContactData(ref contactdata2); bounce = contactdata2.bounce * TerrainBounce; mu = (float)Math.Sqrt(contactdata2.mu * TerrainFriction); -- cgit v1.1 From 7377e633c73f7ee34240cb70f0f75fcd9b705168 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 5 Mar 2012 12:37:21 +0000 Subject: update ubitOde --- .../Region/Physics/UbitOdePlugin/ODECharacter.cs | 1 + OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs | 355 ++++++++++++++++----- OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs | 15 +- 3 files changed, 294 insertions(+), 77 deletions(-) (limited to 'OpenSim/Region/Physics/UbitOdePlugin') diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs index 94cadb2..9a22331 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs @@ -195,6 +195,7 @@ namespace OpenSim.Region.Physics.OdePlugin { cdata.mu = mu; cdata.bounce = bounce; + cdata.softcolide = false; } public override bool Building { get; set; } diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs index db07565..b105f77 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs @@ -114,6 +114,9 @@ namespace OpenSim.Region.Physics.OdePlugin // private bool m_collidesLand = true; private bool m_collidesWater; public bool m_returnCollisions; + private bool m_softcolide; + + private bool m_NoColide; // for now only for internal use for bad meshs // Default we're a Geometry private CollisionCategories m_collisionCategories = (CollisionCategories.Geom); @@ -224,6 +227,9 @@ namespace OpenSim.Region.Physics.OdePlugin cdata.mu = mu; cdata.bounce = bounce; + // cdata.softcolide = m_softcolide; + cdata.softcolide = false; + if (m_isphysical) { ODEDynamics veh; @@ -303,7 +309,10 @@ namespace OpenSim.Region.Physics.OdePlugin } if (m_colliderfilter == 0) + { + m_softcolide = false; m_iscolliding = false; + } else m_iscolliding = true; } @@ -859,7 +868,6 @@ namespace OpenSim.Region.Physics.OdePlugin _size = size; - if (!QuaternionIsFinite(rotation)) { rotation = Quaternion.Identity; @@ -890,6 +898,8 @@ namespace OpenSim.Region.Physics.OdePlugin m_iscolliding = false; m_colliderfilter = 0; + m_softcolide = true; + m_NoColide = false; hasOOBoffsetFromMesh = false; _triMeshData = IntPtr.Zero; @@ -1037,34 +1047,42 @@ namespace OpenSim.Region.Physics.OdePlugin if (vertexCount == 0 || indexCount == 0) { - m_log.WarnFormat("[PHYSICS]: Got invalid mesh on prim {0} at <{1},{2},{3}>. It can be a sculp with alpha channel in map. Replacing it by a small box.", Name, _position.X, _position.Y, _position.Z); - _size.X = 0.01f; - _size.Y = 0.01f; - _size.Z = 0.01f; + m_log.WarnFormat("[PHYSICS]: Got invalid mesh on prim {0} at <{1},{2},{3}>. mesh UUID {4}", + Name, _position.X, _position.Y, _position.Z, _pbs.SculptTexture.ToString()); + mesh.releaseSourceMeshData(); return false; } primOOBoffset = mesh.GetCentroid(); hasOOBoffsetFromMesh = true; - _triMeshData = d.GeomTriMeshDataCreate(); - - d.GeomTriMeshDataBuildSimple(_triMeshData, vertices, vertexStride, vertexCount, indices, indexCount, triStride); - d.GeomTriMeshDataPreprocess(_triMeshData); - mesh.releaseSourceMeshData(); - _parent_scene.waitForSpaceUnlock(m_targetSpace); + IntPtr geo = IntPtr.Zero; + try { - SetGeom(d.CreateTriMesh(m_targetSpace, _triMeshData, null, null, null)); + _triMeshData = d.GeomTriMeshDataCreate(); + + d.GeomTriMeshDataBuildSimple(_triMeshData, vertices, vertexStride, vertexCount, indices, indexCount, triStride); + d.GeomTriMeshDataPreprocess(_triMeshData); + + _parent_scene.waitForSpaceUnlock(m_targetSpace); + geo = d.CreateTriMesh(m_targetSpace, _triMeshData, null, null, null); } catch (Exception e) { m_log.ErrorFormat("[PHYSICS]: SetGeom Mesh failed for {0} exception: {1}", Name, e); + if (_triMeshData != IntPtr.Zero) + { + d.GeomTriMeshDataDestroy(_triMeshData); + _triMeshData = IntPtr.Zero; + } return false; } + + SetGeom(geo); return true; } @@ -1074,25 +1092,30 @@ namespace OpenSim.Region.Physics.OdePlugin //Console.WriteLine("SetGeom to " + prim_geom + " for " + Name); if (prim_geom != IntPtr.Zero) { - d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); - d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); + if (m_NoColide) + { + d.GeomSetCategoryBits(prim_geom, 0); + if (m_isphysical) + { + d.GeomSetCollideBits(prim_geom, (int)CollisionCategories.Land); + } + else + { + d.GeomSetCollideBits(prim_geom, 0); + d.GeomDisable(prim_geom); + } + } + else + { + d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); + } CalcPrimBodyData(); _parent_scene.geom_name_map[prim_geom] = Name; _parent_scene.actor_name_map[prim_geom] = this; - /* - if (childPrim) - { - if (_parent != null && _parent is OdePrim) - { - OdePrim parent = (OdePrim)_parent; - //Console.WriteLine("SetGeom calls ChildSetGeom"); - parent.ChildSetGeom(this); - } - } - */ } else m_log.Warn("Setting bad Geom"); @@ -1114,10 +1137,13 @@ namespace OpenSim.Region.Physics.OdePlugin bool haveMesh = false; hasOOBoffsetFromMesh = false; + m_NoColide = false; if (_parent_scene.needsMeshing(_pbs)) { haveMesh = setMesh(_parent_scene); // this will give a mesh to non trivial known prims + if (!haveMesh) + m_NoColide = true; } if (!haveMesh) @@ -1209,12 +1235,46 @@ namespace OpenSim.Region.Physics.OdePlugin { if (!childPrim && !m_isSelected) { - if (m_isphysical && Body != IntPtr.Zero && prim_geom != IntPtr.Zero) + if (m_isphysical && Body != IntPtr.Zero) { - d.GeomEnable(prim_geom); + m_collisionCategories |= CollisionCategories.Body; + m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); + foreach (OdePrim prm in childrenPrim) - d.GeomEnable(prm.prim_geom); + { + prm.m_collisionCategories = m_collisionCategories; + prm.m_collisionFlags = m_collisionFlags; + + if (prm.prim_geom != IntPtr.Zero) + { + if (prm.m_NoColide) + { + d.GeomSetCategoryBits(prm.prim_geom, 0); + d.GeomSetCollideBits(prm.prim_geom, (int)CollisionCategories.Land); + } + else + { + d.GeomSetCategoryBits(prm.prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prm.prim_geom, (int)m_collisionFlags); + } + d.GeomEnable(prm.prim_geom); + } + } + if (prim_geom != IntPtr.Zero) + { + if (m_NoColide) + { + d.GeomSetCategoryBits(prim_geom, 0); + d.GeomSetCollideBits(prim_geom, (int)CollisionCategories.Land); + } + else + { + d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); + } + d.GeomEnable(prim_geom); + } d.BodyEnable(Body); } } @@ -1227,11 +1287,47 @@ namespace OpenSim.Region.Physics.OdePlugin m_disabled = true; if (!childPrim) { - if (m_isphysical && Body != IntPtr.Zero && prim_geom != IntPtr.Zero) + if (m_isphysical && Body != IntPtr.Zero) { - d.GeomDisable(prim_geom); + m_collisionCategories &= ~CollisionCategories.Body; + m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); + foreach (OdePrim prm in childrenPrim) - d.GeomDisable(prm.prim_geom); + { + prm.m_collisionCategories = m_collisionCategories; + prm.m_collisionFlags = m_collisionFlags; + + if (prm.prim_geom != IntPtr.Zero) + { + if (prm.m_NoColide) + { + d.GeomSetCategoryBits(prm.prim_geom, 0); + d.GeomSetCollideBits(prm.prim_geom, 0); + } + else + { + d.GeomSetCategoryBits(prm.prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prm.prim_geom, (int)m_collisionFlags); + } + d.GeomDisable(prm.prim_geom); + } + } + + if (prim_geom != IntPtr.Zero) + { + if (m_NoColide) + { + d.GeomSetCategoryBits(prim_geom, 0); + d.GeomSetCollideBits(prim_geom, 0); + } + else + { + d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); + } + d.GeomDisable(prim_geom); + } + d.BodyDisable(Body); } } @@ -1310,8 +1406,6 @@ namespace OpenSim.Region.Physics.OdePlugin continue; } - - DMassCopy(ref prm.primdMass, ref tmpdmass); // apply prim current rotation to inertia @@ -1373,14 +1467,7 @@ namespace OpenSim.Region.Physics.OdePlugin // d.BodySetAngularDampingThreshold(Body, 0.001f); d.BodySetDamping(Body, .002f, .002f); - m_collisionCategories |= CollisionCategories.Body; - m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); - d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); - d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); - m_collisionscore = 0; -// if (m_targetSpace != _parent_scene.ActiveSpace) - { if (m_targetSpace != IntPtr.Zero) { _parent_scene.waitForSpaceUnlock(m_targetSpace); @@ -1388,10 +1475,6 @@ namespace OpenSim.Region.Physics.OdePlugin d.SpaceRemove(m_targetSpace, prim_geom); } -// m_targetSpace = _parent_scene.ActiveSpace; -// d.SpaceAdd(m_targetSpace, prim_geom); - } - if (childrenPrim.Count == 0) { @@ -1419,12 +1502,6 @@ namespace OpenSim.Region.Physics.OdePlugin Vector3 ppos = prm._position; d.GeomSetOffsetWorldPosition(prm.prim_geom, ppos.X, ppos.Y, ppos.Z); // set relative position - prm.m_collisionCategories |= CollisionCategories.Body; - prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); - d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories); - d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags); - prm.m_collisionscore = 0; - if (prm.m_targetSpace != m_targetSpace) { if (prm.m_targetSpace != IntPtr.Zero) @@ -1438,9 +1515,32 @@ namespace OpenSim.Region.Physics.OdePlugin } if (m_isSelected || m_disabled) + { + prm.m_collisionCategories &= ~CollisionCategories.Body; + prm.m_collisionFlags &= ~(CollisionCategories.Land | CollisionCategories.Wind); d.GeomDisable(prm.prim_geom); + } + else + { + prm.m_collisionCategories |= CollisionCategories.Body; + prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); + } + + if (prm.m_NoColide) + { + d.GeomSetCategoryBits(prm.prim_geom, 0); + d.GeomSetCollideBits(prm.prim_geom, (int)CollisionCategories.Land); + } + else + { + d.GeomSetCategoryBits(prm.prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prm.prim_geom, (int)m_collisionFlags); + } + prm.m_collisionscore = 0; + + if(!m_disabled) + prm.m_disabled = false; - prm.m_disabled = false; _parent_scene.addActivePrim(prm); } } @@ -1453,15 +1553,35 @@ namespace OpenSim.Region.Physics.OdePlugin if (m_isSelected || m_disabled) { + m_collisionCategories &= ~CollisionCategories.Body; + m_collisionFlags &= ~(CollisionCategories.Land | CollisionCategories.Wind); + d.GeomDisable(prim_geom); d.BodyDisable(Body); } else { + m_collisionCategories |= CollisionCategories.Body; + m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); + d.BodySetAngularVel(Body, m_rotationalVelocity.X, m_rotationalVelocity.Y, m_rotationalVelocity.Z); d.BodySetLinearVel(Body, _velocity.X, _velocity.Y, _velocity.Z); } + if (m_NoColide) + { + d.GeomSetCategoryBits(prim_geom, 0); + d.GeomSetCollideBits(prim_geom, (int)CollisionCategories.Land); + } + else + { + d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); + } + + m_collisionscore = 0; + + m_softcolide = true; _parent_scene.addActivePrim(this); _parent_scene.addActiveGroups(this); } @@ -1475,8 +1595,16 @@ namespace OpenSim.Region.Physics.OdePlugin m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); if (prim_geom != IntPtr.Zero) { - d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); - d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); + if (m_NoColide) + { + d.GeomSetCategoryBits(prim_geom, 0); + d.GeomSetCollideBits(prim_geom, 0); + } + else + { + d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); + } UpdateDataFromGeom(); d.GeomSetBody(prim_geom, IntPtr.Zero); SetInStaticSpace(this); @@ -1489,12 +1617,20 @@ namespace OpenSim.Region.Physics.OdePlugin foreach (OdePrim prm in childrenPrim) { _parent_scene.remActivePrim(prm); - prm.m_collisionCategories &= ~CollisionCategories.Body; - prm.m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); + prm.m_collisionCategories = m_collisionCategories; + prm.m_collisionFlags = m_collisionFlags; if (prm.prim_geom != IntPtr.Zero) { - d.GeomSetCategoryBits(prm.prim_geom, (int)m_collisionCategories); - d.GeomSetCollideBits(prm.prim_geom, (int)m_collisionFlags); + if (prm.m_NoColide) + { + d.GeomSetCategoryBits(prm.prim_geom, 0); + d.GeomSetCollideBits(prm.prim_geom, 0); + } + else + { + d.GeomSetCategoryBits(prm.prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prm.prim_geom, (int)m_collisionFlags); + } prm.UpdateDataFromGeom(); SetInStaticSpace(prm); } @@ -2044,23 +2180,14 @@ namespace OpenSim.Region.Physics.OdePlugin myrot.Z = _orientation.Z; myrot.W = _orientation.W; d.GeomSetQuaternion(prim_geom, ref myrot); - // _parent_scene.actor_name_map[prim_geom] = (PhysicsActor)this; + if (!m_isphysical) SetInStaticSpace(this); } if (m_isphysical && Body == IntPtr.Zero) { - /* - if (_pbs.SculptEntry && _parent_scene.meshSculptedPrim) - { - changeShape(_pbs); - } - else - { - */ MakeBody(); - // } } } @@ -2169,17 +2296,52 @@ namespace OpenSim.Region.Physics.OdePlugin if (!childPrim && Body != IntPtr.Zero) d.BodyDisable(Body); - if (m_delaySelect) + if (m_delaySelect || m_isphysical) { + m_collisionCategories = CollisionCategories.Selected; + m_collisionFlags = (CollisionCategories.Sensor | CollisionCategories.Space); + if (!childPrim) { foreach (OdePrim prm in childrenPrim) { - d.GeomDisable(prm.prim_geom); + prm.m_collisionCategories = m_collisionCategories; + prm.m_collisionFlags = m_collisionFlags; + + if (prm.prim_geom != null) + { + + if (prm.m_NoColide) + { + d.GeomSetCategoryBits(prm.prim_geom, 0); + d.GeomSetCollideBits(prm.prim_geom, 0); + } + else + { + d.GeomSetCategoryBits(prm.prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prm.prim_geom, (int)m_collisionFlags); + } + d.GeomDisable(prm.prim_geom); + } prm.m_delaySelect = false; } } - d.GeomDisable(prim_geom); + + if (prim_geom != null) + { + if (m_NoColide) + { + d.GeomSetCategoryBits(prim_geom, 0); + d.GeomSetCollideBits(prim_geom, 0); + } + else + { + d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); + } + d.GeomDisable(prim_geom); + } + m_delaySelect = false; } else @@ -2192,19 +2354,64 @@ namespace OpenSim.Region.Physics.OdePlugin if (!childPrim && Body != IntPtr.Zero && !m_disabled) d.BodyEnable(Body); + m_collisionCategories = CollisionCategories.Geom; + if (m_isphysical) + m_collisionCategories |= CollisionCategories.Body; + + m_collisionFlags = m_default_collisionFlags | CollisionCategories.Land; + + if (m_collidesWater) + m_collisionFlags |= CollisionCategories.Water; + if (!childPrim) { foreach (OdePrim prm in childrenPrim) { - if(!prm.m_disabled) + prm.m_collisionCategories = m_collisionCategories; + prm.m_collisionFlags = m_collisionFlags; + + if (!prm.m_disabled && prm.prim_geom != IntPtr.Zero) + { + if (prm.m_NoColide) + { + d.GeomSetCategoryBits(prm.prim_geom, 0); + if (m_isphysical) + d.GeomSetCollideBits(prm.prim_geom, (int)CollisionCategories.Land); + else + d.GeomSetCollideBits(prm.prim_geom, 0); + } + else + { + d.GeomSetCategoryBits(prm.prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prm.prim_geom, (int)m_collisionFlags); + } d.GeomEnable(prm.prim_geom); + } prm.m_delaySelect = false; + prm.m_softcolide = true; } } - if(!m_disabled) + + if (!m_disabled && prim_geom != IntPtr.Zero) + { + if (m_NoColide) + { + d.GeomSetCategoryBits(prim_geom, 0); + if (m_isphysical) + d.GeomSetCollideBits(prim_geom, (int)CollisionCategories.Land); + else + d.GeomSetCollideBits(prim_geom, 0); + } + else + { + d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); + } d.GeomEnable(prim_geom); + } m_delaySelect = false; + m_softcolide = true; } resetCollisionAccounting(); @@ -2250,6 +2457,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (givefakepos < 0) givefakepos = 0; // changeSelectedStatus(); + m_softcolide = true; resetCollisionAccounting(); } @@ -2302,6 +2510,7 @@ namespace OpenSim.Region.Physics.OdePlugin givefakeori--; if (givefakeori < 0) givefakeori = 0; + m_softcolide = true; resetCollisionAccounting(); } @@ -2372,6 +2581,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (givefakeori < 0) givefakeori = 0; + m_softcolide = true; resetCollisionAccounting(); } @@ -2488,6 +2698,7 @@ namespace OpenSim.Region.Physics.OdePlugin else MakeBody(); + m_softcolide = true; resetCollisionAccounting(); } diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs index 884a5a7..14516f9 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs @@ -693,8 +693,8 @@ namespace OpenSim.Region.Physics.OdePlugin // big messy collision analises float mu = 0; float bounce = 0; - ContactData contactdata1 = new ContactData(0, 0); - ContactData contactdata2 = new ContactData(0, 0); + ContactData contactdata1 = new ContactData(0, 0, false); + ContactData contactdata2 = new ContactData(0, 0, false); bool erpSoft = false; String name = null; @@ -718,6 +718,7 @@ namespace OpenSim.Region.Physics.OdePlugin if ((Math.Abs(p2.Velocity.X - p1.Velocity.X) > 0.1f || Math.Abs(p2.Velocity.Y - p1.Velocity.Y) > 0.1f)) mu *= frictionMovementMult; + erpSoft = contactdata1.softcolide | contactdata2.softcolide; p1.CollidingObj = true; p2.CollidingObj = true; break; @@ -732,6 +733,9 @@ namespace OpenSim.Region.Physics.OdePlugin mu *= frictionMovementMult; if (p2.Velocity.LengthSquared() > 0.0f) p2.CollidingObj = true; + + erpSoft = contactdata1.softcolide | contactdata2.softcolide; + dop1foot = true; break; default: @@ -753,6 +757,7 @@ namespace OpenSim.Region.Physics.OdePlugin if ((Math.Abs(p2.Velocity.X - p1.Velocity.X) > 0.1f || Math.Abs(p2.Velocity.Y - p1.Velocity.Y) > 0.1f)) mu *= frictionMovementMult; + erpSoft = contactdata1.softcolide | contactdata2.softcolide; dop2foot = true; if (p1.Velocity.LengthSquared() > 0.0f) p1.CollidingObj = true; @@ -766,7 +771,7 @@ namespace OpenSim.Region.Physics.OdePlugin p1.getContactData(ref contactdata1); p2.getContactData(ref contactdata2); bounce = contactdata1.bounce * contactdata2.bounce; - erpSoft = true; + erpSoft = contactdata1.softcolide | contactdata2.softcolide; mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu); if ((Math.Abs(p2.Velocity.X - p1.Velocity.X) > 0.1f || Math.Abs(p2.Velocity.Y - p1.Velocity.Y) > 0.1f)) @@ -778,12 +783,12 @@ namespace OpenSim.Region.Physics.OdePlugin { if (name == "Terrain") { - erpSoft = true; p1.getContactData(ref contactdata1); bounce = contactdata1.bounce * TerrainBounce; mu = (float)Math.Sqrt(contactdata1.mu * TerrainFriction); if (Math.Abs(p1.Velocity.X) > 0.1f || Math.Abs(p1.Velocity.Y) > 0.1f) mu *= frictionMovementMult; + erpSoft = contactdata1.softcolide; p1.CollidingGround = true; } else if (name == "Water") @@ -804,11 +809,11 @@ namespace OpenSim.Region.Physics.OdePlugin { if (p2.PhysicsActorType == (int)ActorTypes.Prim) { - erpSoft = true; p2.CollidingGround = true; p2.getContactData(ref contactdata2); bounce = contactdata2.bounce * TerrainBounce; mu = (float)Math.Sqrt(contactdata2.mu * TerrainFriction); + erpSoft = contactdata2.softcolide; if (Math.Abs(p2.Velocity.X) > 0.1f || Math.Abs(p2.Velocity.Y) > 0.1f) mu *= frictionMovementMult; -- cgit v1.1