aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdePlugin.cs83
1 files changed, 77 insertions, 6 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index 1aa141b..a2f354a 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -89,6 +89,9 @@ namespace OpenSim.Region.Physics.OdePlugin
89 private static float ODE_STEPSIZE = 0.020f; 89 private static float ODE_STEPSIZE = 0.020f;
90 private static bool RENDER_FLAG = false; 90 private static bool RENDER_FLAG = false;
91 private static float metersInSpace = 29.9f; 91 private static float metersInSpace = 29.9f;
92
93 private int interpenetrations_before_disable = 35;
94
92 private IntPtr contactgroup; 95 private IntPtr contactgroup;
93 private IntPtr LandGeom = (IntPtr) 0; 96 private IntPtr LandGeom = (IntPtr) 0;
94 private float[] _heightmap; 97 private float[] _heightmap;
@@ -109,13 +112,18 @@ namespace OpenSim.Region.Physics.OdePlugin
109 private d.Contact AvatarMovementprimContact; 112 private d.Contact AvatarMovementprimContact;
110 private d.Contact AvatarMovementTerrainContact; 113 private d.Contact AvatarMovementTerrainContact;
111 114
115
116
112 private int m_physicsiterations = 10; 117 private int m_physicsiterations = 10;
113 private float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag 118 private float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag
114 private PhysicsActor PANull = new NullPhysicsActor(); 119 private PhysicsActor PANull = new NullPhysicsActor();
115 private float step_time = 0.0f; 120 private float step_time = 0.0f;
121 private int ms = 0;
116 public IntPtr world; 122 public IntPtr world;
117 123
118 public IntPtr space; 124 public IntPtr space;
125
126 private IntPtr tmpSpace;
119 // split static geometry collision handling into spaces of 30 meters 127 // split static geometry collision handling into spaces of 30 meters
120 public IntPtr[,] staticPrimspace = new IntPtr[(int) (300/metersInSpace),(int) (300/metersInSpace)]; 128 public IntPtr[,] staticPrimspace = new IntPtr[(int) (300/metersInSpace),(int) (300/metersInSpace)];
121 129
@@ -206,6 +214,14 @@ namespace OpenSim.Region.Physics.OdePlugin
206 } 214 }
207 } 215 }
208 216
217 public void starttiming()
218 {
219 ms = Environment.TickCount;
220 }
221 public int stoptiming()
222 {
223 return Environment.TickCount - ms;
224 }
209 // Initialize the mesh plugin 225 // Initialize the mesh plugin
210 public override void Initialise(IMesher meshmerizer) 226 public override void Initialise(IMesher meshmerizer)
211 { 227 {
@@ -311,6 +327,7 @@ namespace OpenSim.Region.Physics.OdePlugin
311 327
312 for (int i = 0; i < count; i++) 328 for (int i = 0; i < count; i++)
313 { 329 {
330 //m_log.Warn("[CCOUNT]: " + count);
314 IntPtr joint; 331 IntPtr joint;
315 // If we're colliding with terrain, use 'TerrainContact' instead of contact. 332 // If we're colliding with terrain, use 'TerrainContact' instead of contact.
316 // allows us to have different settings 333 // allows us to have different settings
@@ -405,13 +422,46 @@ namespace OpenSim.Region.Physics.OdePlugin
405 // If you interpenetrate a prim with another prim 422 // If you interpenetrate a prim with another prim
406 if (p1.PhysicsActorType == (int) ActorTypes.Prim && p2.PhysicsActorType == (int) ActorTypes.Prim) 423 if (p1.PhysicsActorType == (int) ActorTypes.Prim && p2.PhysicsActorType == (int) ActorTypes.Prim)
407 { 424 {
408 if (contacts[i].depth >= 0.25f) 425 OdePrim op1 = (OdePrim)p1;
426 OdePrim op2 = (OdePrim)p2;
427 op1.m_collisionscore++;
428 op2.m_collisionscore++;
429
430
431 if (op1.m_collisionscore > 80 || op2.m_collisionscore > 80)
409 { 432 {
410 // Don't collide, one or both prim will explode. 433 op1.m_taintdisable = true;
411 ((OdePrim)p1).m_taintdisable = true;
412 AddPhysicsActorTaint(p1); 434 AddPhysicsActorTaint(p1);
413 ((OdePrim)p2).m_taintdisable = true; 435 op2.m_taintdisable = true;
414 AddPhysicsActorTaint(p2); 436 AddPhysicsActorTaint(p2);
437 }
438
439 if (contacts[i].depth >= 0.25f)
440 {
441 // Don't collide, one or both prim will explode.
442
443
444 op1.m_interpenetrationcount++;
445 op2.m_interpenetrationcount++;
446 interpenetrations_before_disable = 20;
447 if (op1.m_interpenetrationcount >= interpenetrations_before_disable)
448 {
449 op1.m_taintdisable = true;
450 AddPhysicsActorTaint(p1);
451 }
452 if (op2.m_interpenetrationcount >= interpenetrations_before_disable)
453 {
454 op2.m_taintdisable = true;
455 AddPhysicsActorTaint(p2);
456 }
457
458
459 //contacts[i].depth = contacts[i].depth / 8f;
460 //contacts[i].normal = new d.Vector3(0, 0, 1);
461 }
462 if (op1.m_disabled || op2.m_disabled)
463 {
464 //Manually disabled objects stay disabled
415 contacts[i].depth = 0f; 465 contacts[i].depth = 0f;
416 } 466 }
417 } 467 }
@@ -531,6 +581,7 @@ namespace OpenSim.Region.Physics.OdePlugin
531 /// <param name="timeStep"></param> 581 /// <param name="timeStep"></param>
532 private void collision_optimized(float timeStep) 582 private void collision_optimized(float timeStep)
533 { 583 {
584 starttiming();
534 foreach (OdeCharacter chr in _characters) 585 foreach (OdeCharacter chr in _characters)
535 { 586 {
536 // Reset the collision values to false 587 // Reset the collision values to false
@@ -554,6 +605,7 @@ namespace OpenSim.Region.Physics.OdePlugin
554 //forcedZ = true; 605 //forcedZ = true;
555 //} 606 //}
556 } 607 }
608 int avms = stoptiming();
557 609
558 // If the sim is running slow this frame, 610 // If the sim is running slow this frame,
559 // don't process collision for prim! 611 // don't process collision for prim!
@@ -562,9 +614,11 @@ namespace OpenSim.Region.Physics.OdePlugin
562 foreach (OdePrim chr in _activeprims) 614 foreach (OdePrim chr in _activeprims)
563 { 615 {
564 // This if may not need to be there.. it might be skipped anyway. 616 // This if may not need to be there.. it might be skipped anyway.
565 if (d.BodyIsEnabled(chr.Body)) 617 if (d.BodyIsEnabled(chr.Body) && (!chr.m_disabled))
566 { 618 {
619
567 d.SpaceCollide2(space, chr.prim_geom, IntPtr.Zero, nearCallback); 620 d.SpaceCollide2(space, chr.prim_geom, IntPtr.Zero, nearCallback);
621 //calculateSpaceForGeom(chr.Position)
568 //foreach (OdePrim ch2 in _prims) 622 //foreach (OdePrim ch2 in _prims)
569 /// should be a separate space -- lots of avatars will be N**2 slow 623 /// should be a separate space -- lots of avatars will be N**2 slow
570 //{ 624 //{
@@ -580,6 +634,7 @@ namespace OpenSim.Region.Physics.OdePlugin
580 //} 634 //}
581 //} 635 //}
582 } 636 }
637 d.SpaceCollide2(LandGeom, chr.prim_geom, IntPtr.Zero, nearCallback);
583 } 638 }
584 } 639 }
585 else 640 else
@@ -593,6 +648,9 @@ namespace OpenSim.Region.Physics.OdePlugin
593 { 648 {
594 // Collide test the prims with the terrain.. since if you don't do this, 649 // Collide test the prims with the terrain.. since if you don't do this,
595 // next frame, all of the physical prim in the scene will awaken and explode upwards 650 // next frame, all of the physical prim in the scene will awaken and explode upwards
651 tmpSpace = calculateSpaceForGeom(chr.Position);
652 if (tmpSpace != (IntPtr) 0 && d.GeomIsSpace(tmpSpace))
653 d.SpaceCollide2(calculateSpaceForGeom(chr.Position), chr.prim_geom, IntPtr.Zero, nearCallback);
596 d.SpaceCollide2(LandGeom, chr.prim_geom, IntPtr.Zero, nearCallback); 654 d.SpaceCollide2(LandGeom, chr.prim_geom, IntPtr.Zero, nearCallback);
597 } 655 }
598 } 656 }
@@ -1140,7 +1198,14 @@ namespace OpenSim.Region.Physics.OdePlugin
1140 } 1198 }
1141 1199
1142 collision_optimized(timeStep); 1200 collision_optimized(timeStep);
1143 d.WorldQuickStep(world, ODE_STEPSIZE); 1201 try
1202 {
1203 d.WorldQuickStep(world, ODE_STEPSIZE);
1204 }
1205 catch (StackOverflowException)
1206 {
1207 d.WorldQuickStep(world, 0.001f);
1208 }
1144 d.JointGroupEmpty(contactgroup); 1209 d.JointGroupEmpty(contactgroup);
1145 foreach (OdeCharacter actor in _characters) 1210 foreach (OdeCharacter actor in _characters)
1146 { 1211 {
@@ -1165,6 +1230,12 @@ namespace OpenSim.Region.Physics.OdePlugin
1165 RemovePrimThreadLocked(prim); 1230 RemovePrimThreadLocked(prim);
1166 } 1231 }
1167 processedtaints = true; 1232 processedtaints = true;
1233 prim.m_collisionscore = 0;
1234 }
1235
1236 foreach (OdePrim prim in _activeprims)
1237 {
1238 prim.m_collisionscore = 0;
1168 } 1239 }
1169 1240
1170 if (processedtaints) 1241 if (processedtaints)