diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs index 5f6601d..dc1de6c 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs | |||
@@ -206,7 +206,7 @@ public class BSLinkset | |||
206 | // its internal properties. | 206 | // its internal properties. |
207 | public void Refresh(BSPhysObject requestor) | 207 | public void Refresh(BSPhysObject requestor) |
208 | { | 208 | { |
209 | // If there are no children, there aren't any constraints to recompute | 209 | // If there are no children, there can't be any constraints to recompute |
210 | if (!HasAnyChildren) | 210 | if (!HasAnyChildren) |
211 | return; | 211 | return; |
212 | 212 | ||
@@ -225,11 +225,12 @@ public class BSLinkset | |||
225 | // from a linkset to make sure the constraints know about the new mass and | 225 | // from a linkset to make sure the constraints know about the new mass and |
226 | // geometry. | 226 | // geometry. |
227 | // Must only be called at taint time!! | 227 | // Must only be called at taint time!! |
228 | private bool RecomputeLinksetConstraintVariables() | 228 | private void RecomputeLinksetConstraintVariables() |
229 | { | 229 | { |
230 | float linksetMass = LinksetMass; | 230 | float linksetMass = LinksetMass; |
231 | lock (m_linksetActivityLock) | 231 | lock (m_linksetActivityLock) |
232 | { | 232 | { |
233 | bool somethingMissing = false; | ||
233 | foreach (BSPhysObject child in m_children) | 234 | foreach (BSPhysObject child in m_children) |
234 | { | 235 | { |
235 | BSConstraint constrain; | 236 | BSConstraint constrain; |
@@ -241,16 +242,29 @@ public class BSLinkset | |||
241 | } | 242 | } |
242 | else | 243 | else |
243 | { | 244 | { |
244 | // Non-fatal error that can happen when children are being added to the linkset but | 245 | // Non-fatal error that happens when children are being added to the linkset but |
245 | // their constraints have not been created yet. | 246 | // their constraints have not been created yet. |
246 | // Caused by the fact that m_children is built at run time but building constraints | 247 | // Caused by the fact that m_children is built at run time but building constraints |
247 | // happens at taint time. | 248 | // happens at taint time. |
248 | // m_physicsScene.Logger.ErrorFormat("{0} RecomputeLinksetConstraintVariables: constraint not found for root={1}, child={2}", | 249 | somethingMissing = true; |
249 | // LogHeader, m_linksetRoot.Body.ID, child.Body.ID); | 250 | break; |
250 | } | 251 | } |
251 | } | 252 | } |
253 | |||
254 | // If the whole linkset is not here, doesn't make sense to recompute the root prim now. | ||
255 | if (!somethingMissing) | ||
256 | { | ||
257 | // The root prim takes on the weight of the whole linkset | ||
258 | /* | ||
259 | OMV.Vector3 inertia = BulletSimAPI.CalculateLocalInertia2(LinksetRoot.BSShape.Ptr, linksetMass); | ||
260 | BulletSimAPI.SetMassProps2(LinksetRoot.BSBody.Ptr, linksetMass, inertia); | ||
261 | OMV.Vector3 centerOfMass = ComputeLinksetCenterOfMass(); | ||
262 | BulletSimAPI.SetCenterOfMassByPosRot2(LinksetRoot.BSBody.Ptr, centerOfMass, OMV.Quaternion.Identity); | ||
263 | BulletSimAPI.UpdateInertiaTensor2(LinksetRoot.BSBody.Ptr); | ||
264 | */ | ||
265 | } | ||
252 | } | 266 | } |
253 | return false; | 267 | return; |
254 | } | 268 | } |
255 | 269 | ||
256 | // I am the root of a linkset and a new child is being added | 270 | // I am the root of a linkset and a new child is being added |
@@ -296,9 +310,9 @@ public class BSLinkset | |||
296 | DetailLog("{0},RemoveChildFromLinkset,taint,child={1}", m_linksetRoot.LocalID, child.LocalID); | 310 | DetailLog("{0},RemoveChildFromLinkset,taint,child={1}", m_linksetRoot.LocalID, child.LocalID); |
297 | 311 | ||
298 | PhysicallyUnlinkAChildFromRoot(rootx, childx); | 312 | PhysicallyUnlinkAChildFromRoot(rootx, childx); |
313 | RecomputeLinksetConstraintVariables(); | ||
299 | }); | 314 | }); |
300 | 315 | ||
301 | RecomputeLinksetConstraintVariables(); | ||
302 | } | 316 | } |
303 | else | 317 | else |
304 | { | 318 | { |
@@ -377,6 +391,10 @@ public class BSLinkset | |||
377 | PhysicsScene.Params.linkConstraintTransMotorMaxVel, | 391 | PhysicsScene.Params.linkConstraintTransMotorMaxVel, |
378 | PhysicsScene.Params.linkConstraintTransMotorMaxForce); | 392 | PhysicsScene.Params.linkConstraintTransMotorMaxForce); |
379 | constrain.SetCFMAndERP(PhysicsScene.Params.linkConstraintCFM, PhysicsScene.Params.linkConstraintERP); | 393 | constrain.SetCFMAndERP(PhysicsScene.Params.linkConstraintCFM, PhysicsScene.Params.linkConstraintERP); |
394 | if (PhysicsScene.Params.linkConstraintSolverIterations != 0f) | ||
395 | { | ||
396 | constrain.SetSolverIterations(PhysicsScene.Params.linkConstraintSolverIterations); | ||
397 | } | ||
380 | 398 | ||
381 | RecomputeLinksetConstraintVariables(); | 399 | RecomputeLinksetConstraintVariables(); |
382 | } | 400 | } |