diff options
author | John Hurliman | 2009-10-28 12:45:40 -0700 |
---|---|---|
committer | John Hurliman | 2009-10-28 12:45:40 -0700 |
commit | a65c8cdc38f40a54ad4a14ed2e6168fb432c6e51 (patch) | |
tree | 5a770dcb901f9a3b51e3aaff1371990d3fdaf179 | |
parent | Fixed a bad check on velocity in the ODE near() callback (it was only checkin... (diff) | |
download | opensim-SC-a65c8cdc38f40a54ad4a14ed2e6168fb432c6e51.zip opensim-SC-a65c8cdc38f40a54ad4a14ed2e6168fb432c6e51.tar.gz opensim-SC-a65c8cdc38f40a54ad4a14ed2e6168fb432c6e51.tar.bz2 opensim-SC-a65c8cdc38f40a54ad4a14ed2e6168fb432c6e51.tar.xz |
* Reduce the velocity tolerance on sending terse updates to avoid slowly drifting prims/avatars
* Added contacts_per_collision to the ODE config section. This allows you to reduce the maximum number of contact points ODE will generate per collision and reduce the size of the array that stores contact structures
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 13 | ||||
-rw-r--r-- | bin/OpenSim.ini.example | 3 |
4 files changed, 15 insertions, 5 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index e1588ce..a99a802 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -2394,7 +2394,7 @@ if (m_shape != null) { | |||
2394 | /// </summary> | 2394 | /// </summary> |
2395 | public void SendScheduledUpdates() | 2395 | public void SendScheduledUpdates() |
2396 | { | 2396 | { |
2397 | const float VELOCITY_TOLERANCE = 0.01f; | 2397 | const float VELOCITY_TOLERANCE = 0.0001f; |
2398 | const float POSITION_TOLERANCE = 0.1f; | 2398 | const float POSITION_TOLERANCE = 0.1f; |
2399 | const int TIME_MS_TOLERANCE = 3000; | 2399 | const int TIME_MS_TOLERANCE = 3000; |
2400 | 2400 | ||
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 92f00c4..9ba19d3 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -2362,7 +2362,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2362 | 2362 | ||
2363 | public override void Update() | 2363 | public override void Update() |
2364 | { | 2364 | { |
2365 | const float VELOCITY_TOLERANCE = 0.01f; | 2365 | const float VELOCITY_TOLERANCE = 0.0001f; |
2366 | const float POSITION_TOLERANCE = 10.0f; | 2366 | const float POSITION_TOLERANCE = 10.0f; |
2367 | const int TIME_MS_TOLERANCE = 3000; | 2367 | const int TIME_MS_TOLERANCE = 3000; |
2368 | 2368 | ||
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index 8382233..6ca415b 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | |||
@@ -178,8 +178,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
178 | //private int m_returncollisions = 10; | 178 | //private int m_returncollisions = 10; |
179 | 179 | ||
180 | private readonly IntPtr contactgroup; | 180 | private readonly IntPtr contactgroup; |
181 | internal IntPtr LandGeom; | ||
182 | 181 | ||
182 | internal IntPtr LandGeom; | ||
183 | internal IntPtr WaterGeom; | 183 | internal IntPtr WaterGeom; |
184 | 184 | ||
185 | private float nmTerrainContactFriction = 255.0f; | 185 | private float nmTerrainContactFriction = 255.0f; |
@@ -251,7 +251,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
251 | private bool m_NINJA_physics_joints_enabled = false; | 251 | private bool m_NINJA_physics_joints_enabled = false; |
252 | //private Dictionary<String, IntPtr> jointpart_name_map = new Dictionary<String,IntPtr>(); | 252 | //private Dictionary<String, IntPtr> jointpart_name_map = new Dictionary<String,IntPtr>(); |
253 | private readonly Dictionary<String, List<PhysicsJoint>> joints_connecting_actor = new Dictionary<String, List<PhysicsJoint>>(); | 253 | private readonly Dictionary<String, List<PhysicsJoint>> joints_connecting_actor = new Dictionary<String, List<PhysicsJoint>>(); |
254 | private d.ContactGeom[] contacts = new d.ContactGeom[80]; | 254 | private d.ContactGeom[] contacts; |
255 | private readonly List<PhysicsJoint> requestedJointsToBeCreated = new List<PhysicsJoint>(); // lock only briefly. accessed by external code (to request new joints) and by OdeScene.Simulate() to move those joints into pending/active | 255 | private readonly List<PhysicsJoint> requestedJointsToBeCreated = new List<PhysicsJoint>(); // lock only briefly. accessed by external code (to request new joints) and by OdeScene.Simulate() to move those joints into pending/active |
256 | private readonly List<PhysicsJoint> pendingJoints = new List<PhysicsJoint>(); // can lock for longer. accessed only by OdeScene. | 256 | private readonly List<PhysicsJoint> pendingJoints = new List<PhysicsJoint>(); // can lock for longer. accessed only by OdeScene. |
257 | private readonly List<PhysicsJoint> activeJoints = new List<PhysicsJoint>(); // can lock for longer. accessed only by OdeScene. | 257 | private readonly List<PhysicsJoint> activeJoints = new List<PhysicsJoint>(); // can lock for longer. accessed only by OdeScene. |
@@ -397,6 +397,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
397 | avStandupTensor = 550000f; | 397 | avStandupTensor = 550000f; |
398 | } | 398 | } |
399 | 399 | ||
400 | int contactsPerCollision = 80; | ||
401 | |||
400 | if (m_config != null) | 402 | if (m_config != null) |
401 | { | 403 | { |
402 | IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"]; | 404 | IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"]; |
@@ -439,6 +441,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
439 | avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f); | 441 | avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f); |
440 | avCapsuleTilted = physicsconfig.GetBoolean("av_capsule_tilted", true); | 442 | avCapsuleTilted = physicsconfig.GetBoolean("av_capsule_tilted", true); |
441 | 443 | ||
444 | contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", 80); | ||
445 | |||
442 | geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3); | 446 | geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3); |
443 | geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15); | 447 | geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15); |
444 | geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5); | 448 | geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5); |
@@ -476,10 +480,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
476 | 480 | ||
477 | m_NINJA_physics_joints_enabled = physicsconfig.GetBoolean("use_NINJA_physics_joints", false); | 481 | m_NINJA_physics_joints_enabled = physicsconfig.GetBoolean("use_NINJA_physics_joints", false); |
478 | minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", 3f); | 482 | minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", 3f); |
479 | |||
480 | } | 483 | } |
481 | } | 484 | } |
482 | 485 | ||
486 | contacts = new d.ContactGeom[contactsPerCollision]; | ||
487 | |||
483 | staticPrimspace = new IntPtr[(int)(300 / metersInSpace), (int)(300 / metersInSpace)]; | 488 | staticPrimspace = new IntPtr[(int)(300 / metersInSpace), (int)(300 / metersInSpace)]; |
484 | 489 | ||
485 | // Centeral contact friction and bounce | 490 | // Centeral contact friction and bounce |
@@ -773,6 +778,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
773 | lock (contacts) | 778 | lock (contacts) |
774 | { | 779 | { |
775 | count = d.Collide(g1, g2, contacts.Length, contacts, d.ContactGeom.SizeOf); | 780 | count = d.Collide(g1, g2, contacts.Length, contacts, d.ContactGeom.SizeOf); |
781 | if (count > contacts.Length) | ||
782 | m_log.Error("[PHYSICS]: Got " + count + " contacts when we asked for a maximum of " + contacts.Length); | ||
776 | } | 783 | } |
777 | } | 784 | } |
778 | catch (SEHException) | 785 | catch (SEHException) |
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 43e6c85..63a9e11 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example | |||
@@ -577,6 +577,9 @@ | |||
577 | ; used to control llMove2Target | 577 | ; used to control llMove2Target |
578 | body_pid_derivative = 35 | 578 | body_pid_derivative = 35 |
579 | body_pid_gain = 25 | 579 | body_pid_gain = 25 |
580 | |||
581 | ; maximum number of contact points to generate per collision | ||
582 | contacts_per_collision = 80 | ||
580 | 583 | ||
581 | ; amount of time a geom/body will try to cross a region border before it gets disabled | 584 | ; amount of time a geom/body will try to cross a region border before it gets disabled |
582 | geom_crossing_failures_before_outofbounds = 5 | 585 | geom_crossing_failures_before_outofbounds = 5 |