aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs')
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs250
1 files changed, 138 insertions, 112 deletions
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
index 6e4c373..884a5a7 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
@@ -155,7 +155,7 @@ namespace OpenSim.Region.Physics.OdePlugin
155 private readonly ILog m_log; 155 private readonly ILog m_log;
156 // private Dictionary<string, sCollisionData> m_storedCollisions = new Dictionary<string, sCollisionData>(); 156 // private Dictionary<string, sCollisionData> m_storedCollisions = new Dictionary<string, sCollisionData>();
157 157
158 private int threadid = 0; 158// private int threadid = 0;
159 private Random fluidRandomizer = new Random(Environment.TickCount); 159 private Random fluidRandomizer = new Random(Environment.TickCount);
160 160
161 const d.ContactFlags comumContactFlags = d.ContactFlags.SoftERP | d.ContactFlags.SoftCFM |d.ContactFlags.Approx1 | d.ContactFlags.Bounce; 161 const d.ContactFlags comumContactFlags = d.ContactFlags.SoftERP | d.ContactFlags.SoftCFM |d.ContactFlags.Approx1 | d.ContactFlags.Bounce;
@@ -163,12 +163,10 @@ namespace OpenSim.Region.Physics.OdePlugin
163 const float comumSoftContactERP = 0.1f; 163 const float comumSoftContactERP = 0.1f;
164 const float comumContactCFM = 0.0001f; 164 const float comumContactCFM = 0.0001f;
165 165
166 float frictionScale = 1.0f;
167
168 float frictionMovementMult = 0.3f; 166 float frictionMovementMult = 0.3f;
169 167
170 float TerrainBounce = 0.1f; 168 float TerrainBounce = 0.1f;
171 float TerrainFriction = 0.1f; 169 float TerrainFriction = 0.3f;
172 170
173 public float AvatarBounce = 0.3f; 171 public float AvatarBounce = 0.3f;
174 public float AvatarFriction = 0;// 0.9f * 0.5f; 172 public float AvatarFriction = 0;// 0.9f * 0.5f;
@@ -189,8 +187,8 @@ namespace OpenSim.Region.Physics.OdePlugin
189 187
190 internal IntPtr WaterGeom; 188 internal IntPtr WaterGeom;
191 189
192 public float avPIDD = 3200f; // make it visible 190 public float avPIDD = 2200f; // make it visible
193 public float avPIDP = 1400f; // make it visible 191 public float avPIDP = 900f; // make it visible
194 private float avCapRadius = 0.37f; 192 private float avCapRadius = 0.37f;
195 private float avDensity = 3f; 193 private float avDensity = 3f;
196 private float avMovementDivisorWalk = 1.3f; 194 private float avMovementDivisorWalk = 1.3f;
@@ -202,7 +200,7 @@ namespace OpenSim.Region.Physics.OdePlugin
202 public bool forceSimplePrimMeshing = false; 200 public bool forceSimplePrimMeshing = false;
203 201
204 public float meshSculptLOD = 32; 202 public float meshSculptLOD = 32;
205 public float MeshSculptphysicalLOD = 16; 203 public float MeshSculptphysicalLOD = 32;
206 204
207 public float geomDefaultDensity = 10.000006836f; 205 public float geomDefaultDensity = 10.000006836f;
208 206
@@ -212,18 +210,18 @@ namespace OpenSim.Region.Physics.OdePlugin
212 public float bodyPIDD = 35f; 210 public float bodyPIDD = 35f;
213 public float bodyPIDG = 25; 211 public float bodyPIDG = 25;
214 212
215 public int geomCrossingFailuresBeforeOutofbounds = 6; 213// public int geomCrossingFailuresBeforeOutofbounds = 6;
216 214
217 public int bodyFramesAutoDisable = 20; 215 public int bodyFramesAutoDisable = 20;
218 216
219 private float[] _watermap; 217 private float[] _watermap;
220 private bool m_filterCollisions = true;
221 218
222 private d.NearCallback nearCallback; 219 private d.NearCallback nearCallback;
223 220
224 private readonly HashSet<OdeCharacter> _characters = new HashSet<OdeCharacter>(); 221 private readonly HashSet<OdeCharacter> _characters = new HashSet<OdeCharacter>();
225 private readonly HashSet<OdePrim> _prims = new HashSet<OdePrim>(); 222 private readonly HashSet<OdePrim> _prims = new HashSet<OdePrim>();
226 private readonly HashSet<OdePrim> _activeprims = new HashSet<OdePrim>(); 223 private readonly HashSet<OdePrim> _activeprims = new HashSet<OdePrim>();
224 private readonly HashSet<OdePrim> _activegroups = new HashSet<OdePrim>();
227 225
228 public OpenSim.Framework.LocklessQueue<ODEchangeitem> ChangesQueue = new OpenSim.Framework.LocklessQueue<ODEchangeitem>(); 226 public OpenSim.Framework.LocklessQueue<ODEchangeitem> ChangesQueue = new OpenSim.Framework.LocklessQueue<ODEchangeitem>();
229 227
@@ -387,9 +385,6 @@ namespace OpenSim.Region.Physics.OdePlugin
387 385
388 // Defaults 386 // Defaults
389 387
390 avPIDD = 2200.0f;
391 avPIDP = 900.0f;
392
393 int contactsPerCollision = 80; 388 int contactsPerCollision = 80;
394 389
395 if (m_config != null) 390 if (m_config != null)
@@ -397,90 +392,86 @@ namespace OpenSim.Region.Physics.OdePlugin
397 IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"]; 392 IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"];
398 if (physicsconfig != null) 393 if (physicsconfig != null)
399 { 394 {
400 gravityx = physicsconfig.GetFloat("world_gravityx", 0f); 395 gravityx = physicsconfig.GetFloat("world_gravityx", gravityx);
401 gravityy = physicsconfig.GetFloat("world_gravityy", 0f); 396 gravityy = physicsconfig.GetFloat("world_gravityy", gravityy);
402 gravityz = physicsconfig.GetFloat("world_gravityz", -9.8f); 397 gravityz = physicsconfig.GetFloat("world_gravityz", gravityz);
403 398
404 metersInSpace = physicsconfig.GetFloat("meters_in_small_space", 29.9f); 399 metersInSpace = physicsconfig.GetFloat("meters_in_small_space", metersInSpace);
405 400
406 contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", contactsurfacelayer); 401 contactsurfacelayer = physicsconfig.GetFloat("world_contact_surface_layer", contactsurfacelayer);
407 402
408 ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", 0.020f); 403 ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", ODE_STEPSIZE);
409 m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", 10); 404 m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", m_physicsiterations);
410 405
411 avDensity = physicsconfig.GetFloat("av_density", avDensity); 406 avDensity = physicsconfig.GetFloat("av_density", avDensity);
412 avMovementDivisorWalk = physicsconfig.GetFloat("av_movement_divisor_walk", 1.3f); 407 avMovementDivisorWalk = physicsconfig.GetFloat("av_movement_divisor_walk", avMovementDivisorWalk);
413 avMovementDivisorRun = physicsconfig.GetFloat("av_movement_divisor_run", 0.8f); 408 avMovementDivisorRun = physicsconfig.GetFloat("av_movement_divisor_run", avMovementDivisorRun);
414 avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f); 409 avCapRadius = physicsconfig.GetFloat("av_capsule_radius", avCapRadius);
415 410
416 contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", 80); 411 contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", contactsPerCollision);
417 412
418 geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3); 413 geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3);
419 geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15); 414 geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15);
420 geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5); 415// geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5);
421 416
422 geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", 10.000006836f); 417 geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", geomDefaultDensity);
423 bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", 20); 418 bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", bodyFramesAutoDisable);
424 419
425 bodyPIDD = physicsconfig.GetFloat("body_pid_derivative", 35f); 420 bodyPIDD = physicsconfig.GetFloat("body_pid_derivative", bodyPIDD);
426 bodyPIDG = physicsconfig.GetFloat("body_pid_gain", 25f); 421 bodyPIDG = physicsconfig.GetFloat("body_pid_gain", bodyPIDG);
427 422
428 forceSimplePrimMeshing = physicsconfig.GetBoolean("force_simple_prim_meshing", forceSimplePrimMeshing); 423 forceSimplePrimMeshing = physicsconfig.GetBoolean("force_simple_prim_meshing", forceSimplePrimMeshing);
429 meshSculptedPrim = physicsconfig.GetBoolean("mesh_sculpted_prim", true); 424 meshSculptedPrim = physicsconfig.GetBoolean("mesh_sculpted_prim", meshSculptedPrim);
430 meshSculptLOD = physicsconfig.GetFloat("mesh_lod", 32f); 425 meshSculptLOD = physicsconfig.GetFloat("mesh_lod", meshSculptLOD);
431 MeshSculptphysicalLOD = physicsconfig.GetFloat("mesh_physical_lod", 16f); 426 MeshSculptphysicalLOD = physicsconfig.GetFloat("mesh_physical_lod", MeshSculptphysicalLOD);
432 m_filterCollisions = physicsconfig.GetBoolean("filter_collisions", false);
433 427
434 if (Environment.OSVersion.Platform == PlatformID.Unix) 428 if (Environment.OSVersion.Platform == PlatformID.Unix)
435 { 429 {
436 avPIDD = physicsconfig.GetFloat("av_pid_derivative_linux", 2200.0f); 430 avPIDD = physicsconfig.GetFloat("av_pid_derivative_linux", avPIDD);
437 avPIDP = physicsconfig.GetFloat("av_pid_proportional_linux", 900.0f); 431 avPIDP = physicsconfig.GetFloat("av_pid_proportional_linux", avPIDP);
438 } 432 }
439 else 433 else
440 { 434 {
441 avPIDD = physicsconfig.GetFloat("av_pid_derivative_win", 2200.0f); 435 avPIDD = physicsconfig.GetFloat("av_pid_derivative_win", avPIDD);
442 avPIDP = physicsconfig.GetFloat("av_pid_proportional_win", 900.0f); 436 avPIDP = physicsconfig.GetFloat("av_pid_proportional_win", avPIDP);
443 } 437 }
444 438
445 physics_logging = physicsconfig.GetBoolean("physics_logging", false); 439 physics_logging = physicsconfig.GetBoolean("physics_logging", false);
446 physics_logging_interval = physicsconfig.GetInt("physics_logging_interval", 0); 440 physics_logging_interval = physicsconfig.GetInt("physics_logging_interval", 0);
447 physics_logging_append_existing_logfile = physicsconfig.GetBoolean("physics_logging_append_existing_logfile", false); 441 physics_logging_append_existing_logfile = physicsconfig.GetBoolean("physics_logging_append_existing_logfile", false);
448 442
449 minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", 3f); 443 minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", minimumGroundFlightOffset);
450 maximumMassObject = physicsconfig.GetFloat("maximum_mass_object", 10000.01f); 444 maximumMassObject = physicsconfig.GetFloat("maximum_mass_object", maximumMassObject);
451 } 445 }
452 } 446 }
453 447
454 ContactgeomsArray = Marshal.AllocHGlobal(contactsPerCollision * d.ContactGeom.unmanagedSizeOf); 448 ContactgeomsArray = Marshal.AllocHGlobal(contactsPerCollision * d.ContactGeom.unmanagedSizeOf);
455 GlobalContactsArray = GlobalContactsArray = Marshal.AllocHGlobal(maxContactsbeforedeath * d.Contact.unmanagedSizeOf); 449 GlobalContactsArray = GlobalContactsArray = Marshal.AllocHGlobal(maxContactsbeforedeath * d.Contact.unmanagedSizeOf);
456 450
457 m_materialContactsData[(int)Material.Stone].mu = frictionScale * 0.8f; 451 m_materialContactsData[(int)Material.Stone].mu = 0.8f;
458 m_materialContactsData[(int)Material.Stone].bounce = 0.4f; 452 m_materialContactsData[(int)Material.Stone].bounce = 0.4f;
459 453
460 m_materialContactsData[(int)Material.Metal].mu = frictionScale * 0.3f; 454 m_materialContactsData[(int)Material.Metal].mu = 0.3f;
461 m_materialContactsData[(int)Material.Metal].bounce = 0.4f; 455 m_materialContactsData[(int)Material.Metal].bounce = 0.4f;
462 456
463 m_materialContactsData[(int)Material.Glass].mu = frictionScale * 0.2f; 457 m_materialContactsData[(int)Material.Glass].mu = 0.2f;
464 m_materialContactsData[(int)Material.Glass].bounce = 0.7f; 458 m_materialContactsData[(int)Material.Glass].bounce = 0.7f;
465 459
466 m_materialContactsData[(int)Material.Wood].mu = frictionScale * 0.6f; 460 m_materialContactsData[(int)Material.Wood].mu = 0.6f;
467 m_materialContactsData[(int)Material.Wood].bounce = 0.5f; 461 m_materialContactsData[(int)Material.Wood].bounce = 0.5f;
468 462
469 m_materialContactsData[(int)Material.Flesh].mu = frictionScale * 0.9f; 463 m_materialContactsData[(int)Material.Flesh].mu = 0.9f;
470 m_materialContactsData[(int)Material.Flesh].bounce = 0.3f; 464 m_materialContactsData[(int)Material.Flesh].bounce = 0.3f;
471 465
472 m_materialContactsData[(int)Material.Plastic].mu = frictionScale * 0.4f; 466 m_materialContactsData[(int)Material.Plastic].mu = 0.4f;
473 m_materialContactsData[(int)Material.Plastic].bounce = 0.7f; 467 m_materialContactsData[(int)Material.Plastic].bounce = 0.7f;
474 468
475 m_materialContactsData[(int)Material.Rubber].mu = frictionScale * 0.9f; 469 m_materialContactsData[(int)Material.Rubber].mu = 0.9f;
476 m_materialContactsData[(int)Material.Rubber].bounce = 0.95f; 470 m_materialContactsData[(int)Material.Rubber].bounce = 0.95f;
477 471
478 m_materialContactsData[(int)Material.light].mu = 0.0f; 472 m_materialContactsData[(int)Material.light].mu = 0.0f;
479 m_materialContactsData[(int)Material.light].bounce = 0.0f; 473 m_materialContactsData[(int)Material.light].bounce = 0.0f;
480 474
481 TerrainFriction *= frictionScale;
482// AvatarFriction *= frictionScale;
483
484 // Set the gravity,, don't disable things automatically (we set it explicitly on some things) 475 // Set the gravity,, don't disable things automatically (we set it explicitly on some things)
485 476
486 d.WorldSetGravity(world, gravityx, gravityy, gravityz); 477 d.WorldSetGravity(world, gravityx, gravityy, gravityz);
@@ -566,13 +557,6 @@ namespace OpenSim.Region.Physics.OdePlugin
566 } 557 }
567 558
568 559
569 /// <summary>
570 /// This is our near callback. A geometry is near a body
571 /// </summary>
572 /// <param name="space">The space that contains the geoms. Remember, spaces are also geoms</param>
573 /// <param name="g1">a geometry or space</param>
574 /// <param name="g2">another geometry or space</param>
575 ///
576 560
577 private bool GetCurContactGeom(int index, ref d.ContactGeom newcontactgeom) 561 private bool GetCurContactGeom(int index, ref d.ContactGeom newcontactgeom)
578 { 562 {
@@ -584,7 +568,13 @@ namespace OpenSim.Region.Physics.OdePlugin
584 return true; 568 return true;
585 } 569 }
586 570
587 571 /// <summary>
572 /// This is our near callback. A geometry is near a body
573 /// </summary>
574 /// <param name="space">The space that contains the geoms. Remember, spaces are also geoms</param>
575 /// <param name="g1">a geometry or space</param>
576 /// <param name="g2">another geometry or space</param>
577 ///
588 578
589 private void near(IntPtr space, IntPtr g1, IntPtr g2) 579 private void near(IntPtr space, IntPtr g1, IntPtr g2)
590 { 580 {
@@ -703,8 +693,8 @@ namespace OpenSim.Region.Physics.OdePlugin
703 // big messy collision analises 693 // big messy collision analises
704 float mu = 0; 694 float mu = 0;
705 float bounce = 0; 695 float bounce = 0;
706 ContactData contactdata1; 696 ContactData contactdata1 = new ContactData(0, 0);
707 ContactData contactdata2; 697 ContactData contactdata2 = new ContactData(0, 0);
708 bool erpSoft = false; 698 bool erpSoft = false;
709 699
710 String name = null; 700 String name = null;
@@ -718,8 +708,9 @@ namespace OpenSim.Region.Physics.OdePlugin
718 switch (p2.PhysicsActorType) 708 switch (p2.PhysicsActorType)
719 { 709 {
720 case (int)ActorTypes.Agent: 710 case (int)ActorTypes.Agent:
721 contactdata1 = p1.ContactData; 711 p1.getContactData(ref contactdata1);
722 contactdata2 = p2.ContactData; 712 p2.getContactData(ref contactdata2);
713
723 bounce = contactdata1.bounce * contactdata2.bounce; 714 bounce = contactdata1.bounce * contactdata2.bounce;
724 715
725 mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu); 716 mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu);
@@ -731,8 +722,8 @@ namespace OpenSim.Region.Physics.OdePlugin
731 p2.CollidingObj = true; 722 p2.CollidingObj = true;
732 break; 723 break;
733 case (int)ActorTypes.Prim: 724 case (int)ActorTypes.Prim:
734 contactdata1 = p1.ContactData; 725 p1.getContactData(ref contactdata1);
735 contactdata2 = p2.ContactData; 726 p2.getContactData(ref contactdata2);
736 bounce = contactdata1.bounce * contactdata2.bounce; 727 bounce = contactdata1.bounce * contactdata2.bounce;
737 728
738 mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu); 729 mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu);
@@ -753,8 +744,8 @@ namespace OpenSim.Region.Physics.OdePlugin
753 switch (p2.PhysicsActorType) 744 switch (p2.PhysicsActorType)
754 { 745 {
755 case (int)ActorTypes.Agent: 746 case (int)ActorTypes.Agent:
756 contactdata1 = p1.ContactData; 747 p1.getContactData(ref contactdata1);
757 contactdata2 = p2.ContactData; 748 p2.getContactData(ref contactdata2);
758 bounce = contactdata1.bounce * contactdata2.bounce; 749 bounce = contactdata1.bounce * contactdata2.bounce;
759 750
760 mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu); 751 mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu);
@@ -772,8 +763,8 @@ namespace OpenSim.Region.Physics.OdePlugin
772 p1.CollidingObj = true; 763 p1.CollidingObj = true;
773 p2.CollidingObj = true; 764 p2.CollidingObj = true;
774 } 765 }
775 contactdata1 = p1.ContactData; 766 p1.getContactData(ref contactdata1);
776 contactdata2 = p2.ContactData; 767 p2.getContactData(ref contactdata2);
777 bounce = contactdata1.bounce * contactdata2.bounce; 768 bounce = contactdata1.bounce * contactdata2.bounce;
778 erpSoft = true; 769 erpSoft = true;
779 mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu); 770 mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu);
@@ -788,7 +779,7 @@ namespace OpenSim.Region.Physics.OdePlugin
788 if (name == "Terrain") 779 if (name == "Terrain")
789 { 780 {
790 erpSoft = true; 781 erpSoft = true;
791 contactdata1 = p1.ContactData; 782 p1.getContactData(ref contactdata1);
792 bounce = contactdata1.bounce * TerrainBounce; 783 bounce = contactdata1.bounce * TerrainBounce;
793 mu = (float)Math.Sqrt(contactdata1.mu * TerrainFriction); 784 mu = (float)Math.Sqrt(contactdata1.mu * TerrainFriction);
794 if (Math.Abs(p1.Velocity.X) > 0.1f || Math.Abs(p1.Velocity.Y) > 0.1f) 785 if (Math.Abs(p1.Velocity.X) > 0.1f || Math.Abs(p1.Velocity.Y) > 0.1f)
@@ -815,7 +806,7 @@ namespace OpenSim.Region.Physics.OdePlugin
815 { 806 {
816 erpSoft = true; 807 erpSoft = true;
817 p2.CollidingGround = true; 808 p2.CollidingGround = true;
818 contactdata2 = p2.ContactData; 809 p2.getContactData(ref contactdata2);
819 bounce = contactdata2.bounce * TerrainBounce; 810 bounce = contactdata2.bounce * TerrainBounce;
820 mu = (float)Math.Sqrt(contactdata2.mu * TerrainFriction); 811 mu = (float)Math.Sqrt(contactdata2.mu * TerrainFriction);
821 812
@@ -1013,15 +1004,24 @@ namespace OpenSim.Region.Physics.OdePlugin
1013 1004
1014 } 1005 }
1015 1006
1016 // collide active prims with static enviroment
1017 lock (_activeprims) 1007 lock (_activeprims)
1018 { 1008 {
1009 foreach (OdePrim aprim in _activeprims)
1010 {
1011 aprim.CollisionScore = 0;
1012 aprim.IsColliding = false;
1013 }
1014 }
1015
1016 // collide active prims with static enviroment
1017 lock (_activegroups)
1018 {
1019 try 1019 try
1020 { 1020 {
1021 foreach (OdePrim prm in _activeprims) 1021 foreach (OdePrim prm in _activegroups)
1022 { 1022 {
1023 if (d.BodyIsEnabled(prm.Body)) 1023 if (d.BodyIsEnabled(prm.Body) && !prm.m_outbounds)
1024 d.SpaceCollide2(StaticSpace, prm.prim_geom, IntPtr.Zero, nearCallback); 1024 d.SpaceCollide2(StaticSpace, prm.collide_geom, IntPtr.Zero, nearCallback);
1025 } 1025 }
1026 } 1026 }
1027 catch (AccessViolationException) 1027 catch (AccessViolationException)
@@ -1029,7 +1029,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1029 m_log.Warn("[PHYSICS]: Unable to collide Active prim to static space"); 1029 m_log.Warn("[PHYSICS]: Unable to collide Active prim to static space");
1030 } 1030 }
1031 } 1031 }
1032
1033 // finally colide active things amoung them 1032 // finally colide active things amoung them
1034 try 1033 try
1035 { 1034 {
@@ -1039,7 +1038,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1039 { 1038 {
1040 m_log.Warn("[PHYSICS]: Unable to collide in Active space"); 1039 m_log.Warn("[PHYSICS]: Unable to collide in Active space");
1041 } 1040 }
1042
1043// _perloopContact.Clear(); 1041// _perloopContact.Clear();
1044 } 1042 }
1045 1043
@@ -1148,13 +1146,20 @@ namespace OpenSim.Region.Physics.OdePlugin
1148 1146
1149 public void addActivePrim(OdePrim activatePrim) 1147 public void addActivePrim(OdePrim activatePrim)
1150 { 1148 {
1151 // adds active prim.. (ones that should be iterated over in collisions_optimized 1149 // adds active prim..
1152 lock (_activeprims) 1150 lock (_activeprims)
1153 { 1151 {
1154 if (!_activeprims.Contains(activatePrim)) 1152 if (!_activeprims.Contains(activatePrim))
1155 _activeprims.Add(activatePrim); 1153 _activeprims.Add(activatePrim);
1156 //else 1154 }
1157 // m_log.Warn("[PHYSICS]: Double Entry in _activeprims detected, potential crash immenent"); 1155 }
1156
1157 public void addActiveGroups(OdePrim activatePrim)
1158 {
1159 lock (_activegroups)
1160 {
1161 if (!_activegroups.Contains(activatePrim))
1162 _activegroups.Add(activatePrim);
1158 } 1163 }
1159 } 1164 }
1160 1165
@@ -1186,6 +1191,13 @@ namespace OpenSim.Region.Physics.OdePlugin
1186 _activeprims.Remove(deactivatePrim); 1191 _activeprims.Remove(deactivatePrim);
1187 } 1192 }
1188 } 1193 }
1194 public void remActiveGroup(OdePrim deactivatePrim)
1195 {
1196 lock (_activegroups)
1197 {
1198 _activegroups.Remove(deactivatePrim);
1199 }
1200 }
1189 1201
1190 public override void RemovePrim(PhysicsActor prim) 1202 public override void RemovePrim(PhysicsActor prim)
1191 { 1203 {
@@ -1258,6 +1270,11 @@ namespace OpenSim.Region.Physics.OdePlugin
1258 { 1270 {
1259 waitForSpaceUnlock(currentspace); 1271 waitForSpaceUnlock(currentspace);
1260 d.SpaceRemove(currentspace, geom); 1272 d.SpaceRemove(currentspace, geom);
1273
1274 if (d.SpaceGetSublevel(currentspace) > 2 && d.SpaceGetNumGeoms(currentspace) == 0)
1275 {
1276 d.SpaceDestroy(currentspace);
1277 }
1261 } 1278 }
1262 else 1279 else
1263 { 1280 {
@@ -1274,6 +1291,12 @@ namespace OpenSim.Region.Physics.OdePlugin
1274 { 1291 {
1275 waitForSpaceUnlock(currentspace); 1292 waitForSpaceUnlock(currentspace);
1276 d.SpaceRemove(currentspace, geom); 1293 d.SpaceRemove(currentspace, geom);
1294
1295 if (d.SpaceGetSublevel(currentspace) > 2 && d.SpaceGetNumGeoms(currentspace) == 0)
1296 {
1297 d.SpaceDestroy(currentspace);
1298 }
1299
1277 } 1300 }
1278 } 1301 }
1279 } 1302 }
@@ -1577,42 +1600,14 @@ namespace OpenSim.Region.Physics.OdePlugin
1577 1600
1578 statchanges += Util.EnvironmentTickCountSubtract(statstart); 1601 statchanges += Util.EnvironmentTickCountSubtract(statstart);
1579 1602
1580 // Move characters
1581 lock (_characters)
1582 {
1583 List<OdeCharacter> defects = new List<OdeCharacter>();
1584 foreach (OdeCharacter actor in _characters)
1585 {
1586 if (actor != null)
1587 actor.Move(ODE_STEPSIZE, defects);
1588 }
1589 if (defects.Count != 0)
1590 {
1591 foreach (OdeCharacter defect in defects)
1592 {
1593 RemoveCharacter(defect);
1594 }
1595 }
1596 }
1597 statchmove += Util.EnvironmentTickCountSubtract(statstart);
1598
1599 // Move other active objects
1600 lock (_activeprims)
1601 {
1602 foreach (OdePrim aprim in _activeprims)
1603 {
1604 aprim.CollisionScore = 0;
1605 aprim.IsColliding = false;
1606 aprim.Move();
1607 }
1608 }
1609
1610 statactmove += Util.EnvironmentTickCountSubtract(statstart); 1603 statactmove += Util.EnvironmentTickCountSubtract(statstart);
1611 //if ((framecount % m_randomizeWater) == 0) 1604 //if ((framecount % m_randomizeWater) == 0)
1612 // randomizeWater(waterlevel); 1605 // randomizeWater(waterlevel);
1613 1606
1614 m_rayCastManager.ProcessQueuedRequests(); 1607 m_rayCastManager.ProcessQueuedRequests();
1615 1608
1609
1610
1616 statray += Util.EnvironmentTickCountSubtract(statstart); 1611 statray += Util.EnvironmentTickCountSubtract(statstart);
1617 collision_optimized(); 1612 collision_optimized();
1618 statcol += Util.EnvironmentTickCountSubtract(statstart); 1613 statcol += Util.EnvironmentTickCountSubtract(statstart);
@@ -1642,8 +1637,35 @@ namespace OpenSim.Region.Physics.OdePlugin
1642 1637
1643 d.WorldQuickStep(world, ODE_STEPSIZE); 1638 d.WorldQuickStep(world, ODE_STEPSIZE);
1644 statstep += Util.EnvironmentTickCountSubtract(statstart); 1639 statstep += Util.EnvironmentTickCountSubtract(statstart);
1645 d.JointGroupEmpty(contactgroup); 1640
1646 totjcontact += m_global_contactcount; 1641 // Move characters
1642 lock (_characters)
1643 {
1644 List<OdeCharacter> defects = new List<OdeCharacter>();
1645 foreach (OdeCharacter actor in _characters)
1646 {
1647 if (actor != null)
1648 actor.Move(ODE_STEPSIZE, defects);
1649 }
1650 if (defects.Count != 0)
1651 {
1652 foreach (OdeCharacter defect in defects)
1653 {
1654 RemoveCharacter(defect);
1655 }
1656 }
1657 }
1658 statchmove += Util.EnvironmentTickCountSubtract(statstart);
1659
1660 // Move other active objects
1661 lock (_activegroups)
1662 {
1663 foreach (OdePrim aprim in _activegroups)
1664 {
1665 aprim.Move();
1666 }
1667 }
1668
1647 //ode.dunlock(world); 1669 //ode.dunlock(world);
1648 } 1670 }
1649 catch (Exception e) 1671 catch (Exception e)
@@ -1652,6 +1674,9 @@ namespace OpenSim.Region.Physics.OdePlugin
1652// ode.dunlock(world); 1674// ode.dunlock(world);
1653 } 1675 }
1654 1676
1677 d.JointGroupEmpty(contactgroup);
1678 totjcontact += m_global_contactcount;
1679
1655 step_time -= ODE_STEPSIZE; 1680 step_time -= ODE_STEPSIZE;
1656 nodeframes++; 1681 nodeframes++;
1657 } 1682 }
@@ -1686,10 +1711,10 @@ namespace OpenSim.Region.Physics.OdePlugin
1686 } 1711 }
1687 statmovchar = Util.EnvironmentTickCountSubtract(statstart); 1712 statmovchar = Util.EnvironmentTickCountSubtract(statstart);
1688 1713
1689 lock (_activeprims) 1714 lock (_activegroups)
1690 { 1715 {
1691 { 1716 {
1692 foreach (OdePrim actor in _activeprims) 1717 foreach (OdePrim actor in _activegroups)
1693 { 1718 {
1694 if (actor.IsPhysical) 1719 if (actor.IsPhysical)
1695 { 1720 {
@@ -1906,13 +1931,14 @@ namespace OpenSim.Region.Physics.OdePlugin
1906 yy += regionsize; 1931 yy += regionsize;
1907 1932
1908 val = heightMap[yy + xx]; 1933 val = heightMap[yy + xx];
1934 if (val < 0.0f)
1935 val = 0.0f; // no neg terrain as in chode
1909 _heightmap[xt + y] = val; 1936 _heightmap[xt + y] = val;
1910 1937
1911 if (hfmin > val) 1938 if (hfmin > val)
1912 hfmin = val; 1939 hfmin = val;
1913 if (hfmax < val) 1940 if (hfmax < val)
1914 hfmax = val; 1941 hfmax = val;
1915
1916 } 1942 }
1917 xt += heightmapHeightSamples; 1943 xt += heightmapHeightSamples;
1918 } 1944 }
@@ -1966,7 +1992,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1966 1992
1967 d.RFromAxisAndAngle(out R, v3.X, v3.Y, v3.Z, angle); 1993 d.RFromAxisAndAngle(out R, v3.X, v3.Y, v3.Z, angle);
1968 d.GeomSetRotation(GroundGeom, ref R); 1994 d.GeomSetRotation(GroundGeom, ref R);
1969 d.GeomSetPosition(GroundGeom, pOffset.X + (float)Constants.RegionSize * 0.5f - 0.5f, pOffset.Y + (float)Constants.RegionSize * 0.5f - 0.5f, 0); 1995 d.GeomSetPosition(GroundGeom, pOffset.X + (float)Constants.RegionSize * 0.5f, pOffset.Y + (float)Constants.RegionSize * 0.5f, 0);
1970 RegionTerrain.Add(pOffset, GroundGeom, GroundGeom); 1996 RegionTerrain.Add(pOffset, GroundGeom, GroundGeom);
1971// TerrainHeightFieldHeights.Add(GroundGeom, ODElandMap); 1997// TerrainHeightFieldHeights.Add(GroundGeom, ODElandMap);
1972 TerrainHeightFieldHeights.Add(GroundGeom, _heightmap); 1998 TerrainHeightFieldHeights.Add(GroundGeom, _heightmap);