diff options
author | Robert Adams | 2013-01-21 15:58:22 -0800 |
---|---|---|
committer | Robert Adams | 2013-01-21 15:58:22 -0800 |
commit | 471c4778639aec60078e6cee7c964682c959f033 (patch) | |
tree | 2e43aab8780c4b2556fd730529d5bd897fec151b /OpenSim/Region/Physics | |
parent | Have SOP and LSL_Api call the proper GetCenterOfMass and GetGeometricCenter (diff) | |
download | opensim-SC_OLD-471c4778639aec60078e6cee7c964682c959f033.zip opensim-SC_OLD-471c4778639aec60078e6cee7c964682c959f033.tar.gz opensim-SC_OLD-471c4778639aec60078e6cee7c964682c959f033.tar.bz2 opensim-SC_OLD-471c4778639aec60078e6cee7c964682c959f033.tar.xz |
BulletSim: allow changing position and rotation of a child of a linkset
without rebuilding the whole compound shape. Should make vehicles move
smoother.
Diffstat (limited to 'OpenSim/Region/Physics')
8 files changed, 112 insertions, 46 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index a9e16e6..7603254 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | |||
@@ -899,7 +899,7 @@ public sealed class BSCharacter : BSPhysObject | |||
899 | CurrentEntityProperties = entprop; | 899 | CurrentEntityProperties = entprop; |
900 | 900 | ||
901 | // Tell the linkset about value changes | 901 | // Tell the linkset about value changes |
902 | Linkset.UpdateProperties(this, true); | 902 | Linkset.UpdateProperties(UpdatedProperties.EntPropUpdates, this); |
903 | 903 | ||
904 | // Avatars don't report their changes the usual way. Changes are checked for in the heartbeat loop. | 904 | // Avatars don't report their changes the usual way. Changes are checked for in the heartbeat loop. |
905 | // base.RequestPhysicsterseUpdate(); | 905 | // base.RequestPhysicsterseUpdate(); |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs index cbd160f..580ea4e 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs | |||
@@ -252,7 +252,7 @@ public abstract class BSLinkset | |||
252 | // of the linkset is received. | 252 | // of the linkset is received. |
253 | // Passed flag is update came from physics engine (true) or the user (false). | 253 | // Passed flag is update came from physics engine (true) or the user (false). |
254 | // Called at taint-time!! | 254 | // Called at taint-time!! |
255 | public abstract void UpdateProperties(BSPhysObject physObject, bool physicalUpdate); | 255 | public abstract void UpdateProperties(UpdatedProperties whichUpdated, BSPhysObject physObject); |
256 | 256 | ||
257 | // Routine used when rebuilding the body of the root of the linkset | 257 | // Routine used when rebuilding the body of the root of the linkset |
258 | // Destroy all the constraints have have been made to root. | 258 | // Destroy all the constraints have have been made to root. |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs index 8c9a774..27d8ad0 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs | |||
@@ -51,6 +51,21 @@ sealed class BSLinksetCompoundInfo : BSLinksetInfo | |||
51 | OffsetFromCenterOfMass = p; | 51 | OffsetFromCenterOfMass = p; |
52 | OffsetRot = r; | 52 | OffsetRot = r; |
53 | } | 53 | } |
54 | // 'centerDisplacement' is the distance from the root the the center-of-mass (Bullet 'zero' of the shape) | ||
55 | public BSLinksetCompoundInfo(int indx, BSPhysObject root, BSPhysObject child, OMV.Vector3 centerDisplacement) | ||
56 | { | ||
57 | // Each child position and rotation is given relative to the center-of-mass. | ||
58 | OMV.Quaternion invRootOrientation = OMV.Quaternion.Inverse(root.RawOrientation); | ||
59 | OMV.Vector3 displacementFromRoot = (child.RawPosition - root.RawPosition) * invRootOrientation; | ||
60 | OMV.Vector3 displacementFromCOM = displacementFromRoot - centerDisplacement; | ||
61 | OMV.Quaternion displacementRot = child.RawOrientation * invRootOrientation; | ||
62 | |||
63 | // Save relative position for recomputing child's world position after moving linkset. | ||
64 | Index = indx; | ||
65 | OffsetFromRoot = displacementFromRoot; | ||
66 | OffsetFromCenterOfMass = displacementFromCOM; | ||
67 | OffsetRot = displacementRot; | ||
68 | } | ||
54 | public override void Clear() | 69 | public override void Clear() |
55 | { | 70 | { |
56 | Index = 0; | 71 | Index = 0; |
@@ -182,24 +197,71 @@ public sealed class BSLinksetCompound : BSLinkset | |||
182 | 197 | ||
183 | // 'physicalUpdate' is true if these changes came directly from the physics engine. Don't need to rebuild then. | 198 | // 'physicalUpdate' is true if these changes came directly from the physics engine. Don't need to rebuild then. |
184 | // Called at taint-time. | 199 | // Called at taint-time. |
185 | public override void UpdateProperties(BSPhysObject updated, bool physicalUpdate) | 200 | public override void UpdateProperties(UpdatedProperties whichUpdated, BSPhysObject updated) |
186 | { | 201 | { |
187 | // The user moving a child around requires the rebuilding of the linkset compound shape | 202 | // The user moving a child around requires the rebuilding of the linkset compound shape |
188 | // One problem is this happens when a border is crossed -- the simulator implementation | 203 | // One problem is this happens when a border is crossed -- the simulator implementation |
189 | // is to store the position into the group which causes the move of the object | 204 | // stores the position into the group which causes the move of the object |
190 | // but it also means all the child positions get updated. | 205 | // but it also means all the child positions get updated. |
191 | // What would cause an unnecessary rebuild so we make sure the linkset is in a | 206 | // What would cause an unnecessary rebuild so we make sure the linkset is in a |
192 | // region before bothering to do a rebuild. | 207 | // region before bothering to do a rebuild. |
193 | if (!IsRoot(updated) | 208 | if (!IsRoot(updated) && PhysicsScene.TerrainManager.IsWithinKnownTerrain(LinksetRoot.RawPosition)) |
194 | && !physicalUpdate | ||
195 | && PhysicsScene.TerrainManager.IsWithinKnownTerrain(LinksetRoot.RawPosition)) | ||
196 | { | 209 | { |
197 | // TODO: replace this with are calculation of the child prim's orientation and pos. | 210 | // If a child of the linkset is updating only the position or rotation, that can be done |
198 | // TODO: for the moment, don't rebuild the compound shape. | 211 | // without rebuilding the linkset. |
199 | // This is often just the car turning its wheels. When we can just reorient the one | 212 | // If a handle for the child can be fetch, we update the child here. If a rebuild was |
200 | // member shape of the compound shape, the overhead of rebuilding won't be a problem. | 213 | // scheduled by someone else, the rebuild will just replace this setting. |
201 | // updated.LinksetInfo = null; | 214 | |
202 | // ScheduleRebuild(updated); | 215 | bool updatedChild = false; |
216 | // Anything other than updating position or orientation usually means a physical update | ||
217 | // and that is caused by us updating the object. | ||
218 | if ((whichUpdated & ~(UpdatedProperties.Position | UpdatedProperties.Orientation)) == 0) | ||
219 | { | ||
220 | // Gather the child info. It might not be there if the linkset is in transition. | ||
221 | BSLinksetCompoundInfo lsi = updated.LinksetInfo as BSLinksetCompoundInfo; | ||
222 | if (LinksetRoot.PhysShape.HasPhysicalShape && lsi != null) | ||
223 | { | ||
224 | if (PhysicsScene.PE.IsCompound(LinksetRoot.PhysShape)) | ||
225 | { | ||
226 | BulletShape linksetChildShape = PhysicsScene.PE.GetChildShapeFromCompoundShapeIndex(LinksetRoot.PhysShape, lsi.Index); | ||
227 | if (linksetChildShape.HasPhysicalShape) | ||
228 | { | ||
229 | // Compute the offset from the center-of-gravity | ||
230 | BSLinksetCompoundInfo newLsi = new BSLinksetCompoundInfo(lsi.Index, LinksetRoot, updated, LinksetRoot.PositionDisplacement); | ||
231 | PhysicsScene.PE.UpdateChildTransform(LinksetRoot.PhysShape, lsi.Index, | ||
232 | newLsi.OffsetFromCenterOfMass, | ||
233 | newLsi.OffsetRot, | ||
234 | true /* shouldRecalculateLocalAabb */); | ||
235 | DetailLog("{0},BSLinksetCompound.UpdateProperties,changeChildPosRot,whichUpdated={1}newLsi={2}", | ||
236 | updated.LocalID, whichUpdated, newLsi); | ||
237 | updated.LinksetInfo = newLsi; | ||
238 | updatedChild = true; | ||
239 | } | ||
240 | else // DEBUG DEBUG | ||
241 | { // DEBUG DEBUG | ||
242 | DetailLog("{0},BSLinksetCompound.UpdateProperties,couldNotUpdateChild,noChildShape,shape={1}", | ||
243 | updated.LocalID, linksetChildShape); | ||
244 | } // DEBUG DEBUG | ||
245 | } | ||
246 | else // DEBUG DEBUG | ||
247 | { // DEBUG DEBUG | ||
248 | DetailLog("{0},BSLinksetCompound.UpdateProperties,couldNotUpdateChild,notCompound", updated.LocalID); | ||
249 | } // DEBUG DEBUG | ||
250 | } | ||
251 | else // DEBUG DEBUG | ||
252 | { // DEBUG DEBUG | ||
253 | DetailLog("{0},BSLinksetCompound.UpdateProperties,couldNotUpdateChild,rootPhysShape={1},lsi={2}", | ||
254 | updated.LocalID, LinksetRoot.PhysShape, lsi == null ? "NULL" : lsi.ToString()); | ||
255 | } // DEBUG DEBUG | ||
256 | if (!updatedChild) | ||
257 | { | ||
258 | // If couldn't do the individual child, the linkset needs a rebuild to incorporate the new child info. | ||
259 | DetailLog("{0},BSLinksetCompound.UpdateProperties,couldNotUpdateChild.schedulingRebuild,whichUpdated={1}", | ||
260 | updated.LocalID, whichUpdated); | ||
261 | updated.LinksetInfo = null; // setting to 'null' causes relative position to be recomputed. | ||
262 | ScheduleRebuild(updated); | ||
263 | } | ||
264 | } | ||
203 | } | 265 | } |
204 | } | 266 | } |
205 | 267 | ||
@@ -372,15 +434,7 @@ public sealed class BSLinksetCompound : BSLinkset | |||
372 | BSLinksetCompoundInfo lci = cPrim.LinksetInfo as BSLinksetCompoundInfo; | 434 | BSLinksetCompoundInfo lci = cPrim.LinksetInfo as BSLinksetCompoundInfo; |
373 | if (lci == null) | 435 | if (lci == null) |
374 | { | 436 | { |
375 | // Each child position and rotation is given relative to the center-of-mass. | 437 | lci = new BSLinksetCompoundInfo(memberIndex, LinksetRoot, cPrim, centerDisplacement); |
376 | OMV.Quaternion invRootOrientation = OMV.Quaternion.Inverse(LinksetRoot.RawOrientation); | ||
377 | OMV.Vector3 displacementFromRoot = (cPrim.RawPosition - LinksetRoot.RawPosition) * invRootOrientation; | ||
378 | OMV.Vector3 displacementFromCOM = displacementFromRoot - centerDisplacement; | ||
379 | OMV.Quaternion displacementRot = cPrim.RawOrientation * invRootOrientation; | ||
380 | |||
381 | // Save relative position for recomputing child's world position after moving linkset. | ||
382 | lci = new BSLinksetCompoundInfo(memberIndex, displacementFromCOM, displacementRot); | ||
383 | lci.OffsetFromRoot = displacementFromRoot; | ||
384 | cPrim.LinksetInfo = lci; | 438 | cPrim.LinksetInfo = lci; |
385 | DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,creatingRelPos,lci={1}", cPrim.LocalID, lci); | 439 | DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,creatingRelPos,lci={1}", cPrim.LocalID, lci); |
386 | } | 440 | } |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs index d0b2a56..89f186c 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs | |||
@@ -83,7 +83,7 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
83 | } | 83 | } |
84 | 84 | ||
85 | // Called at taint-time!! | 85 | // Called at taint-time!! |
86 | public override void UpdateProperties(BSPhysObject updated, bool inTaintTime) | 86 | public override void UpdateProperties(UpdatedProperties whichUpdated, BSPhysObject pObj) |
87 | { | 87 | { |
88 | // Nothing to do for constraints on property updates | 88 | // Nothing to do for constraints on property updates |
89 | } | 89 | } |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs index 5353c75..027c786 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs | |||
@@ -55,6 +55,16 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
55 | * BS.ApplyCentralForce BS.ApplyTorque | 55 | * BS.ApplyCentralForce BS.ApplyTorque |
56 | */ | 56 | */ |
57 | 57 | ||
58 | // Flags used to denote which properties updates when making UpdateProperties calls to linksets, etc. | ||
59 | public enum UpdatedProperties : uint | ||
60 | { | ||
61 | Position = 1 << 0, | ||
62 | Orientation = 1 << 1, | ||
63 | Velocity = 1 << 2, | ||
64 | Acceleration = 1 << 3, | ||
65 | RotationalVelocity = 1 << 4, | ||
66 | EntPropUpdates = Position | Orientation | Velocity | Acceleration | RotationalVelocity, | ||
67 | } | ||
58 | public abstract class BSPhysObject : PhysicsActor | 68 | public abstract class BSPhysObject : PhysicsActor |
59 | { | 69 | { |
60 | protected BSPhysObject() | 70 | protected BSPhysObject() |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index b63523c..468ff40 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | |||
@@ -311,13 +311,14 @@ public sealed class BSPrim : BSPhysObject | |||
311 | _position = value; | 311 | _position = value; |
312 | PositionSanityCheck(false); | 312 | PositionSanityCheck(false); |
313 | 313 | ||
314 | // A linkset might need to know if a component information changed. | ||
315 | Linkset.UpdateProperties(this, false); | ||
316 | |||
317 | PhysicsScene.TaintedObject("BSPrim.setPosition", delegate() | 314 | PhysicsScene.TaintedObject("BSPrim.setPosition", delegate() |
318 | { | 315 | { |
319 | DetailLog("{0},BSPrim.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation); | 316 | DetailLog("{0},BSPrim.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation); |
320 | ForcePosition = _position; | 317 | ForcePosition = _position; |
318 | |||
319 | // A linkset might need to know if a component information changed. | ||
320 | Linkset.UpdateProperties(UpdatedProperties.Position, this); | ||
321 | |||
321 | }); | 322 | }); |
322 | } | 323 | } |
323 | } | 324 | } |
@@ -682,12 +683,13 @@ public sealed class BSPrim : BSPhysObject | |||
682 | return; | 683 | return; |
683 | _orientation = value; | 684 | _orientation = value; |
684 | 685 | ||
685 | // A linkset might need to know if a component information changed. | ||
686 | Linkset.UpdateProperties(this, false); | ||
687 | |||
688 | PhysicsScene.TaintedObject("BSPrim.setOrientation", delegate() | 686 | PhysicsScene.TaintedObject("BSPrim.setOrientation", delegate() |
689 | { | 687 | { |
690 | ForceOrientation = _orientation; | 688 | ForceOrientation = _orientation; |
689 | |||
690 | // A linkset might need to know if a component information changed. | ||
691 | Linkset.UpdateProperties(UpdatedProperties.Orientation, this); | ||
692 | |||
691 | }); | 693 | }); |
692 | } | 694 | } |
693 | } | 695 | } |
@@ -1686,7 +1688,7 @@ public sealed class BSPrim : BSPhysObject | |||
1686 | */ | 1688 | */ |
1687 | 1689 | ||
1688 | // The linkset implimentation might want to know about this. | 1690 | // The linkset implimentation might want to know about this. |
1689 | Linkset.UpdateProperties(this, true); | 1691 | Linkset.UpdateProperties(UpdatedProperties.EntPropUpdates, this); |
1690 | } | 1692 | } |
1691 | } | 1693 | } |
1692 | } | 1694 | } |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs index 12b1ef1..8075b73 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | |||
@@ -846,8 +846,6 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters | |||
846 | 846 | ||
847 | #endregion // Taints | 847 | #endregion // Taints |
848 | 848 | ||
849 | #region INI and command line parameter processing | ||
850 | |||
851 | #region IPhysicsParameters | 849 | #region IPhysicsParameters |
852 | // Get the list of parameters this physics engine supports | 850 | // Get the list of parameters this physics engine supports |
853 | public PhysParameterEntry[] GetParameterList() | 851 | public PhysParameterEntry[] GetParameterList() |
@@ -944,8 +942,6 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters | |||
944 | 942 | ||
945 | #endregion IPhysicsParameters | 943 | #endregion IPhysicsParameters |
946 | 944 | ||
947 | #endregion Runtime settable parameters | ||
948 | |||
949 | // Invoke the detailed logger and output something if it's enabled. | 945 | // Invoke the detailed logger and output something if it's enabled. |
950 | public void DetailLog(string msg, params Object[] args) | 946 | public void DetailLog(string msg, params Object[] args) |
951 | { | 947 | { |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt index c1bf766..41bab26 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt +++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt | |||
@@ -1,25 +1,20 @@ | |||
1 | CURRENT PRIORITIES | 1 | CURRENT PRIORITIES |
2 | ================================================= | 2 | ================================================= |
3 | Mantis 6040 script http://opensimulator.org/mantis/view.php?id=6040 | 3 | Child movement in linkset (don't rebuild linkset) |
4 | Msg Kayaker on OSGrid when working | 4 | Vehicle angular vertical attraction |
5 | vehicle angular banking | ||
6 | Center-of-gravity | ||
7 | Vehicle angular deflection | ||
8 | Preferred orientation angular correction fix | ||
5 | when should angular and linear motor targets be zeroed? when selected? | 9 | when should angular and linear motor targets be zeroed? when selected? |
6 | Need a vehicle.clear()? Or an 'else' in prestep if not physical. | 10 | Need a vehicle.clear()? Or an 'else' in prestep if not physical. |
7 | Teravus llMoveToTarget script debug | 11 | Teravus llMoveToTarget script debug |
8 | Mixing of hover, buoyancy/gravity, moveToTarget, into one force | 12 | Mixing of hover, buoyancy/gravity, moveToTarget, into one force |
9 | Boats floating at proper level | ||
10 | Nebadon vehicles turning funny in arena | 13 | Nebadon vehicles turning funny in arena |
11 | limitMotorUp calibration (more down?) | 14 | limitMotorUp calibration (more down?) |
12 | llRotLookAt | 15 | llRotLookAt |
13 | llLookAt | 16 | llLookAt |
14 | Vehicle angular vertical attraction | ||
15 | Vehicle angular deflection | ||
16 | Preferred orientation angular correction fix | ||
17 | vehicle angular banking | ||
18 | Avatars walking up stairs (HALF DONE) | 17 | Avatars walking up stairs (HALF DONE) |
19 | Radius of the capsule affects ability to climb edges. | ||
20 | Vehicle movement on terrain smoothness | ||
21 | When is force introduced by SetForce removed? The prestep action could go forever. | ||
22 | Boats float low in the water (DONE) | ||
23 | Avatar movement | 18 | Avatar movement |
24 | flying into a wall doesn't stop avatar who keeps appearing to move through the obstacle (DONE) | 19 | flying into a wall doesn't stop avatar who keeps appearing to move through the obstacle (DONE) |
25 | walking up stairs is not calibrated correctly (stairs out of Kepler cabin) | 20 | walking up stairs is not calibrated correctly (stairs out of Kepler cabin) |
@@ -75,6 +70,7 @@ Incorporate inter-relationship of angular corrections. For instance, angularDefl | |||
75 | 70 | ||
76 | GENERAL TODO LIST: | 71 | GENERAL TODO LIST: |
77 | ================================================= | 72 | ================================================= |
73 | llMoveToTarget objects are not effected by gravity until target is removed. | ||
78 | Implement llSetPhysicalMaterial. | 74 | Implement llSetPhysicalMaterial. |
79 | extend it with Center-of-mass, rolling friction, density | 75 | extend it with Center-of-mass, rolling friction, density |
80 | Implement llSetForceAndTorque. | 76 | Implement llSetForceAndTorque. |
@@ -315,4 +311,12 @@ Remove HeightmapInfo from terrain specification (DONE) | |||
315 | Since C++ code does not need terrain height, this structure et al are not needed. | 311 | Since C++ code does not need terrain height, this structure et al are not needed. |
316 | Surfboard go wonky when turning (DONE) | 312 | Surfboard go wonky when turning (DONE) |
317 | Angular motor direction is global coordinates rather than local coordinates? | 313 | Angular motor direction is global coordinates rather than local coordinates? |
318 | (Resolution: made angular motor direction correct coordinate system) \ No newline at end of file | 314 | (Resolution: made angular motor direction correct coordinate system) |
315 | Mantis 6040 script http://opensimulator.org/mantis/view.php?id=6040 (DONE) | ||
316 | Msg Kayaker on OSGrid when working | ||
317 | (Resolution: LINEAR_DIRECTION is in vehicle coords. Test script does the | ||
318 | same in SL as in OS/BulletSim) | ||
319 | Boats float low in the water (DONE) | ||
320 | Boats floating at proper level (DONE) | ||
321 | When is force introduced by SetForce removed? The prestep action could go forever. (DONE) | ||
322 | (Resolution: setForce registers a prestep action which keeps applying the force) \ No newline at end of file | ||