diff options
author | Robert Adams | 2013-01-11 16:36:34 -0800 |
---|---|---|
committer | Robert Adams | 2013-01-11 16:47:53 -0800 |
commit | 459fcd81c9d6e7c92738b40f1b4b4fe746699379 (patch) | |
tree | 6555a0076aa18c3634ad89ef8c3d097d67edb08b /OpenSim | |
parent | BulletSim: add osGetPhysicsEngineType() LSL function and update (diff) | |
download | opensim-SC-459fcd81c9d6e7c92738b40f1b4b4fe746699379.zip opensim-SC-459fcd81c9d6e7c92738b40f1b4b4fe746699379.tar.gz opensim-SC-459fcd81c9d6e7c92738b40f1b4b4fe746699379.tar.bz2 opensim-SC-459fcd81c9d6e7c92738b40f1b4b4fe746699379.tar.xz |
BulletSim: move center of gravity of linkset to its geometric center.
Necessitated allowing simulator and physical position of a body to
get out of sync since Bullet assumes that <0,0,0> is the center of mass.
Update DLLs and SOs for the UpdateChildTransform so positions of
individual prim in a linkset can be implemented.
Diffstat (limited to 'OpenSim')
10 files changed, 106 insertions, 32 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSAPIUnman.cs b/OpenSim/Region/Physics/BulletSPlugin/BSAPIUnman.cs index 14de2eb..0fef67c 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSAPIUnman.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSAPIUnman.cs | |||
@@ -327,6 +327,12 @@ public override void RemoveChildShapeFromCompoundShape(BulletShape shape, Bullet | |||
327 | BSAPICPP.RemoveChildShapeFromCompoundShape2(shapeu.ptr, removeShapeu.ptr); | 327 | BSAPICPP.RemoveChildShapeFromCompoundShape2(shapeu.ptr, removeShapeu.ptr); |
328 | } | 328 | } |
329 | 329 | ||
330 | public override void UpdateChildTransform(BulletShape pShape, int childIndex, Vector3 pos, Quaternion rot, bool shouldRecalculateLocalAabb) | ||
331 | { | ||
332 | BulletShapeUnman shapeu = pShape as BulletShapeUnman; | ||
333 | BSAPICPP.UpdateChildTransform2(shapeu.ptr, childIndex, pos, rot, shouldRecalculateLocalAabb); | ||
334 | } | ||
335 | |||
330 | public override void RecalculateCompoundShapeLocalAabb(BulletShape shape) | 336 | public override void RecalculateCompoundShapeLocalAabb(BulletShape shape) |
331 | { | 337 | { |
332 | BulletShapeUnman shapeu = shape as BulletShapeUnman; | 338 | BulletShapeUnman shapeu = shape as BulletShapeUnman; |
@@ -1357,6 +1363,9 @@ public static extern IntPtr RemoveChildShapeFromCompoundShapeIndex2(IntPtr cShap | |||
1357 | public static extern void RemoveChildShapeFromCompoundShape2(IntPtr cShape, IntPtr removeShape); | 1363 | public static extern void RemoveChildShapeFromCompoundShape2(IntPtr cShape, IntPtr removeShape); |
1358 | 1364 | ||
1359 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | 1365 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] |
1366 | public static extern void UpdateChildTransform2(IntPtr pShape, int childIndex, Vector3 pos, Quaternion rot, bool shouldRecalculateLocalAabb); | ||
1367 | |||
1368 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | ||
1360 | public static extern void RecalculateCompoundShapeLocalAabb2(IntPtr cShape); | 1369 | public static extern void RecalculateCompoundShapeLocalAabb2(IntPtr cShape); |
1361 | 1370 | ||
1362 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | 1371 | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs b/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs index 0c7f315..b6ff52b 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs | |||
@@ -1212,6 +1212,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1212 | 1212 | ||
1213 | public override BulletShape GetChildShapeFromCompoundShapeIndex(BulletShape cShape, int indx) { /* TODO */ return null; } | 1213 | public override BulletShape GetChildShapeFromCompoundShapeIndex(BulletShape cShape, int indx) { /* TODO */ return null; } |
1214 | public override void RemoveChildShapeFromCompoundShape(BulletShape cShape, BulletShape removeShape) { /* TODO */ } | 1214 | public override void RemoveChildShapeFromCompoundShape(BulletShape cShape, BulletShape removeShape) { /* TODO */ } |
1215 | public override void UpdateChildTransform(BulletShape pShape, int childIndex, Vector3 pos, Quaternion rot, bool shouldRecalculateLocalAabb) { /* TODO */ } | ||
1215 | 1216 | ||
1216 | public override BulletShape CreateGroundPlaneShape(uint pLocalId, float pheight, float pcollisionMargin) | 1217 | public override BulletShape CreateGroundPlaneShape(uint pLocalId, float pheight, float pcollisionMargin) |
1217 | { | 1218 | { |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSApiTemplate.cs b/OpenSim/Region/Physics/BulletSPlugin/BSApiTemplate.cs index 794ee17..bc163eb 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSApiTemplate.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSApiTemplate.cs | |||
@@ -342,6 +342,8 @@ public abstract BulletShape RemoveChildShapeFromCompoundShapeIndex(BulletShape c | |||
342 | 342 | ||
343 | public abstract void RemoveChildShapeFromCompoundShape(BulletShape cShape, BulletShape removeShape); | 343 | public abstract void RemoveChildShapeFromCompoundShape(BulletShape cShape, BulletShape removeShape); |
344 | 344 | ||
345 | public abstract void UpdateChildTransform(BulletShape pShape, int childIndex, Vector3 pos, Quaternion rot, bool shouldRecalculateLocalAabb); | ||
346 | |||
345 | public abstract void RecalculateCompoundShapeLocalAabb(BulletShape cShape); | 347 | public abstract void RecalculateCompoundShapeLocalAabb(BulletShape cShape); |
346 | 348 | ||
347 | public abstract BulletShape DuplicateCollisionShape(BulletWorld sim, BulletShape srcShape, uint id); | 349 | public abstract BulletShape DuplicateCollisionShape(BulletWorld sim, BulletShape srcShape, uint id); |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs index 80fdfb9..bcebaec 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | |||
@@ -148,7 +148,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
148 | enableAngularVerticalAttraction = false; | 148 | enableAngularVerticalAttraction = false; |
149 | enableAngularDeflection = false; | 149 | enableAngularDeflection = false; |
150 | enableAngularBanking = false; | 150 | enableAngularBanking = false; |
151 | VDetailLog("{0},BSDynamics.SetupVehicleDebugging,settingDebugMode", Prim.LocalID); | ||
152 | } | 151 | } |
153 | } | 152 | } |
154 | 153 | ||
@@ -690,10 +689,10 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
690 | } | 689 | } |
691 | 690 | ||
692 | if ((m_knownChanged & m_knownChangedForce) != 0) | 691 | if ((m_knownChanged & m_knownChangedForce) != 0) |
693 | Prim.AddForce((Vector3)m_knownForce, false, true); | 692 | Prim.AddForce((Vector3)m_knownForce, false /*pushForce*/, true /*inTaintTime*/); |
694 | 693 | ||
695 | if ((m_knownChanged & m_knownChangedForceImpulse) != 0) | 694 | if ((m_knownChanged & m_knownChangedForceImpulse) != 0) |
696 | Prim.AddForceImpulse((Vector3)m_knownForceImpulse, false, true); | 695 | Prim.AddForceImpulse((Vector3)m_knownForceImpulse, false /*pushforce*/, true /*inTaintTime*/); |
697 | 696 | ||
698 | if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0) | 697 | if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0) |
699 | { | 698 | { |
@@ -703,7 +702,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
703 | 702 | ||
704 | if ((m_knownChanged & m_knownChangedRotationalForce) != 0) | 703 | if ((m_knownChanged & m_knownChangedRotationalForce) != 0) |
705 | { | 704 | { |
706 | Prim.AddAngularForce((Vector3)m_knownRotationalForce, false, true); | 705 | Prim.AddAngularForce((Vector3)m_knownRotationalForce, false /*pushForce*/, true /*inTaintTime*/); |
707 | } | 706 | } |
708 | 707 | ||
709 | // If we set one of the values (ie, the physics engine didn't do it) we must force | 708 | // If we set one of the values (ie, the physics engine didn't do it) we must force |
@@ -970,7 +969,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
970 | // Act against the inertia of the vehicle | 969 | // Act against the inertia of the vehicle |
971 | linearMotorForce *= m_vehicleMass; | 970 | linearMotorForce *= m_vehicleMass; |
972 | 971 | ||
973 | VehicleAddForceImpulse(linearMotorForce); | 972 | VehicleAddForceImpulse(linearMotorForce * pTimestep); |
974 | 973 | ||
975 | VDetailLog("{0}, MoveLinear,velocity,vehVel={1},step={2},stepVel={3},mix={4},force={5}", | 974 | VDetailLog("{0}, MoveLinear,velocity,vehVel={1},step={2},stepVel={3},mix={4},force={5}", |
976 | Prim.LocalID, VehicleVelocity, linearMotorStep, linearMotorVelocity, mixFactor, linearMotorForce); | 975 | Prim.LocalID, VehicleVelocity, linearMotorStep, linearMotorVelocity, mixFactor, linearMotorForce); |
@@ -1033,7 +1032,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1033 | { | 1032 | { |
1034 | // Error is positive if below the target and negative if above. | 1033 | // Error is positive if below the target and negative if above. |
1035 | float verticalError = m_VhoverTargetHeight - VehiclePosition.Z; | 1034 | float verticalError = m_VhoverTargetHeight - VehiclePosition.Z; |
1036 | float verticalCorrectionVelocity = verticalError / m_VhoverTimescale; | 1035 | float verticalCorrectionVelocity = verticalError / m_VhoverTimescale * pTimestep; |
1037 | 1036 | ||
1038 | // TODO: implement m_VhoverEfficiency correctly | 1037 | // TODO: implement m_VhoverEfficiency correctly |
1039 | VehicleAddForceImpulse(new Vector3(0f, 0f, verticalCorrectionVelocity)); | 1038 | VehicleAddForceImpulse(new Vector3(0f, 0f, verticalCorrectionVelocity)); |
@@ -1323,7 +1322,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1323 | // this creates an over-correction and then wabbling as the target is overshot. | 1322 | // this creates an over-correction and then wabbling as the target is overshot. |
1324 | // TODO: rethink how the different correction computations inter-relate. | 1323 | // TODO: rethink how the different correction computations inter-relate. |
1325 | 1324 | ||
1326 | if (enableAngularDeflection && m_angularDeflectionEfficiency != 0 && VehicleVelocity != Vector3.Zero) | 1325 | if (enableAngularDeflection && m_angularDeflectionEfficiency != 0 && VehicleForwardSpeed > 0.2) |
1327 | { | 1326 | { |
1328 | // The direction the vehicle is moving | 1327 | // The direction the vehicle is moving |
1329 | Vector3 movingDirection = VehicleVelocity; | 1328 | Vector3 movingDirection = VehicleVelocity; |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs index 756faed..cbd160f 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs | |||
@@ -152,6 +152,7 @@ public abstract class BSLinkset | |||
152 | if (IsRoot(child)) | 152 | if (IsRoot(child)) |
153 | { | 153 | { |
154 | // Cannot remove the root from a linkset. | 154 | // Cannot remove the root from a linkset. |
155 | child.PositionDisplacement = OMV.Vector3.Zero; | ||
155 | return this; | 156 | return this; |
156 | } | 157 | } |
157 | RemoveChildFromLinkset(child); | 158 | RemoveChildFromLinkset(child); |
@@ -159,6 +160,7 @@ public abstract class BSLinkset | |||
159 | } | 160 | } |
160 | 161 | ||
161 | // The child is down to a linkset of just itself | 162 | // The child is down to a linkset of just itself |
163 | child.PositionDisplacement = OMV.Vector3.Zero; | ||
162 | return BSLinkset.Factory(PhysicsScene, child); | 164 | return BSLinkset.Factory(PhysicsScene, child); |
163 | } | 165 | } |
164 | 166 | ||
@@ -310,7 +312,7 @@ public abstract class BSLinkset | |||
310 | 312 | ||
311 | foreach (BSPhysObject bp in m_children) | 313 | foreach (BSPhysObject bp in m_children) |
312 | { | 314 | { |
313 | com += bp.Position * bp.RawMass; | 315 | com += bp.Position; |
314 | } | 316 | } |
315 | com /= (m_children.Count + 1); | 317 | com /= (m_children.Count + 1); |
316 | } | 318 | } |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs index bd03d31..ad8024c 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs | |||
@@ -40,23 +40,33 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
40 | // removed from the linkset. | 40 | // removed from the linkset. |
41 | sealed class BSLinksetCompoundInfo : BSLinksetInfo | 41 | sealed class BSLinksetCompoundInfo : BSLinksetInfo |
42 | { | 42 | { |
43 | public OMV.Vector3 OffsetPos; | 43 | public int Index; |
44 | public OMV.Vector3 OffsetFromRoot; | ||
45 | public OMV.Vector3 OffsetFromCenterOfMass; | ||
44 | public OMV.Quaternion OffsetRot; | 46 | public OMV.Quaternion OffsetRot; |
45 | public BSLinksetCompoundInfo(OMV.Vector3 p, OMV.Quaternion r) | 47 | public BSLinksetCompoundInfo(int indx, OMV.Vector3 p, OMV.Quaternion r) |
46 | { | 48 | { |
47 | OffsetPos = p; | 49 | Index = indx; |
50 | OffsetFromRoot = p; | ||
51 | OffsetFromCenterOfMass = p; | ||
48 | OffsetRot = r; | 52 | OffsetRot = r; |
49 | } | 53 | } |
50 | public override void Clear() | 54 | public override void Clear() |
51 | { | 55 | { |
52 | OffsetPos = OMV.Vector3.Zero; | 56 | Index = 0; |
57 | OffsetFromRoot = OMV.Vector3.Zero; | ||
58 | OffsetFromCenterOfMass = OMV.Vector3.Zero; | ||
53 | OffsetRot = OMV.Quaternion.Identity; | 59 | OffsetRot = OMV.Quaternion.Identity; |
54 | } | 60 | } |
55 | public override string ToString() | 61 | public override string ToString() |
56 | { | 62 | { |
57 | StringBuilder buff = new StringBuilder(); | 63 | StringBuilder buff = new StringBuilder(); |
58 | buff.Append("<p="); | 64 | buff.Append("<i="); |
59 | buff.Append(OffsetPos.ToString()); | 65 | buff.Append(Index.ToString()); |
66 | buff.Append(",p="); | ||
67 | buff.Append(OffsetFromRoot.ToString()); | ||
68 | buff.Append(",m="); | ||
69 | buff.Append(OffsetFromCenterOfMass.ToString()); | ||
60 | buff.Append(",r="); | 70 | buff.Append(",r="); |
61 | buff.Append(OffsetRot.ToString()); | 71 | buff.Append(OffsetRot.ToString()); |
62 | buff.Append(">"); | 72 | buff.Append(">"); |
@@ -170,6 +180,8 @@ public sealed class BSLinksetCompound : BSLinkset | |||
170 | return ret; | 180 | return ret; |
171 | } | 181 | } |
172 | 182 | ||
183 | // 'physicalUpdate' is true if these changes came directly from the physics engine. Don't need to rebuild then. | ||
184 | // Called at taint-time. | ||
173 | public override void UpdateProperties(BSPhysObject updated, bool physicalUpdate) | 185 | public override void UpdateProperties(BSPhysObject updated, bool physicalUpdate) |
174 | { | 186 | { |
175 | // The user moving a child around requires the rebuilding of the linkset compound shape | 187 | // The user moving a child around requires the rebuilding of the linkset compound shape |
@@ -182,6 +194,7 @@ public sealed class BSLinksetCompound : BSLinkset | |||
182 | && !physicalUpdate | 194 | && !physicalUpdate |
183 | && PhysicsScene.TerrainManager.IsWithinKnownTerrain(LinksetRoot.RawPosition)) | 195 | && PhysicsScene.TerrainManager.IsWithinKnownTerrain(LinksetRoot.RawPosition)) |
184 | { | 196 | { |
197 | // TODO: replace this with are calculation of the child prim's orientation and pos. | ||
185 | updated.LinksetInfo = null; | 198 | updated.LinksetInfo = null; |
186 | ScheduleRebuild(updated); | 199 | ScheduleRebuild(updated); |
187 | } | 200 | } |
@@ -230,7 +243,7 @@ public sealed class BSLinksetCompound : BSLinkset | |||
230 | if (inTaintTime) | 243 | if (inTaintTime) |
231 | { | 244 | { |
232 | OMV.Vector3 oldPos = child.RawPosition; | 245 | OMV.Vector3 oldPos = child.RawPosition; |
233 | child.ForcePosition = LinksetRoot.RawPosition + lci.OffsetPos; | 246 | child.ForcePosition = LinksetRoot.RawPosition + lci.OffsetFromRoot; |
234 | child.ForceOrientation = LinksetRoot.RawOrientation * lci.OffsetRot; | 247 | child.ForceOrientation = LinksetRoot.RawOrientation * lci.OffsetRot; |
235 | DetailLog("{0},BSLinksetCompound.RecomputeChildWorldPosition,oldPos={1},lci={2},newPos={3}", | 248 | DetailLog("{0},BSLinksetCompound.RecomputeChildWorldPosition,oldPos={1},lci={2},newPos={3}", |
236 | child.LocalID, oldPos, lci, child.RawPosition); | 249 | child.LocalID, oldPos, lci, child.RawPosition); |
@@ -238,7 +251,7 @@ public sealed class BSLinksetCompound : BSLinkset | |||
238 | else | 251 | else |
239 | { | 252 | { |
240 | // TaintedObject is not used here so the raw position is set now and not at taint-time. | 253 | // TaintedObject is not used here so the raw position is set now and not at taint-time. |
241 | child.Position = LinksetRoot.RawPosition + lci.OffsetPos; | 254 | child.Position = LinksetRoot.RawPosition + lci.OffsetFromRoot; |
242 | child.Orientation = LinksetRoot.RawOrientation * lci.OffsetRot; | 255 | child.Orientation = LinksetRoot.RawOrientation * lci.OffsetRot; |
243 | } | 256 | } |
244 | } | 257 | } |
@@ -316,10 +329,23 @@ public sealed class BSLinksetCompound : BSLinkset | |||
316 | // Cause the root shape to be rebuilt as a compound object with just the root in it | 329 | // Cause the root shape to be rebuilt as a compound object with just the root in it |
317 | LinksetRoot.ForceBodyShapeRebuild(true); | 330 | LinksetRoot.ForceBodyShapeRebuild(true); |
318 | 331 | ||
332 | // The center of mass for the linkset is the geometric center of the group. | ||
333 | // Compute a displacement for each component so it is relative to the center-of-mass. | ||
334 | OMV.Vector3 centerOfMass = ComputeLinksetGeometricCenter(); | ||
335 | OMV.Vector3 centerDisplacement = centerOfMass - LinksetRoot.RawPosition; | ||
336 | |||
337 | // Since we're displacing the center of the shape, we need to move the body in the world | ||
338 | LinksetRoot.PositionDisplacement = centerDisplacement * LinksetRoot.RawOrientation; | ||
339 | |||
340 | PhysicsScene.PE.UpdateChildTransform(LinksetRoot.PhysShape, 0, -centerDisplacement, OMV.Quaternion.Identity, false); | ||
341 | DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,COM,com={1},rootPos={2},centerDisp={3}", | ||
342 | LinksetRoot.LocalID, centerOfMass, LinksetRoot.RawPosition, centerDisplacement); | ||
343 | |||
319 | DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,start,rBody={1},rShape={2},numChildren={3}", | 344 | DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,start,rBody={1},rShape={2},numChildren={3}", |
320 | LinksetRoot.LocalID, LinksetRoot.PhysBody, LinksetRoot.PhysShape, NumberOfChildren); | 345 | LinksetRoot.LocalID, LinksetRoot.PhysBody, LinksetRoot.PhysShape, NumberOfChildren); |
321 | 346 | ||
322 | // Add a shape for each of the other children in the linkset | 347 | // Add a shape for each of the other children in the linkset |
348 | int memberIndex = 1; | ||
323 | ForEachMember(delegate(BSPhysObject cPrim) | 349 | ForEachMember(delegate(BSPhysObject cPrim) |
324 | { | 350 | { |
325 | if (!IsRoot(cPrim)) | 351 | if (!IsRoot(cPrim)) |
@@ -337,13 +363,14 @@ public sealed class BSLinksetCompound : BSLinkset | |||
337 | OMV.Quaternion displacementRot = cPrim.RawOrientation * invRootOrientation; | 363 | OMV.Quaternion displacementRot = cPrim.RawOrientation * invRootOrientation; |
338 | 364 | ||
339 | // Save relative position for recomputing child's world position after moving linkset. | 365 | // Save relative position for recomputing child's world position after moving linkset. |
340 | lci = new BSLinksetCompoundInfo(displacementPos, displacementRot); | 366 | lci = new BSLinksetCompoundInfo(memberIndex, displacementPos, displacementRot); |
367 | lci.OffsetFromCenterOfMass = displacementPos - centerDisplacement; | ||
341 | cPrim.LinksetInfo = lci; | 368 | cPrim.LinksetInfo = lci; |
342 | DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,creatingRelPos,lci={1}", cPrim.LocalID, lci); | 369 | DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,creatingRelPos,lci={1}", cPrim.LocalID, lci); |
343 | } | 370 | } |
344 | 371 | ||
345 | DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addMemberToShape,mID={1},mShape={2},dispPos={3},dispRot={4}", | 372 | DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addMemberToShape,mID={1},mShape={2},lci={3}", |
346 | LinksetRoot.LocalID, cPrim.LocalID, cPrim.PhysShape, lci.OffsetPos, lci.OffsetRot); | 373 | LinksetRoot.LocalID, cPrim.LocalID, cPrim.PhysShape, lci); |
347 | 374 | ||
348 | if (cPrim.PhysShape.isNativeShape) | 375 | if (cPrim.PhysShape.isNativeShape) |
349 | { | 376 | { |
@@ -359,7 +386,7 @@ public sealed class BSLinksetCompound : BSLinkset | |||
359 | PhysicsScene.Shapes.CreateGeomMeshOrHull(cPrim, null); | 386 | PhysicsScene.Shapes.CreateGeomMeshOrHull(cPrim, null); |
360 | BulletShape newShape = cPrim.PhysShape; | 387 | BulletShape newShape = cPrim.PhysShape; |
361 | cPrim.PhysShape = saveShape; | 388 | cPrim.PhysShape = saveShape; |
362 | PhysicsScene.PE.AddChildShapeToCompoundShape(LinksetRoot.PhysShape, newShape, lci.OffsetPos, lci.OffsetRot); | 389 | PhysicsScene.PE.AddChildShapeToCompoundShape(LinksetRoot.PhysShape, newShape, lci.OffsetFromCenterOfMass, lci.OffsetRot); |
363 | } | 390 | } |
364 | else | 391 | else |
365 | { | 392 | { |
@@ -371,8 +398,10 @@ public sealed class BSLinksetCompound : BSLinkset | |||
371 | PhysicsScene.Logger.ErrorFormat("{0} Rebuilt sharable shape when building linkset! Region={1}, primID={2}, shape={3}", | 398 | PhysicsScene.Logger.ErrorFormat("{0} Rebuilt sharable shape when building linkset! Region={1}, primID={2}, shape={3}", |
372 | LogHeader, PhysicsScene.RegionName, cPrim.LocalID, cPrim.PhysShape); | 399 | LogHeader, PhysicsScene.RegionName, cPrim.LocalID, cPrim.PhysShape); |
373 | } | 400 | } |
374 | PhysicsScene.PE.AddChildShapeToCompoundShape(LinksetRoot.PhysShape, cPrim.PhysShape, lci.OffsetPos, lci.OffsetRot); | 401 | PhysicsScene.PE.AddChildShapeToCompoundShape(LinksetRoot.PhysShape, cPrim.PhysShape, lci.OffsetFromCenterOfMass, lci.OffsetRot); |
375 | } | 402 | } |
403 | lci.Index = memberIndex; | ||
404 | memberIndex++; | ||
376 | } | 405 | } |
377 | return false; // 'false' says to move onto the next child in the list | 406 | return false; // 'false' says to move onto the next child in the list |
378 | }); | 407 | }); |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs index 2c84293..185f111 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs | |||
@@ -73,6 +73,8 @@ public abstract class BSPhysObject : PhysicsActor | |||
73 | 73 | ||
74 | // A linkset of just me | 74 | // A linkset of just me |
75 | Linkset = BSLinkset.Factory(PhysicsScene, this); | 75 | Linkset = BSLinkset.Factory(PhysicsScene, this); |
76 | PositionDisplacement = OMV.Vector3.Zero; | ||
77 | |||
76 | LastAssetBuildFailed = false; | 78 | LastAssetBuildFailed = false; |
77 | 79 | ||
78 | // Default material type | 80 | // Default material type |
@@ -157,6 +159,14 @@ public abstract class BSPhysObject : PhysicsActor | |||
157 | public abstract OMV.Vector3 RawPosition { get; set; } | 159 | public abstract OMV.Vector3 RawPosition { get; set; } |
158 | public abstract OMV.Vector3 ForcePosition { get; set; } | 160 | public abstract OMV.Vector3 ForcePosition { get; set; } |
159 | 161 | ||
162 | // Position is what the simulator thinks the positions of the prim is. | ||
163 | // Because Bullet needs the zero coordinate to be the center of mass of the linkset, | ||
164 | // sometimes it is necessary to displace the position the physics engine thinks | ||
165 | // the position is. PositionDisplacement must be added and removed from the | ||
166 | // position as the simulator position is stored and fetched from the physics | ||
167 | // engine. | ||
168 | public virtual OMV.Vector3 PositionDisplacement { get; set; } | ||
169 | |||
160 | public abstract OMV.Quaternion RawOrientation { get; set; } | 170 | public abstract OMV.Quaternion RawOrientation { get; set; } |
161 | public abstract OMV.Quaternion ForceOrientation { get; set; } | 171 | public abstract OMV.Quaternion ForceOrientation { get; set; } |
162 | 172 | ||
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index 02d06b4..003dc54 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | |||
@@ -50,7 +50,10 @@ public sealed class BSPrim : BSPhysObject | |||
50 | private bool _grabbed; | 50 | private bool _grabbed; |
51 | private bool _isSelected; | 51 | private bool _isSelected; |
52 | private bool _isVolumeDetect; | 52 | private bool _isVolumeDetect; |
53 | |||
54 | // _position is what the simulator thinks the positions of the prim is. | ||
53 | private OMV.Vector3 _position; | 55 | private OMV.Vector3 _position; |
56 | |||
54 | private float _mass; // the mass of this object | 57 | private float _mass; // the mass of this object |
55 | private float _density; | 58 | private float _density; |
56 | private OMV.Vector3 _force; | 59 | private OMV.Vector3 _force; |
@@ -320,18 +323,37 @@ public sealed class BSPrim : BSPhysObject | |||
320 | } | 323 | } |
321 | public override OMV.Vector3 ForcePosition { | 324 | public override OMV.Vector3 ForcePosition { |
322 | get { | 325 | get { |
323 | _position = PhysicsScene.PE.GetPosition(PhysBody); | 326 | _position = PhysicsScene.PE.GetPosition(PhysBody) - PositionDisplacement; |
324 | return _position; | 327 | return _position; |
325 | } | 328 | } |
326 | set { | 329 | set { |
327 | _position = value; | 330 | _position = value; |
328 | if (PhysBody.HasPhysicalBody) | 331 | if (PhysBody.HasPhysicalBody) |
329 | { | 332 | { |
330 | PhysicsScene.PE.SetTranslation(PhysBody, _position, _orientation); | 333 | PhysicsScene.PE.SetTranslation(PhysBody, _position + PositionDisplacement, _orientation); |
331 | ActivateIfPhysical(false); | 334 | ActivateIfPhysical(false); |
332 | } | 335 | } |
333 | } | 336 | } |
334 | } | 337 | } |
338 | // Override to have position displacement immediately update the physical position. | ||
339 | // A feeble attempt to keep the sim and physical positions in sync | ||
340 | // Must be called at taint time. | ||
341 | public override OMV.Vector3 PositionDisplacement | ||
342 | { | ||
343 | get | ||
344 | { | ||
345 | return base.PositionDisplacement; | ||
346 | } | ||
347 | set | ||
348 | { | ||
349 | base.PositionDisplacement = value; | ||
350 | PhysicsScene.TaintedObject(PhysicsScene.InTaintTime, "BSPrim.setPosition", delegate() | ||
351 | { | ||
352 | if (PhysBody.HasPhysicalBody) | ||
353 | PhysicsScene.PE.SetTranslation(PhysBody, _position + base.PositionDisplacement, _orientation); | ||
354 | }); | ||
355 | } | ||
356 | } | ||
335 | 357 | ||
336 | // Check that the current position is sane and, if not, modify the position to make it so. | 358 | // Check that the current position is sane and, if not, modify the position to make it so. |
337 | // Check for being below terrain and being out of bounds. | 359 | // Check for being below terrain and being out of bounds. |
@@ -590,6 +612,7 @@ public sealed class BSPrim : BSPhysObject | |||
590 | _velocity = value; | 612 | _velocity = value; |
591 | if (PhysBody.HasPhysicalBody) | 613 | if (PhysBody.HasPhysicalBody) |
592 | { | 614 | { |
615 | DetailLog("{0},BSPrim.ForceVelocity,taint,vel={1}", LocalID, _velocity); | ||
593 | PhysicsScene.PE.SetLinearVelocity(PhysBody, _velocity); | 616 | PhysicsScene.PE.SetLinearVelocity(PhysBody, _velocity); |
594 | ActivateIfPhysical(false); | 617 | ActivateIfPhysical(false); |
595 | } | 618 | } |
@@ -654,12 +677,7 @@ public sealed class BSPrim : BSPhysObject | |||
654 | 677 | ||
655 | PhysicsScene.TaintedObject("BSPrim.setOrientation", delegate() | 678 | PhysicsScene.TaintedObject("BSPrim.setOrientation", delegate() |
656 | { | 679 | { |
657 | if (PhysBody.HasPhysicalBody) | 680 | ForceOrientation = _orientation; |
658 | { | ||
659 | // _position = PhysicsScene.PE.GetObjectPosition(PhysicsScene.World, BSBody); | ||
660 | // DetailLog("{0},BSPrim.setOrientation,taint,pos={1},orient={2}", LocalID, _position, _orientation); | ||
661 | PhysicsScene.PE.SetTranslation(PhysBody, _position, _orientation); | ||
662 | } | ||
663 | }); | 681 | }); |
664 | } | 682 | } |
665 | } | 683 | } |
@@ -674,7 +692,8 @@ public sealed class BSPrim : BSPhysObject | |||
674 | set | 692 | set |
675 | { | 693 | { |
676 | _orientation = value; | 694 | _orientation = value; |
677 | PhysicsScene.PE.SetTranslation(PhysBody, _position, _orientation); | 695 | if (PhysBody.HasPhysicalBody) |
696 | PhysicsScene.PE.SetTranslation(PhysBody, _position + PositionDisplacement, _orientation); | ||
678 | } | 697 | } |
679 | } | 698 | } |
680 | public override int PhysicsActorType { | 699 | public override int PhysicsActorType { |
@@ -813,7 +832,7 @@ public sealed class BSPrim : BSPhysObject | |||
813 | // PhysicsScene.PE.ClearAllForces(BSBody); | 832 | // PhysicsScene.PE.ClearAllForces(BSBody); |
814 | 833 | ||
815 | // For good measure, make sure the transform is set through to the motion state | 834 | // For good measure, make sure the transform is set through to the motion state |
816 | PhysicsScene.PE.SetTranslation(PhysBody, _position, _orientation); | 835 | PhysicsScene.PE.SetTranslation(PhysBody, _position + PositionDisplacement, _orientation); |
817 | 836 | ||
818 | // Center of mass is at the center of the object | 837 | // Center of mass is at the center of the object |
819 | // DEBUG DEBUG PhysicsScene.PE.SetCenterOfMassByPosRot(Linkset.LinksetRoot.PhysBody, _position, _orientation); | 838 | // DEBUG DEBUG PhysicsScene.PE.SetCenterOfMassByPosRot(Linkset.LinksetRoot.PhysBody, _position, _orientation); |
@@ -1615,6 +1634,7 @@ public sealed class BSPrim : BSPhysObject | |||
1615 | } | 1634 | } |
1616 | 1635 | ||
1617 | // Assign directly to the local variables so the normal set actions do not happen | 1636 | // Assign directly to the local variables so the normal set actions do not happen |
1637 | entprop.Position -= PositionDisplacement; | ||
1618 | _position = entprop.Position; | 1638 | _position = entprop.Position; |
1619 | _orientation = entprop.Rotation; | 1639 | _orientation = entprop.Rotation; |
1620 | _velocity = entprop.Velocity; | 1640 | _velocity = entprop.Velocity; |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs index f0c6b99..addab29 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs | |||
@@ -906,7 +906,7 @@ public sealed class BSShapeCollection : IDisposable | |||
906 | } | 906 | } |
907 | } | 907 | } |
908 | 908 | ||
909 | // While we figure out the real problem, stick a simple native shape on the object. | 909 | // While we figure out the real problem, stick in a simple box for the object. |
910 | BulletShape fillinShape = | 910 | BulletShape fillinShape = |
911 | BuildPhysicalNativeShape(prim, BSPhysicsShapeType.SHAPE_BOX, FixedShapeKey.KEY_BOX); | 911 | BuildPhysicalNativeShape(prim, BSPhysicsShapeType.SHAPE_BOX, FixedShapeKey.KEY_BOX); |
912 | 912 | ||
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt index 1540dbb..59cbab9 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt +++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt | |||
@@ -170,6 +170,8 @@ Avatar attachments have no mass? http://forums-archive.secondlife.com/54/f0/3179 | |||
170 | 170 | ||
171 | INTERNAL IMPROVEMENT/CLEANUP | 171 | INTERNAL IMPROVEMENT/CLEANUP |
172 | ================================================= | 172 | ================================================= |
173 | Can the 'inTaintTime' flag be cleaned up and used? For instance, a call to | ||
174 | BSScene.TaintedObject() could immediately execute the callback if already in taint time. | ||
173 | Create the physical wrapper classes (BulletBody, BulletShape) by methods on | 175 | Create the physical wrapper classes (BulletBody, BulletShape) by methods on |
174 | BSAPITemplate and make their actual implementation Bullet engine specific. | 176 | BSAPITemplate and make their actual implementation Bullet engine specific. |
175 | For the short term, just call the existing functions in ShapeCollection. | 177 | For the short term, just call the existing functions in ShapeCollection. |