aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs')
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs25
1 files changed, 14 insertions, 11 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
index 2618971..648910a 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
@@ -144,34 +144,37 @@ public class BSShapeCollection : IDisposable
144 144
145 // Release the usage of a body. 145 // Release the usage of a body.
146 // Called when releasing use of a BSBody. BSShape is handled separately. 146 // Called when releasing use of a BSBody. BSShape is handled separately.
147 public void DereferenceBody(BulletBody shape, bool inTaintTime, BodyDestructionCallback bodyCallback ) 147 public void DereferenceBody(BulletBody body, bool inTaintTime, BodyDestructionCallback bodyCallback )
148 { 148 {
149 if (shape.ptr == IntPtr.Zero) 149 if (body.ptr == IntPtr.Zero)
150 return; 150 return;
151 151
152 lock (m_collectionActivityLock) 152 lock (m_collectionActivityLock)
153 { 153 {
154 BodyDesc bodyDesc; 154 BodyDesc bodyDesc;
155 if (Bodies.TryGetValue(shape.ID, out bodyDesc)) 155 if (Bodies.TryGetValue(body.ID, out bodyDesc))
156 { 156 {
157 bodyDesc.referenceCount--; 157 bodyDesc.referenceCount--;
158 bodyDesc.lastReferenced = System.DateTime.Now; 158 bodyDesc.lastReferenced = System.DateTime.Now;
159 Bodies[shape.ID] = bodyDesc; 159 Bodies[body.ID] = bodyDesc;
160 DetailLog("{0},BSShapeCollection.DereferenceBody,ref={1}", shape.ID, bodyDesc.referenceCount); 160 DetailLog("{0},BSShapeCollection.DereferenceBody,ref={1}", body.ID, bodyDesc.referenceCount);
161 161
162 // If body is no longer being used, free it -- bodies are never shared. 162 // If body is no longer being used, free it -- bodies are never shared.
163 if (bodyDesc.referenceCount == 0) 163 if (bodyDesc.referenceCount == 0)
164 { 164 {
165 Bodies.Remove(shape.ID); 165 Bodies.Remove(body.ID);
166 BSScene.TaintCallback removeOperation = delegate() 166 BSScene.TaintCallback removeOperation = delegate()
167 { 167 {
168 DetailLog("{0},BSShapeCollection.DereferenceBody,DestroyingBody. ptr={1}", 168 DetailLog("{0},BSShapeCollection.DereferenceBody,DestroyingBody. ptr={1}",
169 shape.ID, shape.ptr.ToString("X")); 169 body.ID, body.ptr.ToString("X"));
170 // If the caller needs to know, pass the event up.
171 if (bodyCallback != null) bodyCallback(body);
172
170 // Zero any reference to the shape so it is not freed when the body is deleted. 173 // Zero any reference to the shape so it is not freed when the body is deleted.
171 BulletSimAPI.SetCollisionShape2(PhysicsScene.World.ptr, shape.ptr, IntPtr.Zero); 174 BulletSimAPI.SetCollisionShape2(PhysicsScene.World.ptr, body.ptr, IntPtr.Zero);
172 // It may have already been removed from the world in which case the next is a NOOP. 175 // It may have already been removed from the world in which case the next is a NOOP.
173 BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.ptr, shape.ptr); 176 BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.ptr, body.ptr);
174 BulletSimAPI.DestroyObject2(PhysicsScene.World.ptr, shape.ptr); 177 BulletSimAPI.DestroyObject2(PhysicsScene.World.ptr, body.ptr);
175 }; 178 };
176 // If already in taint-time, do the operations now. Otherwise queue for later. 179 // If already in taint-time, do the operations now. Otherwise queue for later.
177 if (inTaintTime) 180 if (inTaintTime)
@@ -182,7 +185,7 @@ public class BSShapeCollection : IDisposable
182 } 185 }
183 else 186 else
184 { 187 {
185 DetailLog("{0},BSShapeCollection.DereferenceBody,DID NOT FIND BODY", shape.ID, bodyDesc.referenceCount); 188 DetailLog("{0},BSShapeCollection.DereferenceBody,DID NOT FIND BODY", body.ID, bodyDesc.referenceCount);
186 } 189 }
187 } 190 }
188 } 191 }