aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
diff options
context:
space:
mode:
authorRobert Adams2012-07-25 10:33:36 -0700
committerRobert Adams2012-07-25 16:30:50 -0700
commit5707e171f4c231b58ff683d49fee55e4ccbb317f (patch)
tree95539e7115710f04f01b8521af83934de0052442 /OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
parentMove Watchdog and MemoryWatchdog classes into OpenSim.Framework.Monitoring wi... (diff)
downloadopensim-SC_OLD-5707e171f4c231b58ff683d49fee55e4ccbb317f.zip
opensim-SC_OLD-5707e171f4c231b58ff683d49fee55e4ccbb317f.tar.gz
opensim-SC_OLD-5707e171f4c231b58ff683d49fee55e4ccbb317f.tar.bz2
opensim-SC_OLD-5707e171f4c231b58ff683d49fee55e4ccbb317f.tar.xz
BulletSim: Move constraint tracking from C++ code to C# code
for more flexibility.
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs53
1 files changed, 37 insertions, 16 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index a19d6d7..ff87955 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -97,6 +97,9 @@ public sealed class BSPrim : PhysicsActor
97 long _collidingStep; 97 long _collidingStep;
98 long _collidingGroundStep; 98 long _collidingGroundStep;
99 99
100 private BulletBody m_body;
101 public BulletBody Body { get { return m_body; } }
102
100 private BSDynamics _vehicle; 103 private BSDynamics _vehicle;
101 104
102 private OMV.Vector3 _PIDTarget; 105 private OMV.Vector3 _PIDTarget;
@@ -138,6 +141,11 @@ public sealed class BSPrim : PhysicsActor
138 _scene.TaintedObject(delegate() 141 _scene.TaintedObject(delegate()
139 { 142 {
140 RecreateGeomAndObject(); 143 RecreateGeomAndObject();
144
145 // Get the pointer to the physical body for this object.
146 // At the moment, we're still letting BulletSim manage the creation and destruction
147 // of the object. Someday we'll move that into the C# code.
148 m_body = new BulletBody(LocalID, BulletSimAPI.GetBodyHandle2(_scene.World.Ptr, LocalID));
141 }); 149 });
142 } 150 }
143 151
@@ -161,7 +169,7 @@ public sealed class BSPrim : PhysicsActor
161 _parentPrim = null; 169 _parentPrim = null;
162 } 170 }
163 171
164 // make sure there are no possible children depending on me 172 // make sure there are no other prims are linked to me
165 UnlinkAllChildren(); 173 UnlinkAllChildren();
166 174
167 // everything in the C# world will get garbage collected. Tell the C++ world to free stuff. 175 // everything in the C# world will get garbage collected. Tell the C++ world to free stuff.
@@ -333,11 +341,11 @@ public sealed class BSPrim : PhysicsActor
333 _rotationalVelocity = OMV.Vector3.Zero; 341 _rotationalVelocity = OMV.Vector3.Zero;
334 342
335 // Zero some other properties directly into the physics engine 343 // Zero some other properties directly into the physics engine
336 IntPtr obj = BulletSimAPI.GetBodyHandleWorldID2(_scene.WorldID, LocalID); 344 BulletBody obj = new BulletBody(LocalID, BulletSimAPI.GetBodyHandleWorldID2(_scene.WorldID, LocalID));
337 BulletSimAPI.SetVelocity2(obj, OMV.Vector3.Zero); 345 BulletSimAPI.SetVelocity2(obj.Ptr, OMV.Vector3.Zero);
338 BulletSimAPI.SetAngularVelocity2(obj, OMV.Vector3.Zero); 346 BulletSimAPI.SetAngularVelocity2(obj.Ptr, OMV.Vector3.Zero);
339 BulletSimAPI.SetInterpolation2(obj, OMV.Vector3.Zero, OMV.Vector3.Zero); 347 BulletSimAPI.SetInterpolation2(obj.Ptr, OMV.Vector3.Zero, OMV.Vector3.Zero);
340 BulletSimAPI.ClearForces2(obj); 348 BulletSimAPI.ClearForces2(obj.Ptr);
341 } 349 }
342 350
343 public override void LockAngularMotion(OMV.Vector3 axis) 351 public override void LockAngularMotion(OMV.Vector3 axis)
@@ -383,7 +391,8 @@ public sealed class BSPrim : PhysicsActor
383 _scene.TaintedObject(delegate() 391 _scene.TaintedObject(delegate()
384 { 392 {
385 DetailLog("{0},SetForce,taint,force={1}", LocalID, _force); 393 DetailLog("{0},SetForce,taint,force={1}", LocalID, _force);
386 BulletSimAPI.SetObjectForce(_scene.WorldID, _localID, _force); 394 // BulletSimAPI.SetObjectForce(_scene.WorldID, _localID, _force);
395 BulletSimAPI.SetObjectForce2(Body.Ptr, _force);
387 }); 396 });
388 } 397 }
389 } 398 }
@@ -407,8 +416,7 @@ public sealed class BSPrim : PhysicsActor
407 _scene.TaintedObject(delegate() 416 _scene.TaintedObject(delegate()
408 { 417 {
409 // Tell the physics engine to clear state 418 // Tell the physics engine to clear state
410 IntPtr obj = BulletSimAPI.GetBodyHandleWorldID2(_scene.WorldID, LocalID); 419 BulletSimAPI.ClearForces2(this.Body.Ptr);
411 BulletSimAPI.ClearForces2(obj);
412 }); 420 });
413 421
414 // make it so the scene will call us each tick to do vehicle things 422 // make it so the scene will call us each tick to do vehicle things
@@ -420,7 +428,6 @@ public sealed class BSPrim : PhysicsActor
420 } 428 }
421 public override void VehicleFloatParam(int param, float value) 429 public override void VehicleFloatParam(int param, float value)
422 { 430 {
423 m_log.DebugFormat("{0} VehicleFloatParam. {1} <= {2}", LogHeader, param, value);
424 _scene.TaintedObject(delegate() 431 _scene.TaintedObject(delegate()
425 { 432 {
426 _vehicle.ProcessFloatVehicleParam((Vehicle)param, value, _scene.LastSimulatedTimestep); 433 _vehicle.ProcessFloatVehicleParam((Vehicle)param, value, _scene.LastSimulatedTimestep);
@@ -428,7 +435,6 @@ public sealed class BSPrim : PhysicsActor
428 } 435 }
429 public override void VehicleVectorParam(int param, OMV.Vector3 value) 436 public override void VehicleVectorParam(int param, OMV.Vector3 value)
430 { 437 {
431 m_log.DebugFormat("{0} VehicleVectorParam. {1} <= {2}", LogHeader, param, value);
432 _scene.TaintedObject(delegate() 438 _scene.TaintedObject(delegate()
433 { 439 {
434 _vehicle.ProcessVectorVehicleParam((Vehicle)param, value, _scene.LastSimulatedTimestep); 440 _vehicle.ProcessVectorVehicleParam((Vehicle)param, value, _scene.LastSimulatedTimestep);
@@ -436,7 +442,6 @@ public sealed class BSPrim : PhysicsActor
436 } 442 }
437 public override void VehicleRotationParam(int param, OMV.Quaternion rotation) 443 public override void VehicleRotationParam(int param, OMV.Quaternion rotation)
438 { 444 {
439 m_log.DebugFormat("{0} VehicleRotationParam. {1} <= {2}", LogHeader, param, rotation);
440 _scene.TaintedObject(delegate() 445 _scene.TaintedObject(delegate()
441 { 446 {
442 _vehicle.ProcessRotationVehicleParam((Vehicle)param, rotation); 447 _vehicle.ProcessRotationVehicleParam((Vehicle)param, rotation);
@@ -444,7 +449,6 @@ public sealed class BSPrim : PhysicsActor
444 } 449 }
445 public override void VehicleFlags(int param, bool remove) 450 public override void VehicleFlags(int param, bool remove)
446 { 451 {
447 m_log.DebugFormat("{0} VehicleFlags. {1}. Remove={2}", LogHeader, param, remove);
448 _scene.TaintedObject(delegate() 452 _scene.TaintedObject(delegate()
449 { 453 {
450 _vehicle.ProcessVehicleFlags(param, remove); 454 _vehicle.ProcessVehicleFlags(param, remove);
@@ -1296,7 +1300,7 @@ public sealed class BSPrim : PhysicsActor
1296 1300
1297 // remove any constraints that might be in place 1301 // remove any constraints that might be in place
1298 DebugLog("{0}: CreateLinkset: RemoveConstraints between me and any children", LogHeader, LocalID); 1302 DebugLog("{0}: CreateLinkset: RemoveConstraints between me and any children", LogHeader, LocalID);
1299 BulletSimAPI.RemoveConstraintByID(_scene.WorldID, LocalID); 1303 UnlinkAllChildren();
1300 1304
1301 // create constraints between the root prim and each of the children 1305 // create constraints between the root prim and each of the children
1302 foreach (BSPrim prim in _childrenPrims) 1306 foreach (BSPrim prim in _childrenPrims)
@@ -1323,6 +1327,7 @@ public sealed class BSPrim : PhysicsActor
1323 // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818 1327 // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818
1324 DebugLog("{0}: CreateLinkset: Adding a constraint between root prim {1} and child prim {2}", LogHeader, LocalID, childPrim.LocalID); 1328 DebugLog("{0}: CreateLinkset: Adding a constraint between root prim {1} and child prim {2}", LogHeader, LocalID, childPrim.LocalID);
1325 DetailLog("{0},LinkAChildToMe,taint,root={1},child={2}", LocalID, LocalID, childPrim.LocalID); 1329 DetailLog("{0},LinkAChildToMe,taint,root={1},child={2}", LocalID, LocalID, childPrim.LocalID);
1330 /*
1326 BulletSimAPI.AddConstraint(_scene.WorldID, LocalID, childPrim.LocalID, 1331 BulletSimAPI.AddConstraint(_scene.WorldID, LocalID, childPrim.LocalID,
1327 childRelativePosition, 1332 childRelativePosition,
1328 childRelativeRotation, 1333 childRelativeRotation,
@@ -1330,6 +1335,20 @@ public sealed class BSPrim : PhysicsActor
1330 OMV.Quaternion.Identity, 1335 OMV.Quaternion.Identity,
1331 OMV.Vector3.Zero, OMV.Vector3.Zero, 1336 OMV.Vector3.Zero, OMV.Vector3.Zero,
1332 OMV.Vector3.Zero, OMV.Vector3.Zero); 1337 OMV.Vector3.Zero, OMV.Vector3.Zero);
1338 */
1339 // BSConstraint constrain = new BSConstraint(_scene.World, this.Body, childPrim.Body,
1340 BSConstraint constrain = _scene.Constraints.CreateConstraint(
1341 _scene.World, this.Body, childPrim.Body,
1342 childRelativePosition,
1343 childRelativeRotation,
1344 OMV.Vector3.Zero,
1345 OMV.Quaternion.Identity);
1346 constrain.SetLinearLimits(OMV.Vector3.Zero, OMV.Vector3.Zero);
1347 constrain.SetAngularLimits(OMV.Vector3.Zero, OMV.Vector3.Zero);
1348
1349 // tweek the constraint to increase stability
1350 constrain.UseFrameOffset(true);
1351 constrain.TranslationalLimitMotor(true, 5f, 0.1f);
1333 } 1352 }
1334 1353
1335 // Remove linkage between myself and a particular child 1354 // Remove linkage between myself and a particular child
@@ -1339,7 +1358,8 @@ public sealed class BSPrim : PhysicsActor
1339 DebugLog("{0}: UnlinkAChildFromMe: RemoveConstraint between root prim {1} and child prim {2}", 1358 DebugLog("{0}: UnlinkAChildFromMe: RemoveConstraint between root prim {1} and child prim {2}",
1340 LogHeader, LocalID, childPrim.LocalID); 1359 LogHeader, LocalID, childPrim.LocalID);
1341 DetailLog("{0},UnlinkAChildFromMe,taint,root={1},child={2}", LocalID, LocalID, childPrim.LocalID); 1360 DetailLog("{0},UnlinkAChildFromMe,taint,root={1},child={2}", LocalID, LocalID, childPrim.LocalID);
1342 BulletSimAPI.RemoveConstraint(_scene.WorldID, LocalID, childPrim.LocalID); 1361 // BulletSimAPI.RemoveConstraint(_scene.WorldID, LocalID, childPrim.LocalID);
1362 _scene.Constraints.RemoveAndDestroyConstraint(this.Body, childPrim.Body);
1343 } 1363 }
1344 1364
1345 // Remove linkage between myself and any possible children I might have 1365 // Remove linkage between myself and any possible children I might have
@@ -1348,7 +1368,8 @@ public sealed class BSPrim : PhysicsActor
1348 { 1368 {
1349 DebugLog("{0}: UnlinkAllChildren:", LogHeader); 1369 DebugLog("{0}: UnlinkAllChildren:", LogHeader);
1350 DetailLog("{0},UnlinkAllChildren,taint", LocalID); 1370 DetailLog("{0},UnlinkAllChildren,taint", LocalID);
1351 BulletSimAPI.RemoveConstraintByID(_scene.WorldID, LocalID); 1371 _scene.Constraints.RemoveAndDestroyConstraint(this.Body);
1372 // BulletSimAPI.RemoveConstraintByID(_scene.WorldID, LocalID);
1352 } 1373 }
1353 1374
1354 #endregion // Linkset creation and destruction 1375 #endregion // Linkset creation and destruction