aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs27
1 files changed, 13 insertions, 14 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
index cd77581..2b652f5 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
@@ -45,7 +45,7 @@ public sealed class BSShapeCollection : IDisposable
45 // Description of a Mesh 45 // Description of a Mesh
46 private struct MeshDesc 46 private struct MeshDesc
47 { 47 {
48 public IntPtr ptr; 48 public BulletShape shape;
49 public int referenceCount; 49 public int referenceCount;
50 public DateTime lastReferenced; 50 public DateTime lastReferenced;
51 public UInt64 shapeKey; 51 public UInt64 shapeKey;
@@ -55,7 +55,7 @@ public sealed class BSShapeCollection : IDisposable
55 // Meshes and hulls have the same shape hash key but we only need hulls for efficient collision calculations. 55 // Meshes and hulls have the same shape hash key but we only need hulls for efficient collision calculations.
56 private struct HullDesc 56 private struct HullDesc
57 { 57 {
58 public IntPtr ptr; 58 public BulletShape shape;
59 public int referenceCount; 59 public int referenceCount;
60 public DateTime lastReferenced; 60 public DateTime lastReferenced;
61 public UInt64 shapeKey; 61 public UInt64 shapeKey;
@@ -173,7 +173,7 @@ public sealed class BSShapeCollection : IDisposable
173 } 173 }
174 174
175 // Zero any reference to the shape so it is not freed when the body is deleted. 175 // Zero any reference to the shape so it is not freed when the body is deleted.
176 PhysicsScene.PE.SetCollisionShape(PhysicsScene.World, body, new BulletShape()); 176 PhysicsScene.PE.SetCollisionShape(PhysicsScene.World, body, null);
177 PhysicsScene.PE.DestroyObject(PhysicsScene.World, body); 177 PhysicsScene.PE.DestroyObject(PhysicsScene.World, body);
178 }); 178 });
179 } 179 }
@@ -202,7 +202,7 @@ public sealed class BSShapeCollection : IDisposable
202 else 202 else
203 { 203 {
204 // This is a new reference to a mesh 204 // This is a new reference to a mesh
205 meshDesc.ptr = shape.ptr; 205 meshDesc.shape = shape.Clone();
206 meshDesc.shapeKey = shape.shapeKey; 206 meshDesc.shapeKey = shape.shapeKey;
207 // We keep a reference to the underlying IMesh data so a hull can be built 207 // We keep a reference to the underlying IMesh data so a hull can be built
208 meshDesc.referenceCount = 1; 208 meshDesc.referenceCount = 1;
@@ -225,7 +225,7 @@ public sealed class BSShapeCollection : IDisposable
225 else 225 else
226 { 226 {
227 // This is a new reference to a hull 227 // This is a new reference to a hull
228 hullDesc.ptr = shape.ptr; 228 hullDesc.shape = shape.Clone();
229 hullDesc.shapeKey = shape.shapeKey; 229 hullDesc.shapeKey = shape.shapeKey;
230 hullDesc.referenceCount = 1; 230 hullDesc.referenceCount = 1;
231 if (DDetail) DetailLog("{0},BSShapeCollection.ReferenceShape,newHull,key={1},cnt={2}", 231 if (DDetail) DetailLog("{0},BSShapeCollection.ReferenceShape,newHull,key={1},cnt={2}",
@@ -361,15 +361,14 @@ public sealed class BSShapeCollection : IDisposable
361 MeshDesc meshDesc; 361 MeshDesc meshDesc;
362 HullDesc hullDesc; 362 HullDesc hullDesc;
363 363
364 IntPtr cShape = shapeInfo.ptr; 364 if (TryGetMeshByPtr(shapeInfo, out meshDesc))
365 if (TryGetMeshByPtr(cShape, out meshDesc))
366 { 365 {
367 shapeInfo.type = BSPhysicsShapeType.SHAPE_MESH; 366 shapeInfo.type = BSPhysicsShapeType.SHAPE_MESH;
368 shapeInfo.shapeKey = meshDesc.shapeKey; 367 shapeInfo.shapeKey = meshDesc.shapeKey;
369 } 368 }
370 else 369 else
371 { 370 {
372 if (TryGetHullByPtr(cShape, out hullDesc)) 371 if (TryGetHullByPtr(shapeInfo, out hullDesc))
373 { 372 {
374 shapeInfo.type = BSPhysicsShapeType.SHAPE_HULL; 373 shapeInfo.type = BSPhysicsShapeType.SHAPE_HULL;
375 shapeInfo.shapeKey = hullDesc.shapeKey; 374 shapeInfo.shapeKey = hullDesc.shapeKey;
@@ -632,7 +631,7 @@ public sealed class BSShapeCollection : IDisposable
632 if (Meshes.TryGetValue(newMeshKey, out meshDesc)) 631 if (Meshes.TryGetValue(newMeshKey, out meshDesc))
633 { 632 {
634 // If the mesh has already been built just use it. 633 // If the mesh has already been built just use it.
635 newShape = new BulletShape(meshDesc.ptr, BSPhysicsShapeType.SHAPE_MESH); 634 newShape = meshDesc.shape.Clone();
636 } 635 }
637 else 636 else
638 { 637 {
@@ -703,7 +702,7 @@ public sealed class BSShapeCollection : IDisposable
703 if (Hulls.TryGetValue(newHullKey, out hullDesc)) 702 if (Hulls.TryGetValue(newHullKey, out hullDesc))
704 { 703 {
705 // If the hull shape already is created, just use it. 704 // If the hull shape already is created, just use it.
706 newShape = new BulletShape(hullDesc.ptr, BSPhysicsShapeType.SHAPE_HULL); 705 newShape = hullDesc.shape.Clone();
707 } 706 }
708 else 707 else
709 { 708 {
@@ -965,13 +964,13 @@ public sealed class BSShapeCollection : IDisposable
965 return ret; 964 return ret;
966 } 965 }
967 966
968 private bool TryGetMeshByPtr(IntPtr addr, out MeshDesc outDesc) 967 private bool TryGetMeshByPtr(BulletShape shape, out MeshDesc outDesc)
969 { 968 {
970 bool ret = false; 969 bool ret = false;
971 MeshDesc foundDesc = new MeshDesc(); 970 MeshDesc foundDesc = new MeshDesc();
972 foreach (MeshDesc md in Meshes.Values) 971 foreach (MeshDesc md in Meshes.Values)
973 { 972 {
974 if (md.ptr == addr) 973 if (md.shape.ReferenceSame(shape))
975 { 974 {
976 foundDesc = md; 975 foundDesc = md;
977 ret = true; 976 ret = true;
@@ -983,13 +982,13 @@ public sealed class BSShapeCollection : IDisposable
983 return ret; 982 return ret;
984 } 983 }
985 984
986 private bool TryGetHullByPtr(IntPtr addr, out HullDesc outDesc) 985 private bool TryGetHullByPtr(BulletShape shape, out HullDesc outDesc)
987 { 986 {
988 bool ret = false; 987 bool ret = false;
989 HullDesc foundDesc = new HullDesc(); 988 HullDesc foundDesc = new HullDesc();
990 foreach (HullDesc hd in Hulls.Values) 989 foreach (HullDesc hd in Hulls.Values)
991 { 990 {
992 if (hd.ptr == addr) 991 if (hd.shape.ReferenceSame(shape))
993 { 992 {
994 foundDesc = hd; 993 foundDesc = hd;
995 ret = true; 994 ret = true;