From ea36d4a4cf716442e83cc9cd1b419a43be5adc6e Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Wed, 1 Aug 2012 15:04:09 -0700 Subject: BulletSim: Add AddObjectForce to BulletSim API. Add interface 2 enhancements to BSCharacter. Modify AddForce and SetForce to use the new Bullet interface. More DetailLog statements for character. --- .../Region/Physics/BulletSPlugin/BSCharacter.cs | 26 ++++++++++++++++--- OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | 29 +++++++++------------- .../Region/Physics/BulletSPlugin/BulletSimAPI.cs | 3 +++ 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index 09e1f0c..a5635ff 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs @@ -40,6 +40,7 @@ public class BSCharacter : PhysicsActor private static readonly string LogHeader = "[BULLETS CHAR]"; private BSScene _scene; + public BSScene Scene { get { return _scene; } } private String _avName; // private bool _stopped; private Vector3 _size; @@ -73,6 +74,12 @@ public class BSCharacter : PhysicsActor private bool _kinematic; private float _buoyancy; + private BulletBody m_body; + public BulletBody Body { + get { return m_body; } + set { m_body = value; } + } + private int _subscribedEventsMs = 0; private int _nextCollisionOkTime = 0; @@ -116,6 +123,8 @@ public class BSCharacter : PhysicsActor _scene.TaintedObject(delegate() { BulletSimAPI.CreateObject(parent_scene.WorldID, shapeData); + + m_body = new BulletBody(LocalID, BulletSimAPI.GetBodyHandle2(_scene.World.Ptr, LocalID)); }); return; @@ -124,6 +133,7 @@ public class BSCharacter : PhysicsActor // called when this character is being destroyed and the resources should be released public void Destroy() { + // DetailLog("{0},Destroy", LocalID); _scene.TaintedObject(delegate() { BulletSimAPI.DestroyObject(_scene.WorldID, _localID); @@ -174,6 +184,7 @@ public class BSCharacter : PhysicsActor _position = value; _scene.TaintedObject(delegate() { + DetailLog("{0},SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation); BulletSimAPI.SetObjectTranslation(_scene.WorldID, _localID, _position, _orientation); }); } @@ -188,9 +199,10 @@ public class BSCharacter : PhysicsActor set { _force = value; // m_log.DebugFormat("{0}: Force = {1}", LogHeader, _force); - _scene.TaintedObject(delegate() + Scene.TaintedObject(delegate() { - BulletSimAPI.SetObjectForce(_scene.WorldID, _localID, _force); + DetailLog("{0},setForce,taint,force={1}", LocalID, _force); + BulletSimAPI.SetObjectForce(Scene.WorldID, LocalID, _force); }); } } @@ -216,6 +228,7 @@ public class BSCharacter : PhysicsActor // m_log.DebugFormat("{0}: set velocity = {1}", LogHeader, _velocity); _scene.TaintedObject(delegate() { + DetailLog("{0},setVelocity,taint,vel={1}", LocalID, _velocity); BulletSimAPI.SetObjectVelocity(_scene.WorldID, _localID, _velocity); }); } @@ -305,6 +318,7 @@ public class BSCharacter : PhysicsActor set { _buoyancy = value; _scene.TaintedObject(delegate() { + DetailLog("{0},setBuoyancy,taint,buoy={1}", LocalID, _buoyancy); BulletSimAPI.SetObjectBuoyancy(_scene.WorldID, LocalID, _buoyancy); }); } @@ -351,7 +365,8 @@ public class BSCharacter : PhysicsActor // m_log.DebugFormat("{0}: AddForce. adding={1}, newForce={2}", LogHeader, force, _force); _scene.TaintedObject(delegate() { - BulletSimAPI.SetObjectForce(_scene.WorldID, _localID, _force); + DetailLog("{0},setAddForce,taint,addedForce={1}", LocalID, _force); + BulletSimAPI.AddObjectForce2(Body.Ptr, _force); }); } else @@ -480,5 +495,10 @@ public class BSCharacter : PhysicsActor // End kludge } + // Invoke the detailed logger and output something if it's enabled. + private void DetailLog(string msg, params Object[] args) + { + Scene.PhysicsLogging.Write(msg, args); + } } } diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index ebfd85b..22f5995 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs @@ -187,7 +187,7 @@ public sealed class BSPrim : PhysicsActor { _mass = CalculateMass(); // changing size changes the mass BulletSimAPI.SetObjectScaleMass(_scene.WorldID, _localID, _scale, (IsPhysical ? _mass : 0f), IsPhysical); - DetailLog("{0}: setSize: size={1}, mass={2}, physical={3}", LocalID, _size, _mass, IsPhysical); + // DetailLog("{0}: setSize: size={1}, mass={2}, physical={3}", LocalID, _size, _mass, IsPhysical); RecreateGeomAndObject(); }); } @@ -318,7 +318,7 @@ public sealed class BSPrim : PhysicsActor _force = value; _scene.TaintedObject(delegate() { - DetailLog("{0},SetForce,taint,force={1}", LocalID, _force); + DetailLog("{0},setForce,taint,force={1}", LocalID, _force); // BulletSimAPI.SetObjectForce(_scene.WorldID, _localID, _force); BulletSimAPI.SetObjectForce2(Body.Ptr, _force); }); @@ -443,7 +443,7 @@ public sealed class BSPrim : PhysicsActor _scene.TaintedObject(delegate() { // _position = BulletSimAPI.GetObjectPosition(_scene.WorldID, _localID); - DetailLog("{0},SetOrientation,taint,pos={1},orient={2}", LocalID, _position, _orientation); + DetailLog("{0},setOrientation,taint,pos={1},orient={2}", LocalID, _position, _orientation); BulletSimAPI.SetObjectTranslation(_scene.WorldID, _localID, _position, _orientation); }); } @@ -487,10 +487,8 @@ public sealed class BSPrim : PhysicsActor // Maybe a VerifyCorrectPhysicalShape() routine? // RecreateGeomAndObject(); - float mass = _mass; - // Bullet wants static objects have a mass of zero - if (IsStatic) - mass = 0f; + // Bullet wants static objects to have a mass of zero + float mass = IsStatic ? 0f : _mass; DetailLog("{0},SetObjectDynamic,taint,static={1},solid={2},mass={3}", LocalID, IsStatic, IsSolid, mass); BulletSimAPI.SetObjectProperties(_scene.WorldID, LocalID, IsStatic, IsSolid, SubscribedEvents(), mass); @@ -607,6 +605,7 @@ public sealed class BSPrim : PhysicsActor private List m_accumulatedForces = new List(); public override void AddForce(OMV.Vector3 force, bool pushforce) { + // for an object, doesn't matter if force is a pushforce or not if (force.IsFinite()) { // _force += force; @@ -620,21 +619,17 @@ public sealed class BSPrim : PhysicsActor } _scene.TaintedObject(delegate() { + OMV.Vector3 fSum = OMV.Vector3.Zero; lock (m_accumulatedForces) { - if (m_accumulatedForces.Count > 0) + foreach (OMV.Vector3 v in m_accumulatedForces) { - OMV.Vector3 fSum = OMV.Vector3.Zero; - foreach (OMV.Vector3 v in m_accumulatedForces) - { - fSum += v; - } - m_accumulatedForces.Clear(); - - DetailLog("{0},SetObjectForce,taint,force={1}", LocalID, fSum); - BulletSimAPI.SetObjectForce(_scene.WorldID, _localID, fSum); + fSum += v; } + m_accumulatedForces.Clear(); } + DetailLog("{0},AddObjectForce,taint,force={1}", LocalID, _force); + BulletSimAPI.AddObjectForce2(Body.Ptr, fSum); }); } diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs b/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs index 0ffbc94..1881e41 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs @@ -448,6 +448,9 @@ public static extern bool SetAngularVelocity2(IntPtr obj, Vector3 angularVelocit public static extern bool SetObjectForce2(IntPtr obj, Vector3 force); [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] +public static extern bool AddObjectForce2(IntPtr obj, Vector3 force); + +[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] public static extern bool SetCcdMotionThreshold2(IntPtr obj, float val); [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] -- cgit v1.1