aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs52
1 files changed, 16 insertions, 36 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index 1754be6..af403aa 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -173,20 +173,16 @@ public sealed class BSPrim : BSPhysObject
173 } 173 }
174 // Whatever the linkset wants is what I want. 174 // Whatever the linkset wants is what I want.
175 public override ShapeData.PhysicsShapeType PreferredPhysicalShape 175 public override ShapeData.PhysicsShapeType PreferredPhysicalShape
176 { get { return Linkset.PreferredPhysicalShape; } } 176 { get { return Linkset.PreferredPhysicalShape(this); } }
177 177
178 public override bool ForceBodyShapeRebuild(bool inTaintTime) 178 public override bool ForceBodyShapeRebuild(bool inTaintTime)
179 { 179 {
180 LastAssetBuildFailed = false; 180 LastAssetBuildFailed = false;
181 BSScene.TaintCallback rebuildOperation = delegate() 181 PhysicsScene.TaintedObject(inTaintTime, "BSPrim.ForceBodyShapeRebuild", delegate()
182 { 182 {
183 _mass = CalculateMass(); // changing the shape changes the mass 183 _mass = CalculateMass(); // changing the shape changes the mass
184 CreateGeomAndObject(true); 184 CreateGeomAndObject(true);
185 }; 185 });
186 if (inTaintTime)
187 rebuildOperation();
188 else
189 PhysicsScene.TaintedObject("BSPrim.ForceBodyShapeRebuild", rebuildOperation);
190 return true; 186 return true;
191 } 187 }
192 public override bool Grabbed { 188 public override bool Grabbed {
@@ -263,9 +259,9 @@ public sealed class BSPrim : BSPhysObject
263 } 259 }
264 public override OMV.Vector3 Position { 260 public override OMV.Vector3 Position {
265 get { 261 get {
262 // child prims move around based on their parent. Need to get the latest location
266 if (!Linkset.IsRoot(this)) 263 if (!Linkset.IsRoot(this))
267 // child prims move around based on their parent. Need to get the latest location 264 _position = Linkset.Position(this);
268 _position = BulletSimAPI.GetPosition2(PhysBody.ptr);
269 265
270 // don't do the GetObjectPosition for root elements because this function is called a zillion times 266 // don't do the GetObjectPosition for root elements because this function is called a zillion times
271 // _position = BulletSimAPI.GetObjectPosition2(PhysicsScene.World.ptr, BSBody.ptr); 267 // _position = BulletSimAPI.GetObjectPosition2(PhysicsScene.World.ptr, BSBody.ptr);
@@ -344,16 +340,11 @@ public sealed class BSPrim : BSPhysObject
344 { 340 {
345 // The new position value must be pushed into the physics engine but we can't 341 // The new position value must be pushed into the physics engine but we can't
346 // just assign to "Position" because of potential call loops. 342 // just assign to "Position" because of potential call loops.
347 BSScene.TaintCallback sanityOperation = delegate() 343 PhysicsScene.TaintedObject(inTaintTime, "BSPrim.PositionSanityCheck", delegate()
348 { 344 {
349 DetailLog("{0},BSPrim.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation); 345 DetailLog("{0},BSPrim.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation);
350 ForcePosition = _position; 346 ForcePosition = _position;
351 }; 347 });
352 if (inTaintTime)
353 sanityOperation();
354 else
355 PhysicsScene.TaintedObject("BSPrim.PositionSanityCheck", sanityOperation);
356
357 ret = true; 348 ret = true;
358 } 349 }
359 return ret; 350 return ret;
@@ -542,10 +533,10 @@ public sealed class BSPrim : BSPhysObject
542 } 533 }
543 public override OMV.Quaternion Orientation { 534 public override OMV.Quaternion Orientation {
544 get { 535 get {
536 // Children move around because tied to parent. Get a fresh value.
545 if (!Linkset.IsRoot(this)) 537 if (!Linkset.IsRoot(this))
546 { 538 {
547 // Children move around because tied to parent. Get a fresh value. 539 _orientation = Linkset.Orientation(this);
548 _orientation = BulletSimAPI.GetOrientation2(PhysBody.ptr);
549 } 540 }
550 return _orientation; 541 return _orientation;
551 } 542 }
@@ -946,7 +937,7 @@ public sealed class BSPrim : BSPhysObject
946 m_log.WarnFormat("{0}: Got a NaN force applied to a prim. LocalID={1}", LogHeader, LocalID); 937 m_log.WarnFormat("{0}: Got a NaN force applied to a prim. LocalID={1}", LogHeader, LocalID);
947 return; 938 return;
948 } 939 }
949 BSScene.TaintCallback addForceOperation = delegate() 940 PhysicsScene.TaintedObject(inTaintTime, "BSPrim.AddForce", delegate()
950 { 941 {
951 OMV.Vector3 fSum = OMV.Vector3.Zero; 942 OMV.Vector3 fSum = OMV.Vector3.Zero;
952 lock (m_accumulatedForces) 943 lock (m_accumulatedForces)
@@ -961,11 +952,7 @@ public sealed class BSPrim : BSPhysObject
961 DetailLog("{0},BSPrim.AddForce,taint,force={1}", LocalID, fSum); 952 DetailLog("{0},BSPrim.AddForce,taint,force={1}", LocalID, fSum);
962 if (fSum != OMV.Vector3.Zero) 953 if (fSum != OMV.Vector3.Zero)
963 BulletSimAPI.ApplyCentralForce2(PhysBody.ptr, fSum); 954 BulletSimAPI.ApplyCentralForce2(PhysBody.ptr, fSum);
964 }; 955 });
965 if (inTaintTime)
966 addForceOperation();
967 else
968 PhysicsScene.TaintedObject("BSPrim.AddForce", addForceOperation);
969 } 956 }
970 957
971 private List<OMV.Vector3> m_accumulatedAngularForces = new List<OMV.Vector3>(); 958 private List<OMV.Vector3> m_accumulatedAngularForces = new List<OMV.Vector3>();
@@ -985,7 +972,7 @@ public sealed class BSPrim : BSPhysObject
985 m_log.WarnFormat("{0}: Got a NaN force applied to a prim. LocalID={1}", LogHeader, LocalID); 972 m_log.WarnFormat("{0}: Got a NaN force applied to a prim. LocalID={1}", LogHeader, LocalID);
986 return; 973 return;
987 } 974 }
988 BSScene.TaintCallback addAngularForceOperation = delegate() 975 PhysicsScene.TaintedObject(inTaintTime, "BSPrim.AddAngularForce", delegate()
989 { 976 {
990 OMV.Vector3 fSum = OMV.Vector3.Zero; 977 OMV.Vector3 fSum = OMV.Vector3.Zero;
991 lock (m_accumulatedAngularForces) 978 lock (m_accumulatedAngularForces)
@@ -1003,26 +990,19 @@ public sealed class BSPrim : BSPhysObject
1003 BulletSimAPI.ApplyTorque2(PhysBody.ptr, fSum); 990 BulletSimAPI.ApplyTorque2(PhysBody.ptr, fSum);
1004 _torque = fSum; 991 _torque = fSum;
1005 } 992 }
1006 }; 993 });
1007 if (inTaintTime)
1008 addAngularForceOperation();
1009 else
1010 PhysicsScene.TaintedObject("BSPrim.AddAngularForce", addAngularForceOperation);
1011 } 994 }
1012 // A torque impulse. 995 // A torque impulse.
1013 public void ApplyTorqueImpulse(OMV.Vector3 impulse, bool inTaintTime) 996 public void ApplyTorqueImpulse(OMV.Vector3 impulse, bool inTaintTime)
1014 { 997 {
1015 OMV.Vector3 applyImpulse = impulse; 998 OMV.Vector3 applyImpulse = impulse;
1016 BSScene.TaintCallback applyTorqueImpulseOperation = delegate() 999 PhysicsScene.TaintedObject(inTaintTime, "BSPrim.ApplyTorqueImpulse", delegate()
1017 { 1000 {
1018 DetailLog("{0},BSPrim.ApplyTorqueImpulse,taint,tImpulse={1}", LocalID, applyImpulse); 1001 DetailLog("{0},BSPrim.ApplyTorqueImpulse,taint,tImpulse={1}", LocalID, applyImpulse);
1019 BulletSimAPI.ApplyTorqueImpulse2(PhysBody.ptr, applyImpulse); 1002 BulletSimAPI.ApplyTorqueImpulse2(PhysBody.ptr, applyImpulse);
1020 }; 1003 });
1021 if (inTaintTime)
1022 applyTorqueImpulseOperation();
1023 else
1024 PhysicsScene.TaintedObject("BSPrim.ApplyTorqueImpulse", applyTorqueImpulseOperation);
1025 } 1004 }
1005
1026 public override void SetMomentum(OMV.Vector3 momentum) { 1006 public override void SetMomentum(OMV.Vector3 momentum) {
1027 // DetailLog("{0},BSPrim.SetMomentum,call,mom={1}", LocalID, momentum); 1007 // DetailLog("{0},BSPrim.SetMomentum,call,mom={1}", LocalID, momentum);
1028 } 1008 }