diff options
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/ScenePresence.cs | 18 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs | 5 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs | 5 | ||||
-rw-r--r-- | OpenSim/Region/Physics/Manager/PhysicsActor.cs | 8 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | 5 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 48 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 83 | ||||
-rw-r--r-- | OpenSim/Region/Physics/POSPlugin/POSPlugin.cs | 10 | ||||
-rw-r--r-- | OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs | 10 | ||||
-rw-r--r-- | bin/ode.dll | bin | 630784 -> 630784 bytes | |||
-rwxr-xr-x | bin/opensim-ode.sh | 5 |
12 files changed, 181 insertions, 18 deletions
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index c41979c..dbb4be0 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -737,7 +737,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
737 | m_statsReporter.addOtherMS(otherMS); | 737 | m_statsReporter.addOtherMS(otherMS); |
738 | m_statsReporter.SetActiveScripts(m_innerScene.GetActiveScripts()); | 738 | m_statsReporter.SetActiveScripts(m_innerScene.GetActiveScripts()); |
739 | m_statsReporter.addScriptLines(m_innerScene.GetScriptLPS()); | 739 | m_statsReporter.addScriptLines(m_innerScene.GetScriptLPS()); |
740 | 740 | m_log.Warn(physicsMS); | |
741 | } | 741 | } |
742 | catch (NotImplementedException) | 742 | catch (NotImplementedException) |
743 | { | 743 | { |
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index 5403fc7..61fce39 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs | |||
@@ -100,6 +100,9 @@ namespace OpenSim.Region.Environment.Scenes | |||
100 | private LLQuaternion m_headrotation = new LLQuaternion(); | 100 | private LLQuaternion m_headrotation = new LLQuaternion(); |
101 | private byte m_state = (byte) 0; | 101 | private byte m_state = (byte) 0; |
102 | 102 | ||
103 | //Reuse the LLVector3 instead of creating a new one on the UpdateMovement method | ||
104 | private LLVector3 movementvector = new LLVector3(); | ||
105 | |||
103 | private List<LLUUID> m_knownPrimUUID = new List<LLUUID>(); | 106 | private List<LLUUID> m_knownPrimUUID = new List<LLUUID>(); |
104 | 107 | ||
105 | // Agent's Draw distance. | 108 | // Agent's Draw distance. |
@@ -1660,8 +1663,19 @@ namespace OpenSim.Region.Environment.Scenes | |||
1660 | NewForce force = m_forcesList[i]; | 1663 | NewForce force = m_forcesList[i]; |
1661 | 1664 | ||
1662 | m_updateflag = true; | 1665 | m_updateflag = true; |
1663 | 1666 | try | |
1664 | Velocity = new LLVector3(force.X, force.Y, force.Z); | 1667 | { |
1668 | movementvector.X = force.X; | ||
1669 | movementvector.Y = force.Y; | ||
1670 | movementvector.Z = force.Z; | ||
1671 | Velocity = movementvector; | ||
1672 | } | ||
1673 | catch (System.NullReferenceException) | ||
1674 | { | ||
1675 | // Under extreme load, this returns a NullReference Exception that we can ignore. | ||
1676 | // Ignoring this causes no movement to be sent to the physics engine... | ||
1677 | // which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter! | ||
1678 | } | ||
1665 | m_newForce = true; | 1679 | m_newForce = true; |
1666 | } | 1680 | } |
1667 | for (int i = 0; i < m_forcesList.Count; i++) | 1681 | for (int i = 0; i < m_forcesList.Count; i++) |
diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs index 13b3f1a..b7ed417 100644 --- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs | |||
@@ -317,6 +317,11 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
317 | set { _velocity = value; } | 317 | set { _velocity = value; } |
318 | } | 318 | } |
319 | 319 | ||
320 | public override float CollisionScore | ||
321 | { | ||
322 | get { return 0f; } | ||
323 | } | ||
324 | |||
320 | public override Quaternion Orientation | 325 | public override Quaternion Orientation |
321 | { | 326 | { |
322 | get { return Quaternion.Identity; } | 327 | get { return Quaternion.Identity; } |
diff --git a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs index fb32f93..1080aa4 100644 --- a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs +++ b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs | |||
@@ -769,7 +769,10 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
769 | } | 769 | } |
770 | } | 770 | } |
771 | } | 771 | } |
772 | 772 | public override float CollisionScore | |
773 | { | ||
774 | get { return 0f; } | ||
775 | } | ||
773 | public override PhysicsVector Size | 776 | public override PhysicsVector Size |
774 | { | 777 | { |
775 | get { return _size; } | 778 | get { return _size; } |
diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs index f97b279..7741687 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs | |||
@@ -172,6 +172,8 @@ namespace OpenSim.Region.Physics.Manager | |||
172 | 172 | ||
173 | public abstract PhysicsVector Velocity { get; set; } | 173 | public abstract PhysicsVector Velocity { get; set; } |
174 | 174 | ||
175 | public abstract float CollisionScore { get;} | ||
176 | |||
175 | public abstract PhysicsVector Acceleration { get; } | 177 | public abstract PhysicsVector Acceleration { get; } |
176 | 178 | ||
177 | public abstract Quaternion Orientation { get; set; } | 179 | public abstract Quaternion Orientation { get; set; } |
@@ -272,6 +274,12 @@ namespace OpenSim.Region.Physics.Manager | |||
272 | set { return; } | 274 | set { return; } |
273 | } | 275 | } |
274 | 276 | ||
277 | public override float CollisionScore | ||
278 | { | ||
279 | get { return 0f; } | ||
280 | } | ||
281 | |||
282 | |||
275 | public override Quaternion Orientation | 283 | public override Quaternion Orientation |
276 | { | 284 | { |
277 | get { return Quaternion.Identity; } | 285 | get { return Quaternion.Identity; } |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index 98069a0..9b75fb8 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | |||
@@ -514,6 +514,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
514 | } | 514 | } |
515 | } | 515 | } |
516 | 516 | ||
517 | public override float CollisionScore | ||
518 | { | ||
519 | get { return 0f; } | ||
520 | } | ||
521 | |||
517 | public override bool Kinematic | 522 | public override bool Kinematic |
518 | { | 523 | { |
519 | get { return false; } | 524 | get { return false; } |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 5cdbb77..a063962 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | |||
@@ -55,6 +55,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
55 | private bool m_taintPhysics = false; | 55 | private bool m_taintPhysics = false; |
56 | public bool m_taintremove = false; | 56 | public bool m_taintremove = false; |
57 | public bool m_taintdisable = false; | 57 | public bool m_taintdisable = false; |
58 | public bool m_disabled = false; | ||
58 | 59 | ||
59 | private bool m_taintforce = false; | 60 | private bool m_taintforce = false; |
60 | private List<PhysicsVector> m_forcelist = new List<PhysicsVector>(); | 61 | private List<PhysicsVector> m_forcelist = new List<PhysicsVector>(); |
@@ -65,10 +66,15 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
65 | public IntPtr m_targetSpace = (IntPtr) 0; | 66 | public IntPtr m_targetSpace = (IntPtr) 0; |
66 | public IntPtr prim_geom; | 67 | public IntPtr prim_geom; |
67 | public IntPtr _triMeshData; | 68 | public IntPtr _triMeshData; |
69 | |||
68 | private bool iscolliding = false; | 70 | private bool iscolliding = false; |
69 | private bool m_isphysical = false; | 71 | private bool m_isphysical = false; |
70 | private bool m_throttleUpdates = false; | 72 | private bool m_throttleUpdates = false; |
71 | private int throttleCounter = 0; | 73 | private int throttleCounter = 0; |
74 | public int m_interpenetrationcount = 0; | ||
75 | public int m_collisionscore = 0; | ||
76 | public int m_roundsUnderMotionThreshold = 0; | ||
77 | |||
72 | public bool outofBounds = false; | 78 | public bool outofBounds = false; |
73 | private float m_density = 10.000006836f; // Aluminum g/cm3; | 79 | private float m_density = 10.000006836f; // Aluminum g/cm3; |
74 | 80 | ||
@@ -257,6 +263,10 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
257 | d.GeomSetBody(prim_geom, Body); | 263 | d.GeomSetBody(prim_geom, Body); |
258 | d.BodySetAutoDisableFlag(Body, true); | 264 | d.BodySetAutoDisableFlag(Body, true); |
259 | d.BodySetAutoDisableSteps(Body, 20); | 265 | d.BodySetAutoDisableSteps(Body, 20); |
266 | |||
267 | m_interpenetrationcount = 0; | ||
268 | m_collisionscore = 0; | ||
269 | m_disabled = false; | ||
260 | 270 | ||
261 | _parent_scene.addActivePrim(this); | 271 | _parent_scene.addActivePrim(this); |
262 | } | 272 | } |
@@ -383,6 +393,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
383 | d.BodyDestroy(Body); | 393 | d.BodyDestroy(Body); |
384 | Body = (IntPtr) 0; | 394 | Body = (IntPtr) 0; |
385 | } | 395 | } |
396 | m_disabled = true; | ||
397 | m_collisionscore = 0; | ||
386 | } | 398 | } |
387 | 399 | ||
388 | public void setMesh(OdeScene parent_scene, IMesh mesh) | 400 | public void setMesh(OdeScene parent_scene, IMesh mesh) |
@@ -425,7 +437,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
425 | if (IsPhysical && Body == (IntPtr) 0) | 437 | if (IsPhysical && Body == (IntPtr) 0) |
426 | { | 438 | { |
427 | // Recreate the body | 439 | // Recreate the body |
440 | m_interpenetrationcount = 0; | ||
441 | m_collisionscore = 0; | ||
442 | |||
428 | enableBody(); | 443 | enableBody(); |
444 | |||
429 | } | 445 | } |
430 | } | 446 | } |
431 | 447 | ||
@@ -485,7 +501,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
485 | _parent_scene.waitForSpaceUnlock(m_targetSpace); | 501 | _parent_scene.waitForSpaceUnlock(m_targetSpace); |
486 | d.SpaceAdd(m_targetSpace, prim_geom); | 502 | d.SpaceAdd(m_targetSpace, prim_geom); |
487 | } | 503 | } |
488 | 504 | resetCollisionAccounting(); | |
489 | m_taintposition = _position; | 505 | m_taintposition = _position; |
490 | } | 506 | } |
491 | 507 | ||
@@ -501,14 +517,23 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
501 | { | 517 | { |
502 | d.BodySetQuaternion(Body, ref myrot); | 518 | d.BodySetQuaternion(Body, ref myrot); |
503 | } | 519 | } |
504 | 520 | resetCollisionAccounting(); | |
505 | m_taintrot = _orientation; | 521 | m_taintrot = _orientation; |
506 | } | 522 | } |
507 | public void changedisable(float timestep) | 523 | |
524 | private void resetCollisionAccounting() | ||
508 | { | 525 | { |
526 | m_collisionscore = 0; | ||
527 | m_interpenetrationcount = 0; | ||
528 | m_disabled = false; | ||
529 | } | ||
530 | |||
531 | public void changedisable(float timestep) | ||
532 | { | ||
533 | m_disabled = true; | ||
509 | if (Body != (IntPtr) 0) | 534 | if (Body != (IntPtr) 0) |
510 | d.BodyDisable(Body); | 535 | d.BodyDisable(Body); |
511 | 536 | ||
512 | m_taintdisable = false; | 537 | m_taintdisable = false; |
513 | } | 538 | } |
514 | 539 | ||
@@ -528,8 +553,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
528 | disableBody(); | 553 | disableBody(); |
529 | } | 554 | } |
530 | } | 555 | } |
531 | 556 | resetCollisionAccounting(); | |
532 | |||
533 | m_taintPhysics = m_isphysical; | 557 | m_taintPhysics = m_isphysical; |
534 | } | 558 | } |
535 | 559 | ||
@@ -670,7 +694,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
670 | } | 694 | } |
671 | 695 | ||
672 | _parent_scene.geom_name_map[prim_geom] = oldname; | 696 | _parent_scene.geom_name_map[prim_geom] = oldname; |
673 | 697 | resetCollisionAccounting(); | |
674 | m_taintsize = _size; | 698 | m_taintsize = _size; |
675 | } | 699 | } |
676 | 700 | ||
@@ -724,7 +748,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
724 | d.GeomSetQuaternion(prim_geom, ref myrot); | 748 | d.GeomSetQuaternion(prim_geom, ref myrot); |
725 | } | 749 | } |
726 | _parent_scene.geom_name_map[prim_geom] = oldname; | 750 | _parent_scene.geom_name_map[prim_geom] = oldname; |
727 | 751 | resetCollisionAccounting(); | |
728 | m_taintshape = false; | 752 | m_taintshape = false; |
729 | } | 753 | } |
730 | 754 | ||
@@ -746,6 +770,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
746 | } | 770 | } |
747 | m_forcelist.Clear(); | 771 | m_forcelist.Clear(); |
748 | } | 772 | } |
773 | m_collisionscore = 0; | ||
774 | m_interpenetrationcount = 0; | ||
749 | m_taintforce = false; | 775 | m_taintforce = false; |
750 | 776 | ||
751 | } | 777 | } |
@@ -759,6 +785,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
759 | d.BodySetLinearVel(Body, m_taintVelocity.X, m_taintVelocity.Y, m_taintVelocity.Z); | 785 | d.BodySetLinearVel(Body, m_taintVelocity.X, m_taintVelocity.Y, m_taintVelocity.Z); |
760 | } | 786 | } |
761 | } | 787 | } |
788 | resetCollisionAccounting(); | ||
762 | m_taintVelocity = PhysicsVector.Zero; | 789 | m_taintVelocity = PhysicsVector.Zero; |
763 | } | 790 | } |
764 | public override bool IsPhysical | 791 | public override bool IsPhysical |
@@ -865,6 +892,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
865 | } | 892 | } |
866 | } | 893 | } |
867 | 894 | ||
895 | public override float CollisionScore | ||
896 | { | ||
897 | get { return m_collisionscore; } | ||
898 | } | ||
899 | |||
868 | public override bool Kinematic | 900 | public override bool Kinematic |
869 | { | 901 | { |
870 | get { return false; } | 902 | get { return false; } |
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) |
diff --git a/OpenSim/Region/Physics/POSPlugin/POSPlugin.cs b/OpenSim/Region/Physics/POSPlugin/POSPlugin.cs index 079e66a..5b132cf 100644 --- a/OpenSim/Region/Physics/POSPlugin/POSPlugin.cs +++ b/OpenSim/Region/Physics/POSPlugin/POSPlugin.cs | |||
@@ -446,6 +446,11 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
446 | set { _target_velocity = value; } | 446 | set { _target_velocity = value; } |
447 | } | 447 | } |
448 | 448 | ||
449 | public override float CollisionScore | ||
450 | { | ||
451 | get { return 0f; } | ||
452 | } | ||
453 | |||
449 | public override Quaternion Orientation | 454 | public override Quaternion Orientation |
450 | { | 455 | { |
451 | get { return Quaternion.Identity; } | 456 | get { return Quaternion.Identity; } |
@@ -579,6 +584,11 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
579 | set { _velocity = value; } | 584 | set { _velocity = value; } |
580 | } | 585 | } |
581 | 586 | ||
587 | public override float CollisionScore | ||
588 | { | ||
589 | get { return 0f; } | ||
590 | } | ||
591 | |||
582 | public override Quaternion Orientation | 592 | public override Quaternion Orientation |
583 | { | 593 | { |
584 | get { return _orientation; } | 594 | get { return _orientation; } |
diff --git a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs index 509bdfa..ad18507 100644 --- a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs +++ b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs | |||
@@ -325,6 +325,11 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
325 | set { _velocity = value; } | 325 | set { _velocity = value; } |
326 | } | 326 | } |
327 | 327 | ||
328 | public override float CollisionScore | ||
329 | { | ||
330 | get { return 0f; } | ||
331 | } | ||
332 | |||
328 | public override bool Kinematic | 333 | public override bool Kinematic |
329 | { | 334 | { |
330 | get { return false; } | 335 | get { return false; } |
@@ -503,6 +508,11 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
503 | set { _velocity = value; } | 508 | set { _velocity = value; } |
504 | } | 509 | } |
505 | 510 | ||
511 | public override float CollisionScore | ||
512 | { | ||
513 | get { return 0f; } | ||
514 | } | ||
515 | |||
506 | public override bool Kinematic | 516 | public override bool Kinematic |
507 | { | 517 | { |
508 | get { return _prim.Kinematic; } | 518 | get { return _prim.Kinematic; } |
diff --git a/bin/ode.dll b/bin/ode.dll index 7254a15..590dfa5 100644 --- a/bin/ode.dll +++ b/bin/ode.dll | |||
Binary files differ | |||
diff --git a/bin/opensim-ode.sh b/bin/opensim-ode.sh new file mode 100755 index 0000000..8635317 --- /dev/null +++ b/bin/opensim-ode.sh | |||
@@ -0,0 +1,5 @@ | |||
1 | #!/bin/sh | ||
2 | echo "Starting OpenSimulator with ODE. If you get an error saying limit: Operation not permitted. Then you will need to chmod 0600 /etc/limits" | ||
3 | ulimit -s 262144 | ||
4 | sleep 5 | ||
5 | mono OpenSim.exe -physics=OpenDynamicsEngine | ||