* 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 structures0.6.8-post-fixes
parent
ee0f7e10c8
commit
a65c8cdc38
|
@ -2394,7 +2394,7 @@ if (m_shape != null) {
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SendScheduledUpdates()
|
public void SendScheduledUpdates()
|
||||||
{
|
{
|
||||||
const float VELOCITY_TOLERANCE = 0.01f;
|
const float VELOCITY_TOLERANCE = 0.0001f;
|
||||||
const float POSITION_TOLERANCE = 0.1f;
|
const float POSITION_TOLERANCE = 0.1f;
|
||||||
const int TIME_MS_TOLERANCE = 3000;
|
const int TIME_MS_TOLERANCE = 3000;
|
||||||
|
|
||||||
|
|
|
@ -2362,7 +2362,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public override void Update()
|
public override void Update()
|
||||||
{
|
{
|
||||||
const float VELOCITY_TOLERANCE = 0.01f;
|
const float VELOCITY_TOLERANCE = 0.0001f;
|
||||||
const float POSITION_TOLERANCE = 10.0f;
|
const float POSITION_TOLERANCE = 10.0f;
|
||||||
const int TIME_MS_TOLERANCE = 3000;
|
const int TIME_MS_TOLERANCE = 3000;
|
||||||
|
|
||||||
|
|
|
@ -178,8 +178,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
//private int m_returncollisions = 10;
|
//private int m_returncollisions = 10;
|
||||||
|
|
||||||
private readonly IntPtr contactgroup;
|
private readonly IntPtr contactgroup;
|
||||||
internal IntPtr LandGeom;
|
|
||||||
|
|
||||||
|
internal IntPtr LandGeom;
|
||||||
internal IntPtr WaterGeom;
|
internal IntPtr WaterGeom;
|
||||||
|
|
||||||
private float nmTerrainContactFriction = 255.0f;
|
private float nmTerrainContactFriction = 255.0f;
|
||||||
|
@ -251,7 +251,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
private bool m_NINJA_physics_joints_enabled = false;
|
private bool m_NINJA_physics_joints_enabled = false;
|
||||||
//private Dictionary<String, IntPtr> jointpart_name_map = new Dictionary<String,IntPtr>();
|
//private Dictionary<String, IntPtr> jointpart_name_map = new Dictionary<String,IntPtr>();
|
||||||
private readonly Dictionary<String, List<PhysicsJoint>> joints_connecting_actor = new Dictionary<String, List<PhysicsJoint>>();
|
private readonly Dictionary<String, List<PhysicsJoint>> joints_connecting_actor = new Dictionary<String, List<PhysicsJoint>>();
|
||||||
private d.ContactGeom[] contacts = new d.ContactGeom[80];
|
private d.ContactGeom[] contacts;
|
||||||
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
|
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
|
||||||
private readonly List<PhysicsJoint> pendingJoints = new List<PhysicsJoint>(); // can lock for longer. accessed only by OdeScene.
|
private readonly List<PhysicsJoint> pendingJoints = new List<PhysicsJoint>(); // can lock for longer. accessed only by OdeScene.
|
||||||
private readonly List<PhysicsJoint> activeJoints = new List<PhysicsJoint>(); // can lock for longer. accessed only by OdeScene.
|
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
|
||||||
avStandupTensor = 550000f;
|
avStandupTensor = 550000f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int contactsPerCollision = 80;
|
||||||
|
|
||||||
if (m_config != null)
|
if (m_config != null)
|
||||||
{
|
{
|
||||||
IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"];
|
IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"];
|
||||||
|
@ -439,6 +441,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f);
|
avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f);
|
||||||
avCapsuleTilted = physicsconfig.GetBoolean("av_capsule_tilted", true);
|
avCapsuleTilted = physicsconfig.GetBoolean("av_capsule_tilted", true);
|
||||||
|
|
||||||
|
contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", 80);
|
||||||
|
|
||||||
geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3);
|
geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3);
|
||||||
geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15);
|
geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15);
|
||||||
geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5);
|
geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5);
|
||||||
|
@ -476,10 +480,11 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
m_NINJA_physics_joints_enabled = physicsconfig.GetBoolean("use_NINJA_physics_joints", false);
|
m_NINJA_physics_joints_enabled = physicsconfig.GetBoolean("use_NINJA_physics_joints", false);
|
||||||
minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", 3f);
|
minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", 3f);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
contacts = new d.ContactGeom[contactsPerCollision];
|
||||||
|
|
||||||
staticPrimspace = new IntPtr[(int)(300 / metersInSpace), (int)(300 / metersInSpace)];
|
staticPrimspace = new IntPtr[(int)(300 / metersInSpace), (int)(300 / metersInSpace)];
|
||||||
|
|
||||||
// Centeral contact friction and bounce
|
// Centeral contact friction and bounce
|
||||||
|
@ -773,6 +778,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
lock (contacts)
|
lock (contacts)
|
||||||
{
|
{
|
||||||
count = d.Collide(g1, g2, contacts.Length, contacts, d.ContactGeom.SizeOf);
|
count = d.Collide(g1, g2, contacts.Length, contacts, d.ContactGeom.SizeOf);
|
||||||
|
if (count > contacts.Length)
|
||||||
|
m_log.Error("[PHYSICS]: Got " + count + " contacts when we asked for a maximum of " + contacts.Length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (SEHException)
|
catch (SEHException)
|
||||||
|
|
|
@ -577,6 +577,9 @@
|
||||||
; used to control llMove2Target
|
; used to control llMove2Target
|
||||||
body_pid_derivative = 35
|
body_pid_derivative = 35
|
||||||
body_pid_gain = 25
|
body_pid_gain = 25
|
||||||
|
|
||||||
|
; maximum number of contact points to generate per collision
|
||||||
|
contacts_per_collision = 80
|
||||||
|
|
||||||
; amount of time a geom/body will try to cross a region border before it gets disabled
|
; amount of time a geom/body will try to cross a region border before it gets disabled
|
||||||
geom_crossing_failures_before_outofbounds = 5
|
geom_crossing_failures_before_outofbounds = 5
|
||||||
|
|
Loading…
Reference in New Issue