aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics
diff options
context:
space:
mode:
authorUbitUmarov2012-07-12 20:05:00 +0100
committerUbitUmarov2012-07-12 20:05:00 +0100
commit4c2523b1c2dd518cc21baf7674775fa2e11e1ca9 (patch)
tree48f58979253066b6a4f201afc7775283d871f1e3 /OpenSim/Region/Physics
parentRevert "Add instrumentation to log finalizer being called. Suppressed for bac... (diff)
downloadopensim-SC-4c2523b1c2dd518cc21baf7674775fa2e11e1ca9.zip
opensim-SC-4c2523b1c2dd518cc21baf7674775fa2e11e1ca9.tar.gz
opensim-SC-4c2523b1c2dd518cc21baf7674775fa2e11e1ca9.tar.bz2
opensim-SC-4c2523b1c2dd518cc21baf7674775fa2e11e1ca9.tar.xz
Use faster any contact point collision detection for Volumedetect, plus
some clean up
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs123
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/OdeApi.cs2
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs14
3 files changed, 41 insertions, 98 deletions
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
index ff17a6e..8d5f269 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
@@ -134,7 +134,7 @@ namespace OpenSim.Region.Physics.OdePlugin
134 134
135// private bool m_collidesLand = true; 135// private bool m_collidesLand = true;
136 private bool m_collidesWater; 136 private bool m_collidesWater;
137 public bool m_returnCollisions; 137// public bool m_returnCollisions;
138 138
139 private bool m_NoColide; // for now only for internal use for bad meshs 139 private bool m_NoColide; // for now only for internal use for bad meshs
140 140
@@ -164,8 +164,8 @@ namespace OpenSim.Region.Physics.OdePlugin
164 private List<OdePrim> childrenPrim = new List<OdePrim>(); 164 private List<OdePrim> childrenPrim = new List<OdePrim>();
165 165
166 166
167 private bool m_throttleUpdates; 167// private bool m_throttleUpdates;
168 private int throttleCounter; 168// private int throttleCounter;
169 public float m_collisionscore; 169 public float m_collisionscore;
170 int m_colliderfilter = 0; 170 int m_colliderfilter = 0;
171 171
@@ -363,12 +363,14 @@ namespace OpenSim.Region.Physics.OdePlugin
363 set { return; } 363 set { return; }
364 } 364 }
365 365
366 public override bool ThrottleUpdates 366
367 public override bool ThrottleUpdates {get;set;}
368/*
367 { 369 {
368 get { return m_throttleUpdates; } 370 get { return m_throttleUpdates; }
369 set { m_throttleUpdates = value; } 371 set { m_throttleUpdates = value; }
370 } 372 }
371 373*/
372 public override bool Stopped 374 public override bool Stopped
373 { 375 {
374 get { return _zeroFlag; } 376 get { return _zeroFlag; }
@@ -951,7 +953,8 @@ namespace OpenSim.Region.Physics.OdePlugin
951 { 953 {
952 if (CollisionEventsThisFrame == null) 954 if (CollisionEventsThisFrame == null)
953 CollisionEventsThisFrame = new CollisionEventUpdate(); 955 CollisionEventsThisFrame = new CollisionEventUpdate();
954 CollisionEventsThisFrame.AddCollider(CollidedWith, contact); 956// if(CollisionEventsThisFrame.Count < 32)
957 CollisionEventsThisFrame.AddCollider(CollidedWith, contact);
955 } 958 }
956 959
957 public void SendCollisions() 960 public void SendCollisions()
@@ -977,6 +980,10 @@ namespace OpenSim.Region.Physics.OdePlugin
977 } 980 }
978 else 981 else
979 { 982 {
983 if (ncolisions > 10)
984 {
985 }
986
980 SentEmptyCollisionsEvent = false; 987 SentEmptyCollisionsEvent = false;
981 CollisionEventsThisFrame.Clear(); 988 CollisionEventsThisFrame.Clear();
982 } 989 }
@@ -1746,8 +1753,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1746 if (childrenPrim.Count == 0) 1753 if (childrenPrim.Count == 0)
1747 { 1754 {
1748 collide_geom = prim_geom; 1755 collide_geom = prim_geom;
1749 m_targetSpace = _parent_scene.ActiveSpace; 1756 m_targetSpace = _parent_scene.ActiveSpace;
1750 d.SpaceAdd(m_targetSpace, prim_geom);
1751 } 1757 }
1752 else 1758 else
1753 { 1759 {
@@ -1755,7 +1761,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1755 d.HashSpaceSetLevels(m_targetSpace, -2, 8); 1761 d.HashSpaceSetLevels(m_targetSpace, -2, 8);
1756 d.SpaceSetSublevel(m_targetSpace, 3); 1762 d.SpaceSetSublevel(m_targetSpace, 3);
1757 d.SpaceSetCleanup(m_targetSpace, false); 1763 d.SpaceSetCleanup(m_targetSpace, false);
1758 d.SpaceAdd(m_targetSpace, prim_geom);
1759 1764
1760 d.GeomSetCategoryBits(m_targetSpace, (uint)(CollisionCategories.Space | 1765 d.GeomSetCategoryBits(m_targetSpace, (uint)(CollisionCategories.Space |
1761 CollisionCategories.Geom | 1766 CollisionCategories.Geom |
@@ -1766,12 +1771,21 @@ namespace OpenSim.Region.Physics.OdePlugin
1766 collide_geom = m_targetSpace; 1771 collide_geom = m_targetSpace;
1767 } 1772 }
1768 1773
1774 d.SpaceAdd(m_targetSpace, prim_geom);
1775
1769 if (m_delaySelect) 1776 if (m_delaySelect)
1770 { 1777 {
1771 m_isSelected = true; 1778 m_isSelected = true;
1772 m_delaySelect = false; 1779 m_delaySelect = false;
1773 } 1780 }
1774 1781
1782 m_collisionscore = 0;
1783
1784 UpdateCollisionCatFlags();
1785 ApplyCollisionCatFlags();
1786
1787 _parent_scene.addActivePrim(this);
1788
1775 lock (childrenPrim) 1789 lock (childrenPrim)
1776 { 1790 {
1777 foreach (OdePrim prm in childrenPrim) 1791 foreach (OdePrim prm in childrenPrim)
@@ -1809,10 +1823,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1809 createAMotor(m_angularlock); 1823 createAMotor(m_angularlock);
1810 } 1824 }
1811 1825
1812 m_collisionscore = 0;
1813
1814 UpdateCollisionCatFlags();
1815 ApplyCollisionCatFlags();
1816 1826
1817 if (m_isSelected || m_disabled) 1827 if (m_isSelected || m_disabled)
1818 { 1828 {
@@ -1824,7 +1834,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1824 d.BodySetLinearVel(Body, _velocity.X, _velocity.Y, _velocity.Z); 1834 d.BodySetLinearVel(Body, _velocity.X, _velocity.Y, _velocity.Z);
1825 } 1835 }
1826 1836
1827 _parent_scene.addActivePrim(this);
1828 _parent_scene.addActiveGroups(this); 1837 _parent_scene.addActiveGroups(this);
1829 } 1838 }
1830 1839
@@ -3441,92 +3450,14 @@ namespace OpenSim.Region.Physics.OdePlugin
3441 if (++bodydisablecontrol < 20) 3450 if (++bodydisablecontrol < 20)
3442 return; 3451 return;
3443 3452
3444 bodydisablecontrol = 0; 3453
3445 d.BodyEnable(Body); 3454 d.BodyEnable(Body);
3446 } 3455 }
3447 3456
3448 d.Vector3 lpos = d.GeomGetPosition(prim_geom); // root position that is seem by rest of simulator 3457 bodydisablecontrol = 0;
3449
3450/* moved down to UpdateMove... where it belongs again
3451
3452 // check outside region
3453
3454 if (lpos.Z < -100 || lpos.Z > 100000f)
3455 {
3456 m_outbounds = true;
3457
3458 lpos.Z = Util.Clip(lpos.Z, -100f, 100000f);
3459 _acceleration.X = 0;
3460 _acceleration.Y = 0;
3461 _acceleration.Z = 0;
3462
3463 _velocity.X = 0;
3464 _velocity.Y = 0;
3465 _velocity.Z = 0;
3466 m_rotationalVelocity.X = 0;
3467 m_rotationalVelocity.Y = 0;
3468 m_rotationalVelocity.Z = 0;
3469
3470 d.BodySetLinearVel(Body, 0, 0, 0); // stop it
3471 d.BodySetAngularVel(Body, 0, 0, 0); // stop it
3472 d.BodySetPosition(Body, lpos.X, lpos.Y, lpos.Z); // put it somewhere
3473 m_lastposition = _position;
3474 m_lastorientation = _orientation;
3475
3476 base.RequestPhysicsterseUpdate();
3477
3478 throttleCounter = 0;
3479 _zeroFlag = true;
3480
3481 disableBodySoft(); // disable it and colisions
3482 base.RaiseOutOfBounds(_position);
3483 return;
3484 }
3485
3486 if (lpos.X < 0f)
3487 {
3488 _position.X = Util.Clip(lpos.X, -2f, -0.1f);
3489 m_outbounds = true;
3490 }
3491 else if (lpos.X > _parent_scene.WorldExtents.X)
3492 {
3493 _position.X = Util.Clip(lpos.X, _parent_scene.WorldExtents.X + 0.1f, _parent_scene.WorldExtents.X + 2f);
3494 m_outbounds = true;
3495 }
3496 if (lpos.Y < 0f)
3497 {
3498 _position.Y = Util.Clip(lpos.Y, -2f, -0.1f);
3499 m_outbounds = true;
3500 }
3501 else if (lpos.Y > _parent_scene.WorldExtents.Y)
3502 {
3503 _position.Y = Util.Clip(lpos.Y, _parent_scene.WorldExtents.Y + 0.1f, _parent_scene.WorldExtents.Y + 2f);
3504 m_outbounds = true;
3505 }
3506 3458
3507 if (m_outbounds) 3459 d.Vector3 lpos = d.GeomGetPosition(prim_geom); // root position that is seem by rest of simulator
3508 {
3509 m_lastposition = _position;
3510 m_lastorientation = _orientation;
3511
3512 d.Vector3 dtmp = d.BodyGetAngularVel(Body);
3513 m_rotationalVelocity.X = dtmp.X;
3514 m_rotationalVelocity.Y = dtmp.Y;
3515 m_rotationalVelocity.Z = dtmp.Z;
3516
3517 dtmp = d.BodyGetLinearVel(Body);
3518 _velocity.X = dtmp.X;
3519 _velocity.Y = dtmp.Y;
3520 _velocity.Z = dtmp.Z;
3521 3460
3522 d.BodySetLinearVel(Body, 0, 0, 0); // stop it
3523 d.BodySetAngularVel(Body, 0, 0, 0);
3524 d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
3525 disableBodySoft(); // stop collisions
3526 base.RequestPhysicsterseUpdate();
3527 return;
3528 }
3529*/
3530 if (m_vehicle != null && m_vehicle.Type != Vehicle.TYPE_NONE) 3461 if (m_vehicle != null && m_vehicle.Type != Vehicle.TYPE_NONE)
3531 { 3462 {
3532 // 'VEHICLES' are dealt with in ODEDynamics.cs 3463 // 'VEHICLES' are dealt with in ODEDynamics.cs
@@ -3721,7 +3652,7 @@ namespace OpenSim.Region.Physics.OdePlugin
3721 3652
3722 base.RequestPhysicsterseUpdate(); 3653 base.RequestPhysicsterseUpdate();
3723 3654
3724 throttleCounter = 0; 3655// throttleCounter = 0;
3725 _zeroFlag = true; 3656 _zeroFlag = true;
3726 3657
3727 disableBodySoft(); // disable it and colisions 3658 disableBodySoft(); // disable it and colisions
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeApi.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeApi.cs
index 2341186..ee48db5 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/OdeApi.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeApi.cs
@@ -61,6 +61,8 @@ namespace OdeAPI
61 public static int NTotalBodies = 0; 61 public static int NTotalBodies = 0;
62 public static int NTotalGeoms = 0; 62 public static int NTotalGeoms = 0;
63 63
64 public const uint CONTACTS_UNIMPORTANT = 0x80000000;
65
64 #region Flags and Enumerations 66 #region Flags and Enumerations
65 67
66 [Flags] 68 [Flags]
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
index 7848b35..088d2ba 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
@@ -713,8 +713,18 @@ namespace OpenSim.Region.Physics.OdePlugin
713 713
714 if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact)) 714 if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact))
715 return; 715 return;
716 716 if(d.GeomGetCategoryBits(g1) == (uint)CollisionCategories.VolumeDtc ||
717 count = d.CollidePtr(g1, g2, (contactsPerCollision & 0xffff), ContactgeomsArray, d.ContactGeom.unmanagedSizeOf); 717 d.GeomGetCategoryBits(g1) == (uint)CollisionCategories.VolumeDtc)
718 {
719 int cflags;
720 unchecked
721 {
722 cflags = (int)(1 | d.CONTACTS_UNIMPORTANT);
723 }
724 count = d.CollidePtr(g1, g2, cflags, ContactgeomsArray, d.ContactGeom.unmanagedSizeOf);
725 }
726 else
727 count = d.CollidePtr(g1, g2, (contactsPerCollision & 0xffff), ContactgeomsArray, d.ContactGeom.unmanagedSizeOf);
718 } 728 }
719 catch (SEHException) 729 catch (SEHException)
720 { 730 {