aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdePlugin.cs65
1 files changed, 53 insertions, 12 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index 533464e..bf9d5d8 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -276,6 +276,8 @@ namespace OpenSim.Region.Physics.OdePlugin
276 public d.Vector3 xyz = new d.Vector3(128.1640f, 128.3079f, 25.7600f); 276 public d.Vector3 xyz = new d.Vector3(128.1640f, 128.3079f, 25.7600f);
277 public d.Vector3 hpr = new d.Vector3(125.5000f, -17.0000f, 0.0000f); 277 public d.Vector3 hpr = new d.Vector3(125.5000f, -17.0000f, 0.0000f);
278 278
279 private volatile int m_global_contactcount = 0;
280
279 /// <summary> 281 /// <summary>
280 /// Initiailizes the scene 282 /// Initiailizes the scene
281 /// Sets many properties that ODE requires to be stable 283 /// Sets many properties that ODE requires to be stable
@@ -832,6 +834,10 @@ namespace OpenSim.Region.Physics.OdePlugin
832 if (!skipThisContact && checkDupe(contacts[i], p2.PhysicsActorType)) 834 if (!skipThisContact && checkDupe(contacts[i], p2.PhysicsActorType))
833 skipThisContact = true; 835 skipThisContact = true;
834 836
837 int maxContactsbeforedeath = 4000;
838 joint = IntPtr.Zero;
839
840
835 if (!skipThisContact) 841 if (!skipThisContact)
836 { 842 {
837 // If we're colliding against terrain 843 // If we're colliding against terrain
@@ -844,23 +850,31 @@ namespace OpenSim.Region.Physics.OdePlugin
844 // Use the movement terrain contact 850 // Use the movement terrain contact
845 AvatarMovementTerrainContact.geom = contacts[i]; 851 AvatarMovementTerrainContact.geom = contacts[i];
846 _perloopContact.Add(contacts[i]); 852 _perloopContact.Add(contacts[i]);
847 joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementTerrainContact); 853 if (m_global_contactcount < maxContactsbeforedeath)
854 {
855 joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementTerrainContact);
856 m_global_contactcount++;
857 }
848 } 858 }
849 else 859 else
850 { 860 {
851 // Use the non moving terrain contact 861 // Use the non moving terrain contact
852 TerrainContact.geom = contacts[i]; 862 TerrainContact.geom = contacts[i];
853 _perloopContact.Add(contacts[i]); 863 _perloopContact.Add(contacts[i]);
854 joint = d.JointCreateContact(world, contactgroup, ref TerrainContact); 864 if (m_global_contactcount < maxContactsbeforedeath)
865 {
866 joint = d.JointCreateContact(world, contactgroup, ref TerrainContact);
867 m_global_contactcount++;
868 }
855 } 869 }
856 //if (p2.PhysicsActorType == (int)ActorTypes.Prim) 870 //if (p2.PhysicsActorType == (int)ActorTypes.Prim)
857 //{ 871 //{
858 //m_log.Debug("[PHYSICS]: prim contacting with ground"); 872 //m_log.Debug("[PHYSICS]: prim contacting with ground");
859 //} 873 //}
860 } 874 }
861 else if (name1 == "Water" || name2 == "Water") 875 else if (name1 == "Water" || name2 == "Water")
862 { 876 {
863 if ((p2.PhysicsActorType == (int)ActorTypes.Prim)) 877 if ((p2.PhysicsActorType == (int) ActorTypes.Prim))
864 { 878 {
865 } 879 }
866 else 880 else
@@ -877,29 +891,49 @@ namespace OpenSim.Region.Physics.OdePlugin
877 } 891 }
878 WaterContact.geom = contacts[i]; 892 WaterContact.geom = contacts[i];
879 _perloopContact.Add(contacts[i]); 893 _perloopContact.Add(contacts[i]);
880 joint = d.JointCreateContact(world, contactgroup, ref WaterContact); 894 if (m_global_contactcount < maxContactsbeforedeath)
881 895 {
896 joint = d.JointCreateContact(world, contactgroup, ref WaterContact);
897 m_global_contactcount++;
898 }
882 //m_log.Info("[PHYSICS]: Prim Water Contact" + contacts[i].depth); 899 //m_log.Info("[PHYSICS]: Prim Water Contact" + contacts[i].depth);
883 } 900 }
884 else 901 else
885 { // we're colliding with prim or avatar 902 {
903 // we're colliding with prim or avatar
886 // check if we're moving 904 // check if we're moving
887 if ((p2.PhysicsActorType == (int)ActorTypes.Agent) && 905 if ((p2.PhysicsActorType == (int) ActorTypes.Agent) &&
888 (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) 906 (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f))
889 { 907 {
890 // Use the Movement prim contact 908 // Use the Movement prim contact
891 AvatarMovementprimContact.geom = contacts[i]; 909 AvatarMovementprimContact.geom = contacts[i];
892 _perloopContact.Add(contacts[i]); 910 _perloopContact.Add(contacts[i]);
893 joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementprimContact); 911 if (m_global_contactcount < maxContactsbeforedeath)
912 {
913 joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementprimContact);
914 m_global_contactcount++;
915 }
894 } 916 }
895 else 917 else
896 { // Use the non movement contact 918 {
919 // Use the non movement contact
897 contact.geom = contacts[i]; 920 contact.geom = contacts[i];
898 _perloopContact.Add(contacts[i]); 921 _perloopContact.Add(contacts[i]);
899 joint = d.JointCreateContact(world, contactgroup, ref contact); 922
923 if (m_global_contactcount < maxContactsbeforedeath)
924 {
925 joint = d.JointCreateContact(world, contactgroup, ref contact);
926 m_global_contactcount++;
927 }
900 } 928 }
901 } 929 }
902 d.JointAttach(joint, b1, b2); 930
931 if (m_global_contactcount < maxContactsbeforedeath && joint != IntPtr.Zero) // stack collide!
932 {
933 d.JointAttach(joint, b1, b2);
934 m_global_contactcount++;
935 }
936
903 } 937 }
904 collision_accounting_events(p1, p2, max_collision_depth); 938 collision_accounting_events(p1, p2, max_collision_depth);
905 if (count > geomContactPointsStartthrottle) 939 if (count > geomContactPointsStartthrottle)
@@ -2543,6 +2577,13 @@ namespace OpenSim.Region.Physics.OdePlugin
2543 } 2577 }
2544 } 2578 }
2545 2579
2580 //if (m_global_contactcount > 5)
2581 //{
2582 // m_log.DebugFormat("[PHYSICS]: Contacts:{0}", m_global_contactcount);
2583 //}
2584
2585 m_global_contactcount = 0;
2586
2546 d.WorldQuickStep(world, ODE_STEPSIZE); 2587 d.WorldQuickStep(world, ODE_STEPSIZE);
2547 d.JointGroupEmpty(contactgroup); 2588 d.JointGroupEmpty(contactgroup);
2548 //ode.dunlock(world); 2589 //ode.dunlock(world);