aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/UbitOdePlugin
diff options
context:
space:
mode:
authorUbitUmarov2013-05-29 02:08:14 +0100
committerUbitUmarov2013-05-29 02:08:14 +0100
commit4e72cf9ee21dd8833af860fa5af4fc91e11018cb (patch)
treedc3992d2d9383172524eeacf939d9a3bca165ad2 /OpenSim/Region/Physics/UbitOdePlugin
parentAllow Linden trees to preserve their type when taken into inventory and rezze... (diff)
downloadopensim-SC_OLD-4e72cf9ee21dd8833af860fa5af4fc91e11018cb.zip
opensim-SC_OLD-4e72cf9ee21dd8833af860fa5af4fc91e11018cb.tar.gz
opensim-SC_OLD-4e72cf9ee21dd8833af860fa5af4fc91e11018cb.tar.bz2
opensim-SC_OLD-4e72cf9ee21dd8833af860fa5af4fc91e11018cb.tar.xz
*** DANGER TESTING **** changed prims mesh generation hopefully removing
spurius faces. CHanged several aspects. Fixed prims inertia that was too low, still using box as model. Increased number of quickstep SOR iterations to 15. Keep it 15 even on heavy load ( will only jump simulation time).
Diffstat (limited to 'OpenSim/Region/Physics/UbitOdePlugin')
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/ODEMeshWorker.cs6
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs52
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs2
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/OdeApi.cs2
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs288
5 files changed, 145 insertions, 205 deletions
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEMeshWorker.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEMeshWorker.cs
index 0df71eb..5030cec 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODEMeshWorker.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEMeshWorker.cs
@@ -448,7 +448,7 @@ namespace OpenSim.Region.Physics.OdePlugin
448 else 448 else
449 { 449 {
450 repData.meshState = MeshState.needMesh; 450 repData.meshState = MeshState.needMesh;
451 mesh = m_mesher.CreateMesh(actor.Name, pbs, size, clod, true, false, convex, true); 451 mesh = m_mesher.CreateMesh(actor.Name, pbs, size, clod, true, convex, true);
452 if (mesh == null) 452 if (mesh == null)
453 { 453 {
454 repData.meshState = MeshState.MeshFailed; 454 repData.meshState = MeshState.MeshFailed;
@@ -513,7 +513,7 @@ namespace OpenSim.Region.Physics.OdePlugin
513 clod = (int)LevelOfDetail.Low; 513 clod = (int)LevelOfDetail.Low;
514 } 514 }
515 515
516 mesh = m_mesher.CreateMesh(actor.Name, pbs, size, clod, true, false, convex, true); 516 mesh = m_mesher.CreateMesh(actor.Name, pbs, size, clod, true, convex, true);
517 517
518 if (mesh == null) 518 if (mesh == null)
519 { 519 {
@@ -929,4 +929,4 @@ namespace OpenSim.Region.Physics.OdePlugin
929 repData.actor.Name); 929 repData.actor.Name);
930 } 930 }
931 } 931 }
932} 932} \ No newline at end of file
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
index faa9488..7cabddd 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
@@ -25,7 +25,7 @@
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 27
28/* Revision 2011/12 by Ubit Umarov 28/* Revision 2011/12/13 by Ubit Umarov
29 * 29 *
30 * 30 *
31 */ 31 */
@@ -1736,7 +1736,9 @@ namespace OpenSim.Region.Physics.OdePlugin
1736 1736
1737 d.BodySetAutoDisableFlag(Body, true); 1737 d.BodySetAutoDisableFlag(Body, true);
1738 d.BodySetAutoDisableSteps(Body, body_autodisable_frames); 1738 d.BodySetAutoDisableSteps(Body, body_autodisable_frames);
1739 d.BodySetDamping(Body, .005f, .005f); 1739 d.BodySetAutoDisableAngularThreshold(Body, 0.01f);
1740 d.BodySetAutoDisableLinearThreshold(Body, 0.01f);
1741 d.BodySetDamping(Body, .005f, .001f);
1740 1742
1741 if (m_targetSpace != IntPtr.Zero) 1743 if (m_targetSpace != IntPtr.Zero)
1742 { 1744 {
@@ -2144,7 +2146,7 @@ namespace OpenSim.Region.Physics.OdePlugin
2144 2146
2145 _mass = primMass; // just in case 2147 _mass = primMass; // just in case
2146 2148
2147 d.MassSetBoxTotal(out primdMass, primMass, m_OBB.X, m_OBB.Y, m_OBB.Z); 2149 d.MassSetBoxTotal(out primdMass, primMass, 2.0f * m_OBB.X, 2.0f * m_OBB.Y, 2.0f * m_OBB.Z);
2148 2150
2149 d.MassTranslate(ref primdMass, 2151 d.MassTranslate(ref primdMass,
2150 m_OBBOffset.X, 2152 m_OBBOffset.X,
@@ -2362,6 +2364,7 @@ namespace OpenSim.Region.Physics.OdePlugin
2362 MakeBody(); 2364 MakeBody();
2363 } 2365 }
2364 2366
2367
2365 #region changes 2368 #region changes
2366 2369
2367 private void changeadd() 2370 private void changeadd()
@@ -3213,7 +3216,6 @@ namespace OpenSim.Region.Physics.OdePlugin
3213 3216
3214 if (++bodydisablecontrol < 20) 3217 if (++bodydisablecontrol < 20)
3215 return; 3218 return;
3216
3217 3219
3218 d.BodyEnable(Body); 3220 d.BodyEnable(Body);
3219 } 3221 }
@@ -3381,11 +3383,12 @@ namespace OpenSim.Region.Physics.OdePlugin
3381 } 3383 }
3382 } 3384 }
3383 3385
3384 public void UpdatePositionAndVelocity() 3386 public void UpdatePositionAndVelocity(int frame)
3385 { 3387 {
3386 if (_parent == null && !m_disabled && !m_building && !m_outbounds && Body != IntPtr.Zero) 3388 if (_parent == null && !m_disabled && !m_building && !m_outbounds && Body != IntPtr.Zero)
3387 { 3389 {
3388 if (d.BodyIsEnabled(Body) || !_zeroFlag) 3390 bool bodyenabled = d.BodyIsEnabled(Body);
3391 if (bodyenabled || !_zeroFlag)
3389 { 3392 {
3390 bool lastZeroFlag = _zeroFlag; 3393 bool lastZeroFlag = _zeroFlag;
3391 3394
@@ -3478,13 +3481,13 @@ namespace OpenSim.Region.Physics.OdePlugin
3478 // tolerance values depende a lot on simulation noise... 3481 // tolerance values depende a lot on simulation noise...
3479 // use simple math.abs since we dont need to be exact 3482 // use simple math.abs since we dont need to be exact
3480 3483
3481 if ( 3484 if (!bodyenabled ||
3482 (Math.Abs(_position.X - lpos.X) < 0.001f) 3485 (Math.Abs(_position.X - lpos.X) < 0.005f)
3483 && (Math.Abs(_position.Y - lpos.Y) < 0.001f) 3486 && (Math.Abs(_position.Y - lpos.Y) < 0.005f)
3484 && (Math.Abs(_position.Z - lpos.Z) < 0.001f) 3487 && (Math.Abs(_position.Z - lpos.Z) < 0.005f)
3485 && (Math.Abs(_orientation.X - ori.X) < 0.0001f) 3488 && (Math.Abs(_orientation.X - ori.X) < 0.001f)
3486 && (Math.Abs(_orientation.Y - ori.Y) < 0.0001f) 3489 && (Math.Abs(_orientation.Y - ori.Y) < 0.001f)
3487 && (Math.Abs(_orientation.Z - ori.Z) < 0.0001f) // ignore W 3490 && (Math.Abs(_orientation.Z - ori.Z) < 0.001f) // ignore W
3488 ) 3491 )
3489 { 3492 {
3490 _zeroFlag = true; 3493 _zeroFlag = true;
@@ -3499,9 +3502,9 @@ namespace OpenSim.Region.Physics.OdePlugin
3499 3502
3500 _acceleration = _velocity; 3503 _acceleration = _velocity;
3501 3504
3502 if ((Math.Abs(vel.X) < 0.001f) && 3505 if ((Math.Abs(vel.X) < 0.005f) &&
3503 (Math.Abs(vel.Y) < 0.001f) && 3506 (Math.Abs(vel.Y) < 0.005f) &&
3504 (Math.Abs(vel.Z) < 0.001f)) 3507 (Math.Abs(vel.Z) < 0.005f))
3505 { 3508 {
3506 _velocity = Vector3.Zero; 3509 _velocity = Vector3.Zero;
3507 float t = -m_invTimeStep; 3510 float t = -m_invTimeStep;
@@ -3538,6 +3541,15 @@ namespace OpenSim.Region.Physics.OdePlugin
3538 } 3541 }
3539 } 3542 }
3540 3543
3544 _position.X = lpos.X;
3545 _position.Y = lpos.Y;
3546 _position.Z = lpos.Z;
3547
3548 _orientation.X = ori.X;
3549 _orientation.Y = ori.Y;
3550 _orientation.Z = ori.Z;
3551 _orientation.W = ori.W;
3552
3541 if (_zeroFlag) 3553 if (_zeroFlag)
3542 { 3554 {
3543 if (lastZeroFlag) 3555 if (lastZeroFlag)
@@ -3556,14 +3568,6 @@ namespace OpenSim.Region.Physics.OdePlugin
3556 return; 3568 return;
3557 } 3569 }
3558 3570
3559 _position.X = lpos.X;
3560 _position.Y = lpos.Y;
3561 _position.Z = lpos.Z;
3562
3563 _orientation.X = ori.X;
3564 _orientation.Y = ori.Y;
3565 _orientation.Z = ori.Z;
3566 _orientation.W = ori.W;
3567 base.RequestPhysicsterseUpdate(); 3571 base.RequestPhysicsterseUpdate();
3568 m_lastUpdateSent = false; 3572 m_lastUpdateSent = false;
3569 } 3573 }
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs
index 2923ccf..73ababa 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs
@@ -680,4 +680,4 @@ namespace OpenSim.Region.Physics.OdePlugin
680 public RayFilterFlags filter; 680 public RayFilterFlags filter;
681 public Quaternion orientation; 681 public Quaternion orientation;
682 } 682 }
683} 683} \ No newline at end of file
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeApi.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeApi.cs
index 10d7d50..1f09dc7 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/OdeApi.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeApi.cs
@@ -1869,7 +1869,7 @@ namespace OdeAPI
1869 [DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dSpaceSetCleanup"), SuppressUnmanagedCodeSecurity] 1869 [DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dSpaceSetCleanup"), SuppressUnmanagedCodeSecurity]
1870 public static extern void SpaceSetCleanup(IntPtr space, bool mode); 1870 public static extern void SpaceSetCleanup(IntPtr space, bool mode);
1871 1871
1872 [DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dSpaceSetSublevel"), SuppressUnmanagedCodeSecurity] 1872 [DllImport("ode.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dSpaceSetSublevel"), SuppressUnmanagedCodeSecurity]
1873 public static extern void SpaceSetSublevel(IntPtr space, int sublevel); 1873 public static extern void SpaceSetSublevel(IntPtr space, int sublevel);
1874 1874
1875 [DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dSweepAndPruneSpaceCreate"), SuppressUnmanagedCodeSecurity] 1875 [DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dSweepAndPruneSpaceCreate"), SuppressUnmanagedCodeSecurity]
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
index 754bc86..49dc03c 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
@@ -25,6 +25,7 @@
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 27
28// Revision 2011/12/13 by Ubit Umarov
28//#define SPAM 29//#define SPAM
29 30
30using System; 31using System;
@@ -43,25 +44,7 @@ using OpenMetaverse;
43 44
44namespace OpenSim.Region.Physics.OdePlugin 45namespace OpenSim.Region.Physics.OdePlugin
45{ 46{
46 public enum StatusIndicators : int 47 // colision flags of things others can colide with
47 {
48 Generic = 0,
49 Start = 1,
50 End = 2
51 }
52
53 public struct sCollisionData
54 {
55 public uint ColliderLocalId;
56 public uint CollidedWithLocalId;
57 public int NumberOfCollisions;
58 public int CollisionType;
59 public int StatusIndicator;
60 public int lastframe;
61 }
62
63
64 // colision flags of things others can colide with
65 // rays, sensors, probes removed since can't be colided with 48 // rays, sensors, probes removed since can't be colided with
66 // The top space where things are placed provided further selection 49 // The top space where things are placed provided further selection
67 // ie physical are in active space nonphysical in static 50 // ie physical are in active space nonphysical in static
@@ -188,12 +171,14 @@ namespace OpenSim.Region.Physics.OdePlugin
188 171
189 public bool OdeUbitLib = false; 172 public bool OdeUbitLib = false;
190// private int threadid = 0; 173// private int threadid = 0;
191 private Random fluidRandomizer = new Random(Environment.TickCount); 174// private Random fluidRandomizer = new Random(Environment.TickCount);
175
176// const d.ContactFlags comumContactFlags = d.ContactFlags.SoftERP | d.ContactFlags.SoftCFM |d.ContactFlags.Approx1 | d.ContactFlags.Bounce;
192 177
193 const d.ContactFlags comumContactFlags = d.ContactFlags.SoftERP | d.ContactFlags.SoftCFM |d.ContactFlags.Approx1 | d.ContactFlags.Bounce; 178 const d.ContactFlags comumContactFlags = d.ContactFlags.Bounce | d.ContactFlags.Approx1;
194 const float MaxERP = 0.8f; 179 const float comumContactERP = 0.7f;
195 const float minERP = 0.1f;
196 const float comumContactCFM = 0.0001f; 180 const float comumContactCFM = 0.0001f;
181 const float comumContactSLIP = 0.000001f;
197 182
198 float frictionMovementMult = 0.8f; 183 float frictionMovementMult = 0.8f;
199 184
@@ -236,8 +221,8 @@ namespace OpenSim.Region.Physics.OdePlugin
236 221
237 public float geomDefaultDensity = 10.000006836f; 222 public float geomDefaultDensity = 10.000006836f;
238 223
239 public int geomContactPointsStartthrottle = 3; 224// public int geomContactPointsStartthrottle = 3;
240 public int geomUpdatesPerThrottledUpdate = 15; 225// public int geomUpdatesPerThrottledUpdate = 15;
241 226
242 public float bodyPIDD = 35f; 227 public float bodyPIDD = 35f;
243 public float bodyPIDG = 25; 228 public float bodyPIDG = 25;
@@ -246,7 +231,6 @@ namespace OpenSim.Region.Physics.OdePlugin
246 231
247 public int bodyFramesAutoDisable = 5; 232 public int bodyFramesAutoDisable = 5;
248 233
249
250 private d.NearCallback nearCallback; 234 private d.NearCallback nearCallback;
251 235
252 private HashSet<OdeCharacter> _characters = new HashSet<OdeCharacter>(); 236 private HashSet<OdeCharacter> _characters = new HashSet<OdeCharacter>();
@@ -266,11 +250,12 @@ namespace OpenSim.Region.Physics.OdePlugin
266// public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>(); 250// public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>();
267 public Dictionary<IntPtr, PhysicsActor> actor_name_map = new Dictionary<IntPtr, PhysicsActor>(); 251 public Dictionary<IntPtr, PhysicsActor> actor_name_map = new Dictionary<IntPtr, PhysicsActor>();
268 252
269 private float contactsurfacelayer = 0.002f; 253 private float contactsurfacelayer = 0.001f;
270 254
271 private int contactsPerCollision = 80; 255 private int contactsPerCollision = 80;
272 internal IntPtr ContactgeomsArray = IntPtr.Zero; 256 internal IntPtr ContactgeomsArray = IntPtr.Zero;
273 private IntPtr GlobalContactsArray = IntPtr.Zero; 257 private IntPtr GlobalContactsArray = IntPtr.Zero;
258 private d.Contact SharedTmpcontact = new d.Contact();
274 259
275 const int maxContactsbeforedeath = 4000; 260 const int maxContactsbeforedeath = 4000;
276 private volatile int m_global_contactcount = 0; 261 private volatile int m_global_contactcount = 0;
@@ -283,7 +268,7 @@ namespace OpenSim.Region.Physics.OdePlugin
283 private Dictionary<IntPtr, float[]> TerrainHeightFieldHeights = new Dictionary<IntPtr, float[]>(); 268 private Dictionary<IntPtr, float[]> TerrainHeightFieldHeights = new Dictionary<IntPtr, float[]>();
284 private Dictionary<IntPtr, GCHandle> TerrainHeightFieldHeightsHandlers = new Dictionary<IntPtr, GCHandle>(); 269 private Dictionary<IntPtr, GCHandle> TerrainHeightFieldHeightsHandlers = new Dictionary<IntPtr, GCHandle>();
285 270
286 private int m_physicsiterations = 10; 271 private int m_physicsiterations = 15;
287 private const float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag 272 private const float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag
288// private PhysicsActor PANull = new NullPhysicsActor(); 273// private PhysicsActor PANull = new NullPhysicsActor();
289 private float step_time = 0.0f; 274 private float step_time = 0.0f;
@@ -303,8 +288,6 @@ namespace OpenSim.Region.Physics.OdePlugin
303 public IntPtr StaticSpace; // space for the static things around 288 public IntPtr StaticSpace; // space for the static things around
304 public IntPtr GroundSpace; // space for ground 289 public IntPtr GroundSpace; // space for ground
305 290
306 public IntPtr SharedRay;
307
308 // some speedup variables 291 // some speedup variables
309 private int spaceGridMaxX; 292 private int spaceGridMaxX;
310 private int spaceGridMaxY; 293 private int spaceGridMaxY;
@@ -431,8 +414,6 @@ namespace OpenSim.Region.Physics.OdePlugin
431 contactgroup = d.JointGroupCreate(0); 414 contactgroup = d.JointGroupCreate(0);
432 //contactgroup 415 //contactgroup
433 416
434 SharedRay = d.CreateRay(TopSpace, 1.0f);
435
436 d.WorldSetAutoDisableFlag(world, false); 417 d.WorldSetAutoDisableFlag(world, false);
437 } 418 }
438 } 419 }
@@ -481,10 +462,10 @@ namespace OpenSim.Region.Physics.OdePlugin
481 462
482 metersInSpace = physicsconfig.GetFloat("meters_in_small_space", metersInSpace); 463 metersInSpace = physicsconfig.GetFloat("meters_in_small_space", metersInSpace);
483 464
484 contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", contactsurfacelayer); 465// contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", contactsurfacelayer);
485 466
486 ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", ODE_STEPSIZE); 467 ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", ODE_STEPSIZE);
487 m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", m_physicsiterations); 468// m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", m_physicsiterations);
488 469
489 avDensity = physicsconfig.GetFloat("av_density", avDensity); 470 avDensity = physicsconfig.GetFloat("av_density", avDensity);
490 avMovementDivisorWalk = physicsconfig.GetFloat("av_movement_divisor_walk", avMovementDivisorWalk); 471 avMovementDivisorWalk = physicsconfig.GetFloat("av_movement_divisor_walk", avMovementDivisorWalk);
@@ -492,8 +473,8 @@ namespace OpenSim.Region.Physics.OdePlugin
492 473
493 contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", contactsPerCollision); 474 contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", contactsPerCollision);
494 475
495 geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3); 476// geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3);
496 geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15); 477// geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15);
497// geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5); 478// geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5);
498 479
499 geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", geomDefaultDensity); 480 geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", geomDefaultDensity);
@@ -508,6 +489,23 @@ namespace OpenSim.Region.Physics.OdePlugin
508 } 489 }
509 } 490 }
510 491
492
493 d.WorldSetCFM(world, comumContactCFM);
494 d.WorldSetERP(world, comumContactERP);
495
496 d.WorldSetGravity(world, gravityx, gravityy, gravityz);
497
498 d.WorldSetLinearDamping(world, 0.002f);
499 d.WorldSetAngularDamping(world, 0.002f);
500 d.WorldSetAngularDampingThreshold(world, 0f);
501 d.WorldSetLinearDampingThreshold(world, 0f);
502 d.WorldSetMaxAngularSpeed(world, 100f);
503
504 d.WorldSetQuickStepNumIterations(world, m_physicsiterations);
505
506 d.WorldSetContactSurfaceLayer(world, contactsurfacelayer);
507 d.WorldSetContactMaxCorrectingVel(world, 60.0f);
508
511 m_meshWorker = new ODEMeshWorker(this, m_log, meshmerizer, physicsconfig); 509 m_meshWorker = new ODEMeshWorker(this, m_log, meshmerizer, physicsconfig);
512 510
513 HalfOdeStep = ODE_STEPSIZE * 0.5f; 511 HalfOdeStep = ODE_STEPSIZE * 0.5f;
@@ -516,6 +514,20 @@ namespace OpenSim.Region.Physics.OdePlugin
516 ContactgeomsArray = Marshal.AllocHGlobal(contactsPerCollision * d.ContactGeom.unmanagedSizeOf); 514 ContactgeomsArray = Marshal.AllocHGlobal(contactsPerCollision * d.ContactGeom.unmanagedSizeOf);
517 GlobalContactsArray = Marshal.AllocHGlobal(maxContactsbeforedeath * d.Contact.unmanagedSizeOf); 515 GlobalContactsArray = Marshal.AllocHGlobal(maxContactsbeforedeath * d.Contact.unmanagedSizeOf);
518 516
517 SharedTmpcontact.geom.g1 = IntPtr.Zero;
518 SharedTmpcontact.geom.g2 = IntPtr.Zero;
519
520 SharedTmpcontact.geom.side1 = -1;
521 SharedTmpcontact.geom.side2 = -1;
522
523 SharedTmpcontact.surface.mode = comumContactFlags;
524 SharedTmpcontact.surface.mu = 0;
525 SharedTmpcontact.surface.bounce = 0;
526 SharedTmpcontact.surface.soft_cfm = comumContactCFM;
527 SharedTmpcontact.surface.soft_erp = comumContactERP;
528 SharedTmpcontact.surface.slip1 = comumContactSLIP;
529 SharedTmpcontact.surface.slip2 = comumContactSLIP;
530
519 m_materialContactsData[(int)Material.Stone].mu = 0.8f; 531 m_materialContactsData[(int)Material.Stone].mu = 0.8f;
520 m_materialContactsData[(int)Material.Stone].bounce = 0.4f; 532 m_materialContactsData[(int)Material.Stone].bounce = 0.4f;
521 533
@@ -540,27 +552,6 @@ namespace OpenSim.Region.Physics.OdePlugin
540 m_materialContactsData[(int)Material.light].mu = 0.0f; 552 m_materialContactsData[(int)Material.light].mu = 0.0f;
541 m_materialContactsData[(int)Material.light].bounce = 0.0f; 553 m_materialContactsData[(int)Material.light].bounce = 0.0f;
542 554
543 // Set the gravity,, don't disable things automatically (we set it explicitly on some things)
544
545 d.WorldSetGravity(world, gravityx, gravityy, gravityz);
546 d.WorldSetContactSurfaceLayer(world, contactsurfacelayer);
547
548 d.WorldSetLinearDamping(world, 0.002f);
549 d.WorldSetAngularDamping(world, 0.002f);
550 d.WorldSetAngularDampingThreshold(world, 0f);
551 d.WorldSetLinearDampingThreshold(world, 0f);
552 d.WorldSetMaxAngularSpeed(world, 100f);
553
554 d.WorldSetCFM(world,1e-6f); // a bit harder than default
555 //d.WorldSetCFM(world, 1e-4f); // a bit harder than default
556 d.WorldSetERP(world, 0.6f); // higher than original
557
558 // Set how many steps we go without running collision testing
559 // This is in addition to the step size.
560 // Essentially Steps * m_physicsiterations
561 d.WorldSetQuickStepNumIterations(world, m_physicsiterations);
562
563 d.WorldSetContactMaxCorrectingVel(world, 60.0f);
564 555
565 spacesPerMeter = 1 / metersInSpace; 556 spacesPerMeter = 1 / metersInSpace;
566 spaceGridMaxX = (int)(WorldExtents.X * spacesPerMeter); 557 spaceGridMaxX = (int)(WorldExtents.X * spacesPerMeter);
@@ -631,40 +622,21 @@ namespace OpenSim.Region.Physics.OdePlugin
631 622
632 // sets a global contact for a joint for contactgeom , and base contact description) 623 // sets a global contact for a joint for contactgeom , and base contact description)
633 624
634 private IntPtr CreateContacJoint(ref d.ContactGeom contactGeom, float mu, float bounce, float cfm, float erpscale, float dscale) 625
626
627 private IntPtr CreateContacJoint(ref d.ContactGeom contactGeom)
635 { 628 {
636 if (GlobalContactsArray == IntPtr.Zero || m_global_contactcount >= maxContactsbeforedeath) 629 if (m_global_contactcount >= maxContactsbeforedeath)
637 return IntPtr.Zero; 630 return IntPtr.Zero;
638 631
639 float erp = contactGeom.depth; 632 m_global_contactcount++;
640 erp *= erpscale; 633
641 if (erp < minERP) 634 SharedTmpcontact.geom.depth = contactGeom.depth;
642 erp = minERP; 635 SharedTmpcontact.geom.pos = contactGeom.pos;
643 else if (erp > MaxERP) 636 SharedTmpcontact.geom.normal = contactGeom.normal;
644 erp = MaxERP;
645
646 float depth = contactGeom.depth * dscale;
647 if (depth > 0.5f)
648 depth = 0.5f;
649
650 d.Contact newcontact = new d.Contact();
651 newcontact.geom.depth = depth;
652 newcontact.geom.g1 = contactGeom.g1;
653 newcontact.geom.g2 = contactGeom.g2;
654 newcontact.geom.pos = contactGeom.pos;
655 newcontact.geom.normal = contactGeom.normal;
656 newcontact.geom.side1 = contactGeom.side1;
657 newcontact.geom.side2 = contactGeom.side2;
658
659 // this needs bounce also
660 newcontact.surface.mode = comumContactFlags;
661 newcontact.surface.mu = mu;
662 newcontact.surface.bounce = bounce;
663 newcontact.surface.soft_cfm = cfm;
664 newcontact.surface.soft_erp = erp;
665 637
666 IntPtr contact = new IntPtr(GlobalContactsArray.ToInt64() + (Int64)(m_global_contactcount * d.Contact.unmanagedSizeOf)); 638 IntPtr contact = new IntPtr(GlobalContactsArray.ToInt64() + (Int64)(m_global_contactcount * d.Contact.unmanagedSizeOf));
667 Marshal.StructureToPtr(newcontact, contact, true); 639 Marshal.StructureToPtr(SharedTmpcontact, contact, true);
668 return d.JointCreateContactPtr(world, contactgroup, contact); 640 return d.JointCreateContactPtr(world, contactgroup, contact);
669 } 641 }
670 642
@@ -825,10 +797,12 @@ namespace OpenSim.Region.Physics.OdePlugin
825 if (!GetCurContactGeom(0, ref curContact)) 797 if (!GetCurContactGeom(0, ref curContact))
826 return; 798 return;
827 799
800 ContactPoint maxDepthContact = new ContactPoint();
801
828 // do volume detection case 802 // do volume detection case
829 if ((p1.IsVolumeDtc || p2.IsVolumeDtc)) 803 if ((p1.IsVolumeDtc || p2.IsVolumeDtc))
830 { 804 {
831 ContactPoint maxDepthContact = new ContactPoint( 805 maxDepthContact = new ContactPoint(
832 new Vector3(curContact.pos.X, curContact.pos.Y, curContact.pos.Z), 806 new Vector3(curContact.pos.X, curContact.pos.Y, curContact.pos.Z),
833 new Vector3(curContact.normal.X, curContact.normal.Y, curContact.normal.Z), 807 new Vector3(curContact.normal.X, curContact.normal.Y, curContact.normal.Z),
834 curContact.depth, false 808 curContact.depth, false
@@ -842,10 +816,7 @@ namespace OpenSim.Region.Physics.OdePlugin
842 816
843 float mu = 0; 817 float mu = 0;
844 float bounce = 0; 818 float bounce = 0;
845 float cfm = 0.0001f; 819// bool IgnoreNegSides = false;
846 float erpscale = 1.0f;
847 float dscale = 1.0f;
848 bool IgnoreNegSides = false;
849 820
850 ContactData contactdata1 = new ContactData(0, 0, false); 821 ContactData contactdata1 = new ContactData(0, 0, false);
851 ContactData contactdata2 = new ContactData(0, 0, false); 822 ContactData contactdata2 = new ContactData(0, 0, false);
@@ -890,7 +861,9 @@ namespace OpenSim.Region.Physics.OdePlugin
890 break; 861 break;
891 862
892 case (int)ActorTypes.Prim: 863 case (int)ActorTypes.Prim:
893 if ((p1.Velocity - p2.Velocity).LengthSquared() > 0.0f) 864 Vector3 relV = p1.Velocity - p2.Velocity;
865 float relVlenSQ = relV.LengthSquared();
866 if (relVlenSQ > 0.0001f)
894 { 867 {
895 p1.CollidingObj = true; 868 p1.CollidingObj = true;
896 p2.CollidingObj = true; 869 p2.CollidingObj = true;
@@ -900,21 +873,7 @@ namespace OpenSim.Region.Physics.OdePlugin
900 bounce = contactdata1.bounce * contactdata2.bounce; 873 bounce = contactdata1.bounce * contactdata2.bounce;
901 mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu); 874 mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu);
902 875
903 cfm = p1.Mass; 876 if (relVlenSQ > 0.01f)
904 if (cfm > p2.Mass)
905 cfm = p2.Mass;
906 dscale = 10 / cfm;
907 dscale = (float)Math.Sqrt(dscale);
908 if (dscale > 1.0f)
909 dscale = 1.0f;
910 erpscale = cfm * 0.01f;
911 cfm = 0.0001f / cfm;
912 if (cfm > 0.01f)
913 cfm = 0.01f;
914 else if (cfm < 0.00001f)
915 cfm = 0.00001f;
916
917 if ((Math.Abs(p2.Velocity.X - p1.Velocity.X) > 0.1f || Math.Abs(p2.Velocity.Y - p1.Velocity.Y) > 0.1f))
918 mu *= frictionMovementMult; 877 mu *= frictionMovementMult;
919 878
920 break; 879 break;
@@ -923,27 +882,17 @@ namespace OpenSim.Region.Physics.OdePlugin
923 p1.getContactData(ref contactdata1); 882 p1.getContactData(ref contactdata1);
924 bounce = contactdata1.bounce * TerrainBounce; 883 bounce = contactdata1.bounce * TerrainBounce;
925 mu = (float)Math.Sqrt(contactdata1.mu * TerrainFriction); 884 mu = (float)Math.Sqrt(contactdata1.mu * TerrainFriction);
885
926 if (Math.Abs(p1.Velocity.X) > 0.1f || Math.Abs(p1.Velocity.Y) > 0.1f) 886 if (Math.Abs(p1.Velocity.X) > 0.1f || Math.Abs(p1.Velocity.Y) > 0.1f)
927 mu *= frictionMovementMult; 887 mu *= frictionMovementMult;
928 p1.CollidingGround = true; 888 p1.CollidingGround = true;
929 889/*
930 cfm = p1.Mass;
931 dscale = 10 / cfm;
932 dscale = (float)Math.Sqrt(dscale);
933 if (dscale > 1.0f)
934 dscale = 1.0f;
935 erpscale = cfm * 0.01f;
936 cfm = 0.0001f / cfm;
937 if (cfm > 0.01f)
938 cfm = 0.01f;
939 else if (cfm < 0.00001f)
940 cfm = 0.00001f;
941
942 if (d.GeomGetClass(g1) == d.GeomClassID.TriMeshClass) 890 if (d.GeomGetClass(g1) == d.GeomClassID.TriMeshClass)
943 { 891 {
944 if (curContact.side1 > 0) 892 if (curContact.side1 > 0)
945 IgnoreNegSides = true; 893 IgnoreNegSides = true;
946 } 894 }
895 */
947 break; 896 break;
948 897
949 case (int)ActorTypes.Water: 898 case (int)ActorTypes.Water:
@@ -961,22 +910,8 @@ namespace OpenSim.Region.Physics.OdePlugin
961 bounce = contactdata2.bounce * TerrainBounce; 910 bounce = contactdata2.bounce * TerrainBounce;
962 mu = (float)Math.Sqrt(contactdata2.mu * TerrainFriction); 911 mu = (float)Math.Sqrt(contactdata2.mu * TerrainFriction);
963 912
964 cfm = p2.Mass; 913// if (curContact.side1 > 0) // should be 2 ?
965 dscale = 10 / cfm; 914// IgnoreNegSides = true;
966 dscale = (float)Math.Sqrt(dscale);
967
968 if (dscale > 1.0f)
969 dscale = 1.0f;
970
971 erpscale = cfm * 0.01f;
972 cfm = 0.0001f / cfm;
973 if (cfm > 0.01f)
974 cfm = 0.01f;
975 else if (cfm < 0.00001f)
976 cfm = 0.00001f;
977
978 if (curContact.side1 > 0) // should be 2 ?
979 IgnoreNegSides = true;
980 915
981 if (Math.Abs(p2.Velocity.X) > 0.1f || Math.Abs(p2.Velocity.Y) > 0.1f) 916 if (Math.Abs(p2.Velocity.X) > 0.1f || Math.Abs(p2.Velocity.Y) > 0.1f)
982 mu *= frictionMovementMult; 917 mu *= frictionMovementMult;
@@ -993,26 +928,24 @@ namespace OpenSim.Region.Physics.OdePlugin
993 if (ignore) 928 if (ignore)
994 return; 929 return;
995 930
996
997 d.ContactGeom maxContact = curContact;
998 // if (IgnoreNegSides && curContact.side1 < 0)
999 // maxContact.depth = float.MinValue;
1000
1001 d.ContactGeom minContact = curContact;
1002 // if (IgnoreNegSides && curContact.side1 < 0)
1003 // minContact.depth = float.MaxValue;
1004
1005 IntPtr Joint; 931 IntPtr Joint;
1006 bool FeetCollision = false; 932 bool FeetCollision = false;
1007 int ncontacts = 0; 933 int ncontacts = 0;
1008 934
1009
1010 int i = 0; 935 int i = 0;
1011 936
937 maxDepthContact = new ContactPoint();
938 maxDepthContact.PenetrationDepth = float.MinValue;
939 ContactPoint minDepthContact = new ContactPoint();
940 minDepthContact.PenetrationDepth = float.MaxValue;
941
942 SharedTmpcontact.geom.depth = 0;
943 SharedTmpcontact.surface.mu = mu;
944 SharedTmpcontact.surface.bounce = bounce;
945
1012 while (true) 946 while (true)
1013 { 947 {
1014 948// if (!(IgnoreNegSides && curContact.side1 < 0))
1015// if (!(IgnoreNegSides && curContact.side1 < 0))
1016 { 949 {
1017 bool noskip = true; 950 bool noskip = true;
1018 if (dop1ava) 951 if (dop1ava)
@@ -1029,26 +962,32 @@ namespace OpenSim.Region.Physics.OdePlugin
1029 962
1030 if (noskip) 963 if (noskip)
1031 { 964 {
1032 m_global_contactcount++; 965 Joint = CreateContacJoint(ref curContact);
1033 if (m_global_contactcount >= maxContactsbeforedeath)
1034 break;
1035
1036 ncontacts++;
1037
1038 Joint = CreateContacJoint(ref curContact, mu, bounce, cfm, erpscale, dscale);
1039 if (Joint == IntPtr.Zero) 966 if (Joint == IntPtr.Zero)
1040 break; 967 break;
1041 968
1042 d.JointAttach(Joint, b1, b2); 969 d.JointAttach(Joint, b1, b2);
1043 970
1044 if (curContact.depth > maxContact.depth) 971 ncontacts++;
1045 maxContact = curContact; 972
973 if (curContact.depth > maxDepthContact.PenetrationDepth)
974 {
975 maxDepthContact.Position.X = curContact.pos.X;
976 maxDepthContact.Position.Y = curContact.pos.Y;
977 maxDepthContact.Position.Z = curContact.pos.Z;
978 maxDepthContact.PenetrationDepth = curContact.depth;
979 maxDepthContact.CharacterFeet = FeetCollision;
980 }
1046 981
1047 if (curContact.depth < minContact.depth) 982 if (curContact.depth < minDepthContact.PenetrationDepth)
1048 minContact = curContact; 983 {
984 minDepthContact.PenetrationDepth = curContact.depth;
985 minDepthContact.SurfaceNormal.X = curContact.normal.X;
986 minDepthContact.SurfaceNormal.Y = curContact.normal.Y;
987 minDepthContact.SurfaceNormal.Z = curContact.normal.Z;
988 }
1049 } 989 }
1050 } 990 }
1051
1052 if (++i >= count) 991 if (++i >= count)
1053 break; 992 break;
1054 993
@@ -1058,11 +997,10 @@ namespace OpenSim.Region.Physics.OdePlugin
1058 997
1059 if (ncontacts > 0) 998 if (ncontacts > 0)
1060 { 999 {
1061 ContactPoint maxDepthContact = new ContactPoint( 1000 maxDepthContact.SurfaceNormal.X = minDepthContact.SurfaceNormal.X;
1062 new Vector3(maxContact.pos.X, maxContact.pos.Y, maxContact.pos.Z), 1001 maxDepthContact.SurfaceNormal.Y = minDepthContact.SurfaceNormal.Y;
1063 new Vector3(minContact.normal.X, minContact.normal.Y, minContact.normal.Z), 1002 maxDepthContact.SurfaceNormal.Z = minDepthContact.SurfaceNormal.Z;
1064 maxContact.depth, FeetCollision 1003
1065 );
1066 collision_accounting_events(p1, p2, maxDepthContact); 1004 collision_accounting_events(p1, p2, maxDepthContact);
1067 } 1005 }
1068 } 1006 }
@@ -1629,16 +1567,15 @@ namespace OpenSim.Region.Physics.OdePlugin
1629 if (framecount < 0) 1567 if (framecount < 0)
1630 framecount = 0; 1568 framecount = 0;
1631 1569
1632
1633 framecount++; 1570 framecount++;
1634 1571
1635 int curphysiteractions; 1572// int curphysiteractions;
1636 1573
1637 // if in trouble reduce step resolution 1574 // if in trouble reduce step resolution
1638 if (step_time >= m_SkipFramesAtms) 1575// if (step_time >= m_SkipFramesAtms)
1639 curphysiteractions = m_physicsiterations / 2; 1576// curphysiteractions = m_physicsiterations / 2;
1640 else 1577// else
1641 curphysiteractions = m_physicsiterations; 1578// curphysiteractions = m_physicsiterations;
1642 1579
1643// checkThread(); 1580// checkThread();
1644 int nodeframes = 0; 1581 int nodeframes = 0;
@@ -1653,14 +1590,12 @@ namespace OpenSim.Region.Physics.OdePlugin
1653 } 1590 }
1654 1591
1655 ODEchangeitem item; 1592 ODEchangeitem item;
1656
1657
1658 1593
1659 d.WorldSetQuickStepNumIterations(world, curphysiteractions); 1594// d.WorldSetQuickStepNumIterations(world, curphysiteractions);
1660 1595
1661 int loopstartMS = Util.EnvironmentTickCount(); 1596 int loopstartMS = Util.EnvironmentTickCount();
1662 int looptimeMS = 0; 1597 int looptimeMS = 0;
1663 1598
1664 1599
1665 while (step_time > HalfOdeStep) 1600 while (step_time > HalfOdeStep)
1666 { 1601 {
@@ -1763,6 +1698,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1763 1698
1764 // do a ode simulation step 1699 // do a ode simulation step
1765 d.WorldQuickStep(world, ODE_STEPSIZE); 1700 d.WorldQuickStep(world, ODE_STEPSIZE);
1701// d.WorldStep(world, ODE_STEPSIZE);
1766 d.JointGroupEmpty(contactgroup); 1702 d.JointGroupEmpty(contactgroup);
1767 1703
1768 // update managed ideia of physical data and do updates to core 1704 // update managed ideia of physical data and do updates to core
@@ -1789,7 +1725,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1789 { 1725 {
1790 if (actor.IsPhysical) 1726 if (actor.IsPhysical)
1791 { 1727 {
1792 actor.UpdatePositionAndVelocity(); 1728 actor.UpdatePositionAndVelocity(framecount);
1793 } 1729 }
1794 } 1730 }
1795 } 1731 }