aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin/OdePlugin.cs')
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdePlugin.cs45
1 files changed, 28 insertions, 17 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index 66af095..5ff74dc 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -736,6 +736,7 @@ namespace OpenSim.Region.Physics.OdePlugin
736 /// <param name="prim"></param> 736 /// <param name="prim"></param>
737 public void RemovePrimThreadLocked(OdePrim prim) 737 public void RemovePrimThreadLocked(OdePrim prim)
738 { 738 {
739 prim.ResetTaints();
739 lock (OdeLock) 740 lock (OdeLock)
740 { 741 {
741 System.Threading.Thread.Sleep(20); 742 System.Threading.Thread.Sleep(20);
@@ -1237,31 +1238,39 @@ namespace OpenSim.Region.Physics.OdePlugin
1237 actor.Move(timeStep); 1238 actor.Move(timeStep);
1238 actor.collidelock = true; 1239 actor.collidelock = true;
1239 } 1240 }
1240 1241 if (!ode.lockquery())
1241 ode.dlock(world); 1242 {
1243 ode.dlock(world);
1242 1244
1243 collision_optimized(timeStep); 1245 collision_optimized(timeStep);
1244 1246
1245
1246 1247
1247 ode.dunlock(world); 1248
1248 1249
1249 try 1250
1250 { 1251 try
1251 d.WorldQuickStep(world, ODE_STEPSIZE); 1252 {
1253 d.WorldQuickStep(world, ODE_STEPSIZE);
1254 }
1255 catch (StackOverflowException)
1256 {
1257 d.WorldQuickStep(world, 0.001f);
1258 }
1259 d.JointGroupEmpty(contactgroup);
1260 ode.dunlock(world);
1261
1262 step_time -= ODE_STEPSIZE;
1263 i++;
1252 } 1264 }
1253 catch (StackOverflowException) 1265 else
1254 { 1266 {
1255 d.WorldQuickStep(world, 0.001f); 1267 fps = 0;
1256 } 1268 }
1257 d.JointGroupEmpty(contactgroup); 1269
1258 foreach (OdeCharacter actor in _characters) 1270 foreach (OdeCharacter actor in _characters)
1259 { 1271 {
1260 actor.collidelock = false; 1272 actor.collidelock = false;
1261 } 1273 }
1262
1263 step_time -= ODE_STEPSIZE;
1264 i++;
1265 } 1274 }
1266 1275
1267 foreach (OdeCharacter actor in _characters) 1276 foreach (OdeCharacter actor in _characters)
@@ -1273,12 +1282,14 @@ namespace OpenSim.Region.Physics.OdePlugin
1273 { 1282 {
1274 bool processedtaints = false; 1283 bool processedtaints = false;
1275 foreach (OdePrim prim in _taintedPrim) 1284 foreach (OdePrim prim in _taintedPrim)
1276 { 1285 {
1277 prim.ProcessTaints(timeStep);
1278 if (prim.m_taintremove) 1286 if (prim.m_taintremove)
1279 { 1287 {
1280 RemovePrimThreadLocked(prim); 1288 RemovePrimThreadLocked(prim);
1281 } 1289 }
1290
1291 prim.ProcessTaints(timeStep);
1292
1282 processedtaints = true; 1293 processedtaints = true;
1283 prim.m_collisionscore = 0; 1294 prim.m_collisionscore = 0;
1284 } 1295 }