diff options
author | Robert Adams | 2012-11-02 09:53:41 -0700 |
---|---|---|
committer | Robert Adams | 2012-11-03 21:15:30 -0700 |
commit | b0eccd5044b1a20b995a62d6fb76fdd73b712f9a (patch) | |
tree | 877464740b99169d2e8f38bc8c75a33b37e9d475 /OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | |
parent | BulletSim: Add RawPosition and RawOrientation to BSPhysObject and rename Mass... (diff) | |
download | opensim-SC-b0eccd5044b1a20b995a62d6fb76fdd73b712f9a.zip opensim-SC-b0eccd5044b1a20b995a62d6fb76fdd73b712f9a.tar.gz opensim-SC-b0eccd5044b1a20b995a62d6fb76fdd73b712f9a.tar.bz2 opensim-SC-b0eccd5044b1a20b995a62d6fb76fdd73b712f9a.tar.xz |
BulletSim: debugging of compound shape implementation of linksets.
Add compound shape creation and freeing in shape manager.
Add optional taint-time execution method and update code to use it.
Add API2 linkage for more compound shape methods (get num, get/remove by index, ...)
Modify perferred shape return so linkset children can have differet shapes than root.
Add Position and Orientation calls to linksets so children can be moved around by
the linkset by its own calculation. Allows for very general linkset implementations.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | 52 |
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 | } |