aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs4
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs55
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs10
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSScene.cs9
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs31
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs14
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs3
7 files changed, 74 insertions, 52 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
index c23ccd5..2e6b2da 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
@@ -263,7 +263,7 @@ public class BSCharacter : BSPhysObject
263 // A version of the sanity check that also makes sure a new position value is 263 // A version of the sanity check that also makes sure a new position value is
264 // pushed back to the physics engine. This routine would be used by anyone 264 // pushed back to the physics engine. This routine would be used by anyone
265 // who is not already pushing the value. 265 // who is not already pushing the value.
266 private bool PositionSanityCheck2(bool atTaintTime) 266 private bool PositionSanityCheck2(bool inTaintTime)
267 { 267 {
268 bool ret = false; 268 bool ret = false;
269 if (PositionSanityCheck()) 269 if (PositionSanityCheck())
@@ -275,7 +275,7 @@ public class BSCharacter : BSPhysObject
275 DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation); 275 DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation);
276 BulletSimAPI.SetObjectTranslation(PhysicsScene.WorldID, LocalID, _position, _orientation); 276 BulletSimAPI.SetObjectTranslation(PhysicsScene.WorldID, LocalID, _position, _orientation);
277 }; 277 };
278 if (atTaintTime) 278 if (inTaintTime)
279 sanityOperation(); 279 sanityOperation();
280 else 280 else
281 PhysicsScene.TaintedObject("BSCharacter.PositionSanityCheck", sanityOperation); 281 PhysicsScene.TaintedObject("BSCharacter.PositionSanityCheck", sanityOperation);
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
index 20db4de..b84ccdc 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
@@ -160,6 +160,31 @@ public class BSLinkset
160 return ret; 160 return ret;
161 } 161 }
162 162
163 // When physical properties are changed the linkset needs to recalculate
164 // its internal properties.
165 // May be called at runtime or taint-time (just pass the appropriate flag).
166 public void Refresh(BSPhysObject requestor, bool inTaintTime)
167 {
168 // If there are no children, there can't be any constraints to recompute
169 if (!HasAnyChildren)
170 return;
171
172 // Only the root does the recomputation
173 if (IsRoot(requestor))
174 {
175 BSScene.TaintCallback refreshOperation = delegate()
176 {
177 RecomputeLinksetConstraintVariables();
178 DetailLog("{0},BSLinkset.Refresh,complete,rBody={1}",
179 LinksetRoot.LocalID, LinksetRoot.BSBody.ptr.ToString("X"));
180 };
181 if (inTaintTime)
182 refreshOperation();
183 else
184 PhysicsScene.TaintedObject("BSLinkSet.Refresh", refreshOperation);
185 }
186 }
187
163 // The object is going dynamic (physical). Do any setup necessary 188 // The object is going dynamic (physical). Do any setup necessary
164 // for a dynamic linkset. 189 // for a dynamic linkset.
165 // Only the state of the passed object can be modified. The rest of the linkset 190 // Only the state of the passed object can be modified. The rest of the linkset
@@ -182,24 +207,19 @@ public class BSLinkset
182 return false; 207 return false;
183 } 208 }
184 209
185 // When physical properties are changed the linkset needs to recalculate 210 // If the software is handling the movement of all the objects in a linkset
186 // its internal properties. 211 // (like if one doesn't use constraints for static linksets), this is called
187 // Called at runtime. 212 // when an update for the root of the linkset is received.
188 public void Refresh(BSPhysObject requestor) 213 // Called at taint-time!!
214 public void UpdateProperties(BSPhysObject physObject)
189 { 215 {
190 // If there are no children, there can't be any constraints to recompute 216 // The root local properties have been updated. Apply to the children if appropriate.
191 if (!HasAnyChildren) 217 if (IsRoot(physObject) && HasAnyChildren)
192 return;
193
194 // Only the root does the recomputation
195 if (IsRoot(requestor))
196 { 218 {
197 PhysicsScene.TaintedObject("BSLinkSet.Refresh", delegate() 219 if (!physObject.IsPhysical)
198 { 220 {
199 RecomputeLinksetConstraintVariables(); 221 // TODO: implement software linkset update for static object linksets
200 DetailLog("{0},BSLinkset.Refresh,complete,rBody={1}", 222 }
201 LinksetRoot.LocalID, LinksetRoot.BSBody.ptr.ToString("X"));
202 });
203 } 223 }
204 } 224 }
205 225
@@ -236,9 +256,8 @@ public class BSLinkset
236 return ret; 256 return ret;
237 } 257 }
238 258
239 // Routine used when rebuilding the body of the root of the linkset 259 // Companion to RemoveBodyDependencies(). If RemoveBodyDependencies() returns 'true',
240 // This is called after RemoveAllLinksToRoot() to restore all the constraints. 260 // this routine will restore the removed constraints.
241 // This is called when the root body has been changed.
242 // Called at taint-time!! 261 // Called at taint-time!!
243 public void RestoreBodyDependencies(BSPrim child) 262 public void RestoreBodyDependencies(BSPrim child)
244 { 263 {
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index d408be0..b26f049 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -327,7 +327,7 @@ public sealed class BSPrim : BSPhysObject
327 // A version of the sanity check that also makes sure a new position value is 327 // A version of the sanity check that also makes sure a new position value is
328 // pushed back to the physics engine. This routine would be used by anyone 328 // pushed back to the physics engine. This routine would be used by anyone
329 // who is not already pushing the value. 329 // who is not already pushing the value.
330 private bool PositionSanityCheck2(bool atTaintTime) 330 private bool PositionSanityCheck2(bool inTaintTime)
331 { 331 {
332 bool ret = false; 332 bool ret = false;
333 if (PositionSanityCheck()) 333 if (PositionSanityCheck())
@@ -339,7 +339,7 @@ public sealed class BSPrim : BSPhysObject
339 DetailLog("{0},BSPrim.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation); 339 DetailLog("{0},BSPrim.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation);
340 BulletSimAPI.SetObjectTranslation(PhysicsScene.WorldID, LocalID, _position, _orientation); 340 BulletSimAPI.SetObjectTranslation(PhysicsScene.WorldID, LocalID, _position, _orientation);
341 }; 341 };
342 if (atTaintTime) 342 if (inTaintTime)
343 sanityOperation(); 343 sanityOperation();
344 else 344 else
345 PhysicsScene.TaintedObject("BSPrim.PositionSanityCheck", sanityOperation); 345 PhysicsScene.TaintedObject("BSPrim.PositionSanityCheck", sanityOperation);
@@ -583,7 +583,7 @@ public sealed class BSPrim : BSPhysObject
583 // Set up the object physicalness (does gravity and collisions move this object) 583 // Set up the object physicalness (does gravity and collisions move this object)
584 MakeDynamic(IsStatic); 584 MakeDynamic(IsStatic);
585 585
586 // Update vehicle specific parameters 586 // Update vehicle specific parameters (after MakeDynamic() so can change physical parameters)
587 _vehicle.Refresh(); 587 _vehicle.Refresh();
588 588
589 // Arrange for collision events if the simulator wants them 589 // Arrange for collision events if the simulator wants them
@@ -606,7 +606,7 @@ public sealed class BSPrim : BSPhysObject
606 // Recompute any linkset parameters. 606 // Recompute any linkset parameters.
607 // When going from non-physical to physical, this re-enables the constraints that 607 // When going from non-physical to physical, this re-enables the constraints that
608 // had been automatically disabled when the mass was set to zero. 608 // had been automatically disabled when the mass was set to zero.
609 Linkset.Refresh(this); 609 Linkset.Refresh(this, true);
610 610
611 DetailLog("{0},BSPrim.UpdatePhysicalParameters,exit,static={1},solid={2},mass={3},collide={4},cf={5:X},body={6},shape={7}", 611 DetailLog("{0},BSPrim.UpdatePhysicalParameters,exit,static={1},solid={2},mass={3},collide={4},cf={5:X},body={6},shape={7}",
612 LocalID, IsStatic, IsSolid, _mass, SubscribedEvents(), CurrentCollisionFlags, BSBody, BSShape); 612 LocalID, IsStatic, IsSolid, _mass, SubscribedEvents(), CurrentCollisionFlags, BSBody, BSShape);
@@ -1322,6 +1322,8 @@ public sealed class BSPrim : BSPhysObject
1322 1322
1323 PositionSanityCheck2(true); 1323 PositionSanityCheck2(true);
1324 1324
1325 Linkset.UpdateProperties(this);
1326
1325 DetailLog("{0},BSPrim.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5}", 1327 DetailLog("{0},BSPrim.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5}",
1326 LocalID, _position, _orientation, _velocity, _acceleration, _rotationalVelocity); 1328 LocalID, _position, _orientation, _velocity, _acceleration, _rotationalVelocity);
1327 1329
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
index 33ac116..50091cc 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
@@ -39,7 +39,6 @@ using log4net;
39using OpenMetaverse; 39using OpenMetaverse;
40 40
41// TODOs for BulletSim (for BSScene, BSPrim, BSCharacter and BulletSim) 41// TODOs for BulletSim (for BSScene, BSPrim, BSCharacter and BulletSim)
42// Move all logic out of the C++ code and into the C# code for easier future modifications.
43// Test sculpties (verified that they don't work) 42// Test sculpties (verified that they don't work)
44// Compute physics FPS reasonably 43// Compute physics FPS reasonably
45// Based on material, set density and friction 44// Based on material, set density and friction
@@ -493,7 +492,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters
493 int numSubSteps = 0; 492 int numSubSteps = 0;
494 493
495 // DEBUG 494 // DEBUG
496 DetailLog("{0},BSScene.Simulate,beforeStep,ntaimts={1},step={2}", DetailLogZero, numTaints, m_simulationStep); 495 // DetailLog("{0},BSScene.Simulate,beforeStep,ntaimts={1},step={2}", DetailLogZero, numTaints, m_simulationStep);
497 496
498 try 497 try
499 { 498 {
@@ -503,8 +502,8 @@ public class BSScene : PhysicsScene, IPhysicsParameters
503 out updatedEntityCount, out updatedEntitiesPtr, out collidersCount, out collidersPtr); 502 out updatedEntityCount, out updatedEntitiesPtr, out collidersCount, out collidersPtr);
504 503
505 if (PhysicsLogging.Enabled) simTime = Util.EnvironmentTickCountSubtract(beforeTime); 504 if (PhysicsLogging.Enabled) simTime = Util.EnvironmentTickCountSubtract(beforeTime);
506 DetailLog("{0},Simulate,call, nTaints={1}, simTime={2}, substeps={3}, updates={4}, colliders={5}", 505 DetailLog("{0},Simulate,call, frame={1}, nTaints={2}, simTime={3}, substeps={4}, updates={5}, colliders={6}",
507 DetailLogZero, numTaints, simTime, numSubSteps, updatedEntityCount, collidersCount); 506 DetailLogZero, m_simulationStep, numTaints, simTime, numSubSteps, updatedEntityCount, collidersCount);
508 } 507 }
509 catch (Exception e) 508 catch (Exception e)
510 { 509 {
@@ -855,7 +854,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters
855 (s) => { return s.NumericBool(s.ShouldForceSimplePrimMeshing); }, 854 (s) => { return s.NumericBool(s.ShouldForceSimplePrimMeshing); },
856 (s,p,l,v) => { s.ShouldForceSimplePrimMeshing = s.BoolNumeric(v); } ), 855 (s,p,l,v) => { s.ShouldForceSimplePrimMeshing = s.BoolNumeric(v); } ),
857 new ParameterDefn("UseHullsForPhysicalObjects", "If true, create hulls for physical objects", 856 new ParameterDefn("UseHullsForPhysicalObjects", "If true, create hulls for physical objects",
858 ConfigurationParameters.numericFalse, 857 ConfigurationParameters.numericTrue,
859 (s,cf,p,v) => { s.ShouldUseHullsForPhysicalObjects = cf.GetBoolean(p, s.BoolNumeric(v)); }, 858 (s,cf,p,v) => { s.ShouldUseHullsForPhysicalObjects = cf.GetBoolean(p, s.BoolNumeric(v)); },
860 (s) => { return s.NumericBool(s.ShouldUseHullsForPhysicalObjects); }, 859 (s) => { return s.NumericBool(s.ShouldUseHullsForPhysicalObjects); },
861 (s,p,l,v) => { s.ShouldUseHullsForPhysicalObjects = s.BoolNumeric(v); } ), 860 (s,p,l,v) => { s.ShouldUseHullsForPhysicalObjects = s.BoolNumeric(v); } ),
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
index e619b48..d5e2172 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
@@ -67,8 +67,8 @@ public class BSShapeCollection : IDisposable
67 public DateTime lastReferenced; 67 public DateTime lastReferenced;
68 } 68 }
69 69
70 private Dictionary<ulong, MeshDesc> Meshes = new Dictionary<ulong, MeshDesc>(); 70 private Dictionary<System.UInt64, MeshDesc> Meshes = new Dictionary<System.UInt64, MeshDesc>();
71 private Dictionary<ulong, HullDesc> Hulls = new Dictionary<ulong, HullDesc>(); 71 private Dictionary<System.UInt64, HullDesc> Hulls = new Dictionary<System.UInt64, HullDesc>();
72 private Dictionary<uint, BodyDesc> Bodies = new Dictionary<uint, BodyDesc>(); 72 private Dictionary<uint, BodyDesc> Bodies = new Dictionary<uint, BodyDesc>();
73 73
74 public BSShapeCollection(BSScene physScene) 74 public BSShapeCollection(BSScene physScene)
@@ -121,7 +121,7 @@ public class BSShapeCollection : IDisposable
121 // Track another user of a body 121 // Track another user of a body
122 // We presume the caller has allocated the body. 122 // We presume the caller has allocated the body.
123 // Bodies only have one user so the reference count is either 1 or 0. 123 // Bodies only have one user so the reference count is either 1 or 0.
124 public void ReferenceBody(BulletBody body, bool atTaintTime) 124 public void ReferenceBody(BulletBody body, bool inTaintTime)
125 { 125 {
126 lock (m_collectionActivityLock) 126 lock (m_collectionActivityLock)
127 { 127 {
@@ -147,7 +147,7 @@ public class BSShapeCollection : IDisposable
147 body.ID, body); 147 body.ID, body);
148 } 148 }
149 }; 149 };
150 if (atTaintTime) 150 if (inTaintTime)
151 createOperation(); 151 createOperation();
152 else 152 else
153 PhysicsScene.TaintedObject("BSShapeCollection.ReferenceBody", createOperation); 153 PhysicsScene.TaintedObject("BSShapeCollection.ReferenceBody", createOperation);
@@ -272,7 +272,7 @@ public class BSShapeCollection : IDisposable
272 272
273 // Release the usage of a shape. 273 // Release the usage of a shape.
274 // The collisionObject is released since it is a copy of the real collision shape. 274 // The collisionObject is released since it is a copy of the real collision shape.
275 public void DereferenceShape(BulletShape shape, bool atTaintTime, ShapeDestructionCallback shapeCallback) 275 public void DereferenceShape(BulletShape shape, bool inTaintTime, ShapeDestructionCallback shapeCallback)
276 { 276 {
277 if (shape.ptr == IntPtr.Zero) 277 if (shape.ptr == IntPtr.Zero)
278 return; 278 return;
@@ -294,14 +294,14 @@ public class BSShapeCollection : IDisposable
294 if (shape.ptr != IntPtr.Zero & shape.isNativeShape) 294 if (shape.ptr != IntPtr.Zero & shape.isNativeShape)
295 { 295 {
296 DetailLog("{0},BSShapeCollection.DereferenceShape,deleteNativeShape,ptr={1},taintTime={2}", 296 DetailLog("{0},BSShapeCollection.DereferenceShape,deleteNativeShape,ptr={1},taintTime={2}",
297 BSScene.DetailLogZero, shape.ptr.ToString("X"), atTaintTime); 297 BSScene.DetailLogZero, shape.ptr.ToString("X"), inTaintTime);
298 if (shapeCallback != null) shapeCallback(shape); 298 if (shapeCallback != null) shapeCallback(shape);
299 BulletSimAPI.DeleteCollisionShape2(PhysicsScene.World.ptr, shape.ptr); 299 BulletSimAPI.DeleteCollisionShape2(PhysicsScene.World.ptr, shape.ptr);
300 } 300 }
301 break; 301 break;
302 } 302 }
303 }; 303 };
304 if (atTaintTime) 304 if (inTaintTime)
305 { 305 {
306 lock (m_collectionActivityLock) 306 lock (m_collectionActivityLock)
307 { 307 {
@@ -441,7 +441,7 @@ public class BSShapeCollection : IDisposable
441 441
442 // Native shapes are always built independently. 442 // Native shapes are always built independently.
443 newShape = new BulletShape(BulletSimAPI.BuildNativeShape2(PhysicsScene.World.ptr, shapeData), shapeType); 443 newShape = new BulletShape(BulletSimAPI.BuildNativeShape2(PhysicsScene.World.ptr, shapeData), shapeType);
444 newShape.shapeKey = (ulong)shapeKey; 444 newShape.shapeKey = (System.UInt64)shapeKey;
445 newShape.isNativeShape = true; 445 newShape.isNativeShape = true;
446 446
447 // Don't need to do a 'ReferenceShape()' here because native shapes are not tracked. 447 // Don't need to do a 'ReferenceShape()' here because native shapes are not tracked.
@@ -461,7 +461,7 @@ public class BSShapeCollection : IDisposable
461 BulletShape newShape = new BulletShape(IntPtr.Zero); 461 BulletShape newShape = new BulletShape(IntPtr.Zero);
462 462
463 float lod; 463 float lod;
464 ulong newMeshKey = ComputeShapeKey(shapeData, pbs, out lod); 464 System.UInt64 newMeshKey = ComputeShapeKey(shapeData, pbs, out lod);
465 465
466 // if this new shape is the same as last time, don't recreate the mesh 466 // if this new shape is the same as last time, don't recreate the mesh
467 if (newMeshKey == prim.BSShape.shapeKey && prim.BSShape.type == ShapeData.PhysicsShapeType.SHAPE_MESH) 467 if (newMeshKey == prim.BSShape.shapeKey && prim.BSShape.type == ShapeData.PhysicsShapeType.SHAPE_MESH)
@@ -484,7 +484,7 @@ public class BSShapeCollection : IDisposable
484 return true; // 'true' means a new shape has been added to this prim 484 return true; // 'true' means a new shape has been added to this prim
485 } 485 }
486 486
487 private BulletShape CreatePhysicalMesh(string objName, ulong newMeshKey, PrimitiveBaseShape pbs, OMV.Vector3 size, float lod) 487 private BulletShape CreatePhysicalMesh(string objName, System.UInt64 newMeshKey, PrimitiveBaseShape pbs, OMV.Vector3 size, float lod)
488 { 488 {
489 IMesh meshData = null; 489 IMesh meshData = null;
490 IntPtr meshPtr; 490 IntPtr meshPtr;
@@ -531,7 +531,7 @@ public class BSShapeCollection : IDisposable
531 BulletShape newShape; 531 BulletShape newShape;
532 532
533 float lod; 533 float lod;
534 ulong newHullKey = ComputeShapeKey(shapeData, pbs, out lod); 534 System.UInt64 newHullKey = ComputeShapeKey(shapeData, pbs, out lod);
535 535
536 // if the hull hasn't changed, don't rebuild it 536 // if the hull hasn't changed, don't rebuild it
537 if (newHullKey == prim.BSShape.shapeKey && prim.BSShape.type == ShapeData.PhysicsShapeType.SHAPE_HULL) 537 if (newHullKey == prim.BSShape.shapeKey && prim.BSShape.type == ShapeData.PhysicsShapeType.SHAPE_HULL)
@@ -554,7 +554,7 @@ public class BSShapeCollection : IDisposable
554 } 554 }
555 555
556 List<ConvexResult> m_hulls; 556 List<ConvexResult> m_hulls;
557 private BulletShape CreatePhysicalHull(string objName, ulong newHullKey, PrimitiveBaseShape pbs, OMV.Vector3 size, float lod) 557 private BulletShape CreatePhysicalHull(string objName, System.UInt64 newHullKey, PrimitiveBaseShape pbs, OMV.Vector3 size, float lod)
558 { 558 {
559 559
560 IntPtr hullPtr; 560 IntPtr hullPtr;
@@ -667,7 +667,7 @@ public class BSShapeCollection : IDisposable
667 667
668 // Create a hash of all the shape parameters to be used as a key 668 // Create a hash of all the shape parameters to be used as a key
669 // for this particular shape. 669 // for this particular shape.
670 private ulong ComputeShapeKey(ShapeData shapeData, PrimitiveBaseShape pbs, out float retLod) 670 private System.UInt64 ComputeShapeKey(ShapeData shapeData, PrimitiveBaseShape pbs, out float retLod)
671 { 671 {
672 // level of detail based on size and type of the object 672 // level of detail based on size and type of the object
673 float lod = PhysicsScene.MeshLOD; 673 float lod = PhysicsScene.MeshLOD;
@@ -680,10 +680,10 @@ public class BSShapeCollection : IDisposable
680 lod = PhysicsScene.MeshMegaPrimLOD; 680 lod = PhysicsScene.MeshMegaPrimLOD;
681 681
682 retLod = lod; 682 retLod = lod;
683 return (ulong)pbs.GetMeshKey(shapeData.Size, lod); 683 return pbs.GetMeshKey(shapeData.Size, lod);
684 } 684 }
685 // For those who don't want the LOD 685 // For those who don't want the LOD
686 private ulong ComputeShapeKey(ShapeData shapeData, PrimitiveBaseShape pbs) 686 private System.UInt64 ComputeShapeKey(ShapeData shapeData, PrimitiveBaseShape pbs)
687 { 687 {
688 float lod; 688 float lod;
689 return ComputeShapeKey(shapeData, pbs, out lod); 689 return ComputeShapeKey(shapeData, pbs, out lod);
@@ -717,6 +717,7 @@ public class BSShapeCollection : IDisposable
717 717
718 if (mustRebuild || forceRebuild) 718 if (mustRebuild || forceRebuild)
719 { 719 {
720 // Free any old body
720 DereferenceBody(prim.BSBody, true, bodyCallback); 721 DereferenceBody(prim.BSBody, true, bodyCallback);
721 722
722 BulletBody aBody; 723 BulletBody aBody;
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs b/OpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs
index 70aa429..2808603 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSTerrainManager.cs
@@ -201,10 +201,10 @@ public class BSTerrainManager
201 // The 'doNow' boolean says whether to do all the unmanaged activities right now (like when 201 // The 'doNow' boolean says whether to do all the unmanaged activities right now (like when
202 // calling this routine from initialization or taint-time routines) or whether to delay 202 // calling this routine from initialization or taint-time routines) or whether to delay
203 // all the unmanaged activities to taint-time. 203 // all the unmanaged activities to taint-time.
204 private void UpdateOrCreateTerrain(uint id, float[] heightMap, Vector3 minCoords, Vector3 maxCoords, bool atTaintTime) 204 private void UpdateOrCreateTerrain(uint id, float[] heightMap, Vector3 minCoords, Vector3 maxCoords, bool inTaintTime)
205 { 205 {
206 DetailLog("{0},BSTerrainManager.UpdateOrCreateTerrain,call,minC={1},maxC={2},atTaintTime={3}", 206 DetailLog("{0},BSTerrainManager.UpdateOrCreateTerrain,call,minC={1},maxC={2},inTaintTime={3}",
207 BSScene.DetailLogZero, minCoords, maxCoords, atTaintTime); 207 BSScene.DetailLogZero, minCoords, maxCoords, inTaintTime);
208 208
209 float minZ = float.MaxValue; 209 float minZ = float.MaxValue;
210 float maxZ = float.MinValue; 210 float maxZ = float.MinValue;
@@ -320,7 +320,9 @@ public class BSTerrainManager
320 BulletSimAPI.SetRestitution2(mapInfo.terrainBody.ptr, PhysicsScene.Params.terrainRestitution); 320 BulletSimAPI.SetRestitution2(mapInfo.terrainBody.ptr, PhysicsScene.Params.terrainRestitution);
321 BulletSimAPI.SetCollisionFlags2(mapInfo.terrainBody.ptr, CollisionFlags.CF_STATIC_OBJECT); 321 BulletSimAPI.SetCollisionFlags2(mapInfo.terrainBody.ptr, CollisionFlags.CF_STATIC_OBJECT);
322 322
323 BulletSimAPI.SetMassProps2(mapInfo.terrainBody.ptr, 0f, Vector3.Zero); 323 float terrainMass = 1000;
324 Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(mapInfo.terrainBody.ptr, terrainMass);
325 BulletSimAPI.SetMassProps2(mapInfo.terrainBody.ptr, terrainMass, localInertia);
324 BulletSimAPI.UpdateInertiaTensor2(mapInfo.terrainBody.ptr); 326 BulletSimAPI.UpdateInertiaTensor2(mapInfo.terrainBody.ptr);
325 327
326 // Return the new terrain to the world of physical objects 328 // Return the new terrain to the world of physical objects
@@ -342,7 +344,7 @@ public class BSTerrainManager
342 344
343 // There is the option to do the changes now (we're already in 'taint time'), or 345 // There is the option to do the changes now (we're already in 'taint time'), or
344 // to do the Bullet operations later. 346 // to do the Bullet operations later.
345 if (atTaintTime) 347 if (inTaintTime)
346 rebuildOperation(); 348 rebuildOperation();
347 else 349 else
348 PhysicsScene.TaintedObject("BSScene.UpdateOrCreateTerrain:UpdateExisting", rebuildOperation); 350 PhysicsScene.TaintedObject("BSScene.UpdateOrCreateTerrain:UpdateExisting", rebuildOperation);
@@ -381,7 +383,7 @@ public class BSTerrainManager
381 }; 383 };
382 384
383 // If already in taint-time, just call Bullet. Otherwise queue the operations for the safe time. 385 // If already in taint-time, just call Bullet. Otherwise queue the operations for the safe time.
384 if (atTaintTime) 386 if (inTaintTime)
385 createOperation(); 387 createOperation();
386 else 388 else
387 PhysicsScene.TaintedObject("BSScene.UpdateOrCreateTerrain:NewTerrain", createOperation); 389 PhysicsScene.TaintedObject("BSScene.UpdateOrCreateTerrain:NewTerrain", createOperation);
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs b/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs
index 7a60afb..e23fe5a 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs
@@ -101,9 +101,8 @@ public struct BulletShape
101 } 101 }
102 public IntPtr ptr; 102 public IntPtr ptr;
103 public ShapeData.PhysicsShapeType type; 103 public ShapeData.PhysicsShapeType type;
104 public ulong shapeKey; 104 public System.UInt64 shapeKey;
105 public bool isNativeShape; 105 public bool isNativeShape;
106 // Hulls have an underlying mesh. A pointer to it is hidden here.
107 public override string ToString() 106 public override string ToString()
108 { 107 {
109 StringBuilder buff = new StringBuilder(); 108 StringBuilder buff = new StringBuilder();