diff options
author | Melanie | 2013-01-26 01:56:23 +0000 |
---|---|---|
committer | Melanie | 2013-01-26 01:56:23 +0000 |
commit | e28c042dce141954477baa1a3babad9ce2a80e58 (patch) | |
tree | 000f7091deb70abb6b8574d4107e91e259255f40 /OpenSim/Region/Physics | |
parent | Merge branch 'master' into careminster (diff) | |
parent | * This adds llVolumeDetect functionality to the C# implementation of BulletSim. (diff) | |
download | opensim-SC-e28c042dce141954477baa1a3babad9ce2a80e58.zip opensim-SC-e28c042dce141954477baa1a3babad9ce2a80e58.tar.gz opensim-SC-e28c042dce141954477baa1a3babad9ce2a80e58.tar.bz2 opensim-SC-e28c042dce141954477baa1a3babad9ce2a80e58.tar.xz |
Merge branch 'master' into careminster
Diffstat (limited to 'OpenSim/Region/Physics')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs | 202 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | 11 |
2 files changed, 127 insertions, 86 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs b/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs index f63d83c..04e77b8 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs | |||
@@ -137,6 +137,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
137 | internal int LastEntityProperty = 0; | 137 | internal int LastEntityProperty = 0; |
138 | 138 | ||
139 | internal EntityProperties[] UpdatedObjects; | 139 | internal EntityProperties[] UpdatedObjects; |
140 | internal Dictionary<uint, GhostObject> specialCollisionObjects; | ||
140 | 141 | ||
141 | private static int m_collisionsThisFrame; | 142 | private static int m_collisionsThisFrame; |
142 | private BSScene PhysicsScene { get; set; } | 143 | private BSScene PhysicsScene { get; set; } |
@@ -158,7 +159,13 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
158 | { | 159 | { |
159 | DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; | 160 | DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; |
160 | RigidBody body = ((BulletBodyXNA)pBody).rigidBody; | 161 | RigidBody body = ((BulletBodyXNA)pBody).rigidBody; |
161 | world.RemoveRigidBody(body); | 162 | CollisionObject collisionObject = ((BulletBodyXNA)pBody).body; |
163 | if (body != null) | ||
164 | world.RemoveRigidBody(body); | ||
165 | else if (collisionObject != null) | ||
166 | world.RemoveCollisionObject(collisionObject); | ||
167 | else | ||
168 | return false; | ||
162 | return true; | 169 | return true; |
163 | } | 170 | } |
164 | 171 | ||
@@ -182,7 +189,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
182 | 189 | ||
183 | public override void SetRestitution(BulletBody pCollisionObject, float pRestitution) | 190 | public override void SetRestitution(BulletBody pCollisionObject, float pRestitution) |
184 | { | 191 | { |
185 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; | 192 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body; |
186 | collisionObject.SetRestitution(pRestitution); | 193 | collisionObject.SetRestitution(pRestitution); |
187 | } | 194 | } |
188 | 195 | ||
@@ -219,13 +226,13 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
219 | 226 | ||
220 | public override void SetCcdMotionThreshold(BulletBody pCollisionObject, float pccdMotionThreashold) | 227 | public override void SetCcdMotionThreshold(BulletBody pCollisionObject, float pccdMotionThreashold) |
221 | { | 228 | { |
222 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; | 229 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body; |
223 | collisionObject.SetCcdMotionThreshold(pccdMotionThreashold); | 230 | collisionObject.SetCcdMotionThreshold(pccdMotionThreashold); |
224 | } | 231 | } |
225 | 232 | ||
226 | public override void SetCcdSweptSphereRadius(BulletBody pCollisionObject, float pCcdSweptSphereRadius) | 233 | public override void SetCcdSweptSphereRadius(BulletBody pCollisionObject, float pCcdSweptSphereRadius) |
227 | { | 234 | { |
228 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; | 235 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body; |
229 | collisionObject.SetCcdSweptSphereRadius(pCcdSweptSphereRadius); | 236 | collisionObject.SetCcdSweptSphereRadius(pCcdSweptSphereRadius); |
230 | } | 237 | } |
231 | 238 | ||
@@ -262,7 +269,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
262 | } | 269 | } |
263 | else | 270 | else |
264 | { | 271 | { |
265 | world.AddCollisionObject(rbody); | 272 | world.AddCollisionObject(cbody); |
266 | } | 273 | } |
267 | cbody.SetWorldTransform(origPos); | 274 | cbody.SetWorldTransform(origPos); |
268 | 275 | ||
@@ -303,7 +310,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
303 | 310 | ||
304 | public override bool SetCollisionGroupMask(BulletBody pCollisionObject, uint pGroup, uint pMask) | 311 | public override bool SetCollisionGroupMask(BulletBody pCollisionObject, uint pGroup, uint pMask) |
305 | { | 312 | { |
306 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; | 313 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body; |
307 | collisionObject.GetBroadphaseHandle().m_collisionFilterGroup = (BulletXNA.BulletCollision.CollisionFilterGroups) pGroup; | 314 | collisionObject.GetBroadphaseHandle().m_collisionFilterGroup = (BulletXNA.BulletCollision.CollisionFilterGroups) pGroup; |
308 | collisionObject.GetBroadphaseHandle().m_collisionFilterGroup = (BulletXNA.BulletCollision.CollisionFilterGroups) pGroup; | 315 | collisionObject.GetBroadphaseHandle().m_collisionFilterGroup = (BulletXNA.BulletCollision.CollisionFilterGroups) pGroup; |
309 | if ((uint) collisionObject.GetBroadphaseHandle().m_collisionFilterGroup == 0) | 316 | if ((uint) collisionObject.GetBroadphaseHandle().m_collisionFilterGroup == 0) |
@@ -390,7 +397,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
390 | 397 | ||
391 | public override void SetTranslation(BulletBody pCollisionObject, Vector3 _position, Quaternion _orientation) | 398 | public override void SetTranslation(BulletBody pCollisionObject, Vector3 _position, Quaternion _orientation) |
392 | { | 399 | { |
393 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; | 400 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body; |
394 | IndexedVector3 vposition = new IndexedVector3(_position.X, _position.Y, _position.Z); | 401 | IndexedVector3 vposition = new IndexedVector3(_position.X, _position.Y, _position.Z); |
395 | IndexedQuaternion vquaternion = new IndexedQuaternion(_orientation.X, _orientation.Y, _orientation.Z, | 402 | IndexedQuaternion vquaternion = new IndexedQuaternion(_orientation.X, _orientation.Y, _orientation.Z, |
396 | _orientation.W); | 403 | _orientation.W); |
@@ -418,8 +425,11 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
418 | public override void SetMassProps(BulletBody pBody, float pphysMass, Vector3 plocalInertia) | 425 | public override void SetMassProps(BulletBody pBody, float pphysMass, Vector3 plocalInertia) |
419 | { | 426 | { |
420 | RigidBody body = (pBody as BulletBodyXNA).rigidBody; | 427 | RigidBody body = (pBody as BulletBodyXNA).rigidBody; |
421 | IndexedVector3 inertia = new IndexedVector3(plocalInertia.X, plocalInertia.Y, plocalInertia.Z); | 428 | if (body != null) // Can't set mass props on collision object. |
422 | body.SetMassProps(pphysMass, inertia); | 429 | { |
430 | IndexedVector3 inertia = new IndexedVector3(plocalInertia.X, plocalInertia.Y, plocalInertia.Z); | ||
431 | body.SetMassProps(pphysMass, inertia); | ||
432 | } | ||
423 | } | 433 | } |
424 | 434 | ||
425 | 435 | ||
@@ -432,7 +442,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
432 | 442 | ||
433 | public override void SetFriction(BulletBody pCollisionObject, float _currentFriction) | 443 | public override void SetFriction(BulletBody pCollisionObject, float _currentFriction) |
434 | { | 444 | { |
435 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; | 445 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body; |
436 | collisionObject.SetFriction(_currentFriction); | 446 | collisionObject.SetFriction(_currentFriction); |
437 | } | 447 | } |
438 | 448 | ||
@@ -459,7 +469,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
459 | 469 | ||
460 | public override CollisionFlags RemoveFromCollisionFlags(BulletBody pCollisionObject, CollisionFlags pcollisionFlags) | 470 | public override CollisionFlags RemoveFromCollisionFlags(BulletBody pCollisionObject, CollisionFlags pcollisionFlags) |
461 | { | 471 | { |
462 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; | 472 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body; |
463 | CollisionFlags existingcollisionFlags = (CollisionFlags)(uint)collisionObject.GetCollisionFlags(); | 473 | CollisionFlags existingcollisionFlags = (CollisionFlags)(uint)collisionObject.GetCollisionFlags(); |
464 | existingcollisionFlags &= ~pcollisionFlags; | 474 | existingcollisionFlags &= ~pcollisionFlags; |
465 | collisionObject.SetCollisionFlags((BulletXNA.BulletCollision.CollisionFlags)(uint)existingcollisionFlags); | 475 | collisionObject.SetCollisionFlags((BulletXNA.BulletCollision.CollisionFlags)(uint)existingcollisionFlags); |
@@ -494,8 +504,11 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
494 | public override void SetGravity(BulletBody pBody, Vector3 pGravity) | 504 | public override void SetGravity(BulletBody pBody, Vector3 pGravity) |
495 | { | 505 | { |
496 | RigidBody body = (pBody as BulletBodyXNA).rigidBody; | 506 | RigidBody body = (pBody as BulletBodyXNA).rigidBody; |
497 | IndexedVector3 gravity = new IndexedVector3(pGravity.X, pGravity.Y, pGravity.Z); | 507 | if (body != null) // Can't set collisionobject.set gravity |
498 | body.SetGravity(gravity); | 508 | { |
509 | IndexedVector3 gravity = new IndexedVector3(pGravity.X, pGravity.Y, pGravity.Z); | ||
510 | body.SetGravity(gravity); | ||
511 | } | ||
499 | } | 512 | } |
500 | 513 | ||
501 | public override bool DestroyConstraint(BulletWorld pWorld, BulletConstraint pConstraint) | 514 | public override bool DestroyConstraint(BulletWorld pWorld, BulletConstraint pConstraint) |
@@ -733,7 +746,8 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
733 | public override void UpdateInertiaTensor(BulletBody pBody) | 746 | public override void UpdateInertiaTensor(BulletBody pBody) |
734 | { | 747 | { |
735 | RigidBody body = (pBody as BulletBodyXNA).rigidBody; | 748 | RigidBody body = (pBody as BulletBodyXNA).rigidBody; |
736 | body.UpdateInertiaTensor(); | 749 | if (body != null) // can't update inertia tensor on CollisionObject |
750 | body.UpdateInertiaTensor(); | ||
737 | } | 751 | } |
738 | 752 | ||
739 | public override void RecalculateCompoundShapeLocalAabb(BulletShape pCompoundShape) | 753 | public override void RecalculateCompoundShapeLocalAabb(BulletShape pCompoundShape) |
@@ -770,7 +784,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
770 | 784 | ||
771 | public override CollisionObjectTypes GetBodyType(BulletBody pCollisionObject) | 785 | public override CollisionObjectTypes GetBodyType(BulletBody pCollisionObject) |
772 | { | 786 | { |
773 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; | 787 | CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body; |
774 | return (CollisionObjectTypes)(int) collisionObject.GetInternalType(); | 788 | return (CollisionObjectTypes)(int) collisionObject.GetInternalType(); |
775 | } | 789 | } |
776 | 790 | ||
@@ -889,7 +903,18 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
889 | world.RemoveRigidBody(bo); | 903 | world.RemoveRigidBody(bo); |
890 | } | 904 | } |
891 | } | 905 | } |
892 | 906 | if (co != null) | |
907 | { | ||
908 | if (co.GetUserPointer() != null) | ||
909 | { | ||
910 | uint localId = (uint) co.GetUserPointer(); | ||
911 | if (specialCollisionObjects.ContainsKey(localId)) | ||
912 | { | ||
913 | specialCollisionObjects.Remove(localId); | ||
914 | } | ||
915 | } | ||
916 | } | ||
917 | |||
893 | } | 918 | } |
894 | 919 | ||
895 | public override void Shutdown(BulletWorld pWorld) | 920 | public override void Shutdown(BulletWorld pWorld) |
@@ -1050,7 +1075,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1050 | Vector3 worldExtent = new Vector3(Constants.RegionSize, Constants.RegionSize, Constants.RegionHeight); | 1075 | Vector3 worldExtent = new Vector3(Constants.RegionSize, Constants.RegionSize, Constants.RegionHeight); |
1051 | m_maxCollisions = maxCollisions; | 1076 | m_maxCollisions = maxCollisions; |
1052 | m_maxUpdatesPerFrame = maxUpdates; | 1077 | m_maxUpdatesPerFrame = maxUpdates; |
1053 | 1078 | specialCollisionObjects = new Dictionary<uint, GhostObject>(); | |
1054 | 1079 | ||
1055 | return new BulletWorldXNA(1, PhysicsScene, BSAPIXNA.Initialize2(worldExtent, configparms, maxCollisions, ref collisionArray, maxUpdates, ref updateArray, null)); | 1080 | return new BulletWorldXNA(1, PhysicsScene, BSAPIXNA.Initialize2(worldExtent, configparms, maxCollisions, ref collisionArray, maxUpdates, ref updateArray, null)); |
1056 | } | 1081 | } |
@@ -1310,6 +1335,12 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1310 | CollisionShape shape = (pShape as BulletShapeXNA).shape; | 1335 | CollisionShape shape = (pShape as BulletShapeXNA).shape; |
1311 | gObj.SetCollisionShape(shape); | 1336 | gObj.SetCollisionShape(shape); |
1312 | gObj.SetUserPointer(pLocalID); | 1337 | gObj.SetUserPointer(pLocalID); |
1338 | |||
1339 | if (specialCollisionObjects.ContainsKey(pLocalID)) | ||
1340 | specialCollisionObjects[pLocalID] = gObj; | ||
1341 | else | ||
1342 | specialCollisionObjects.Add(pLocalID, gObj); | ||
1343 | |||
1313 | // TODO: Add to Special CollisionObjects! | 1344 | // TODO: Add to Special CollisionObjects! |
1314 | return new BulletBodyXNA(pLocalID, gObj); | 1345 | return new BulletBodyXNA(pLocalID, gObj); |
1315 | } | 1346 | } |
@@ -1399,7 +1430,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1399 | } | 1430 | } |
1400 | 1431 | ||
1401 | public override BulletShape GetChildShapeFromCompoundShapeIndex(BulletShape cShape, int indx) { | 1432 | public override BulletShape GetChildShapeFromCompoundShapeIndex(BulletShape cShape, int indx) { |
1402 | /* TODO */ | 1433 | |
1403 | if (cShape == null) | 1434 | if (cShape == null) |
1404 | return null; | 1435 | return null; |
1405 | CompoundShape compoundShape = (cShape as BulletShapeXNA).shape as CompoundShape; | 1436 | CompoundShape compoundShape = (cShape as BulletShapeXNA).shape as CompoundShape; |
@@ -1407,7 +1438,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1407 | BulletShape retShape = new BulletShapeXNA(shape, BSShapeTypeFromBroadPhaseNativeType(shape.GetShapeType())); | 1438 | BulletShape retShape = new BulletShapeXNA(shape, BSShapeTypeFromBroadPhaseNativeType(shape.GetShapeType())); |
1408 | 1439 | ||
1409 | 1440 | ||
1410 | return null; | 1441 | return retShape; |
1411 | } | 1442 | } |
1412 | 1443 | ||
1413 | public BSPhysicsShapeType BSShapeTypeFromBroadPhaseNativeType(BroadphaseNativeTypes pin) | 1444 | public BSPhysicsShapeType BSShapeTypeFromBroadPhaseNativeType(BroadphaseNativeTypes pin) |
@@ -1802,26 +1833,29 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1802 | numSimSteps = world.StepSimulation(timeStep, m_maxSubSteps, m_fixedTimeStep); | 1833 | numSimSteps = world.StepSimulation(timeStep, m_maxSubSteps, m_fixedTimeStep); |
1803 | int updates = 0; | 1834 | int updates = 0; |
1804 | 1835 | ||
1805 | 1836 | PersistentManifold contactManifold; | |
1806 | 1837 | CollisionObject objA; | |
1838 | CollisionObject objB; | ||
1839 | ManifoldPoint manifoldPoint; | ||
1840 | PairCachingGhostObject pairCachingGhostObject; | ||
1807 | 1841 | ||
1808 | m_collisionsThisFrame = 0; | 1842 | m_collisionsThisFrame = 0; |
1809 | int numManifolds = world.GetDispatcher().GetNumManifolds(); | 1843 | int numManifolds = world.GetDispatcher().GetNumManifolds(); |
1810 | for (int j = 0; j < numManifolds; j++) | 1844 | for (int j = 0; j < numManifolds; j++) |
1811 | { | 1845 | { |
1812 | PersistentManifold contactManifold = world.GetDispatcher().GetManifoldByIndexInternal(j); | 1846 | contactManifold = world.GetDispatcher().GetManifoldByIndexInternal(j); |
1813 | int numContacts = contactManifold.GetNumContacts(); | 1847 | int numContacts = contactManifold.GetNumContacts(); |
1814 | if (numContacts == 0) | 1848 | if (numContacts == 0) |
1815 | continue; | 1849 | continue; |
1816 | 1850 | ||
1817 | CollisionObject objA = contactManifold.GetBody0() as CollisionObject; | 1851 | objA = contactManifold.GetBody0() as CollisionObject; |
1818 | CollisionObject objB = contactManifold.GetBody1() as CollisionObject; | 1852 | objB = contactManifold.GetBody1() as CollisionObject; |
1819 | 1853 | ||
1820 | ManifoldPoint manifoldPoint = contactManifold.GetContactPoint(0); | 1854 | manifoldPoint = contactManifold.GetContactPoint(0); |
1821 | IndexedVector3 contactPoint = manifoldPoint.GetPositionWorldOnB(); | 1855 | //IndexedVector3 contactPoint = manifoldPoint.GetPositionWorldOnB(); |
1822 | IndexedVector3 contactNormal = -manifoldPoint.m_normalWorldOnB; // make relative to A | 1856 | // IndexedVector3 contactNormal = -manifoldPoint.m_normalWorldOnB; // make relative to A |
1823 | 1857 | ||
1824 | RecordCollision(this, objA, objB, contactPoint, contactNormal,manifoldPoint.GetDistance()); | 1858 | RecordCollision(this, objA, objB, manifoldPoint.GetPositionWorldOnB(), -manifoldPoint.m_normalWorldOnB, manifoldPoint.GetDistance()); |
1825 | m_collisionsThisFrame ++; | 1859 | m_collisionsThisFrame ++; |
1826 | if (m_collisionsThisFrame >= 9999999) | 1860 | if (m_collisionsThisFrame >= 9999999) |
1827 | break; | 1861 | break; |
@@ -1829,12 +1863,19 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1829 | 1863 | ||
1830 | } | 1864 | } |
1831 | 1865 | ||
1832 | updatedEntityCount = LastEntityProperty; | 1866 | foreach (GhostObject ghostObject in specialCollisionObjects.Values) |
1833 | updatedEntities = UpdatedObjects; | 1867 | { |
1834 | 1868 | pairCachingGhostObject = ghostObject as PairCachingGhostObject; | |
1869 | if (pairCachingGhostObject != null) | ||
1870 | { | ||
1871 | RecordGhostCollisions(pairCachingGhostObject); | ||
1872 | } | ||
1835 | 1873 | ||
1874 | } | ||
1836 | 1875 | ||
1837 | 1876 | ||
1877 | updatedEntityCount = LastEntityProperty; | ||
1878 | updatedEntities = UpdatedObjects; | ||
1838 | 1879 | ||
1839 | collidersCount = LastCollisionDesc; | 1880 | collidersCount = LastCollisionDesc; |
1840 | colliders = UpdatedCollisions; | 1881 | colliders = UpdatedCollisions; |
@@ -1860,60 +1901,49 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1860 | } | 1901 | } |
1861 | public void RecordGhostCollisions(PairCachingGhostObject obj) | 1902 | public void RecordGhostCollisions(PairCachingGhostObject obj) |
1862 | { | 1903 | { |
1863 | /* | 1904 | IOverlappingPairCache cache = obj.GetOverlappingPairCache(); |
1864 | *void BulletSim::RecordGhostCollisions(btPairCachingGhostObject* obj) | 1905 | ObjectArray<BroadphasePair> pairs = cache.GetOverlappingPairArray(); |
1865 | { | 1906 | |
1866 | btManifoldArray manifoldArray; | 1907 | DiscreteDynamicsWorld world = (PhysicsScene.World as BulletWorldXNA).world; |
1867 | btBroadphasePairArray& pairArray = obj->getOverlappingPairCache()->getOverlappingPairArray(); | 1908 | PersistentManifoldArray manifoldArray = new PersistentManifoldArray(); |
1868 | int numPairs = pairArray.size(); | 1909 | BroadphasePair collisionPair; |
1869 | 1910 | PersistentManifold contactManifold; | |
1870 | // For all the pairs of sets of contact points | 1911 | |
1871 | for (int i=0; i < numPairs; i++) | 1912 | CollisionObject objA; |
1872 | { | 1913 | CollisionObject objB; |
1873 | if (m_collisionsThisFrame >= m_maxCollisionsPerFrame) | 1914 | |
1874 | break; | 1915 | ManifoldPoint pt; |
1875 | 1916 | ||
1876 | manifoldArray.clear(); | 1917 | int numPairs = pairs.Count; |
1877 | const btBroadphasePair& pair = pairArray[i]; | 1918 | |
1878 | 1919 | for (int i = 0; i < numPairs; i++) | |
1879 | // The real representation is over in the world pair cache | 1920 | { |
1880 | btBroadphasePair* collisionPair = m_worldData.dynamicsWorld->getPairCache()->findPair(pair.m_pProxy0,pair.m_pProxy1); | 1921 | manifoldArray.Clear(); |
1881 | if (!collisionPair) | 1922 | if (LastCollisionDesc < UpdatedCollisions.Length) |
1882 | continue; | 1923 | break; |
1883 | 1924 | collisionPair = world.GetPairCache().FindPair(pairs[i].m_pProxy0, pairs[i].m_pProxy1); | |
1884 | if (collisionPair->m_algorithm) | 1925 | if (collisionPair == null) |
1885 | collisionPair->m_algorithm->getAllContactManifolds(manifoldArray); | 1926 | continue; |
1886 | 1927 | ||
1887 | // The collision pair has sets of collision points (manifolds) | 1928 | collisionPair.m_algorithm.GetAllContactManifolds(manifoldArray); |
1888 | for (int j=0; j < manifoldArray.size(); j++) | 1929 | for (int j = 0; j < manifoldArray.Count; j++) |
1889 | { | 1930 | { |
1890 | btPersistentManifold* contactManifold = manifoldArray[j]; | 1931 | contactManifold = manifoldArray[j]; |
1891 | int numContacts = contactManifold->getNumContacts(); | 1932 | int numContacts = contactManifold.GetNumContacts(); |
1892 | 1933 | objA = contactManifold.GetBody0() as CollisionObject; | |
1893 | const btCollisionObject* objA = static_cast<const btCollisionObject*>(contactManifold->getBody0()); | 1934 | objB = contactManifold.GetBody1() as CollisionObject; |
1894 | const btCollisionObject* objB = static_cast<const btCollisionObject*>(contactManifold->getBody1()); | 1935 | for (int p = 0; p < numContacts; p++) |
1895 | 1936 | { | |
1896 | // TODO: this is a more thurough check than the regular collision code -- | 1937 | pt = contactManifold.GetContactPoint(p); |
1897 | // here we find the penetrating contact in the manifold but for regular | 1938 | if (pt.GetDistance() < 0.0f) |
1898 | // collisions we assume the first point in the manifold is good enough. | 1939 | { |
1899 | // Decide of this extra checking is required or if first point is good enough. | 1940 | RecordCollision(this, objA, objB, pt.GetPositionWorldOnA(), -pt.m_normalWorldOnB,pt.GetDistance()); |
1900 | for (int p=0; p < numContacts; p++) | 1941 | break; |
1901 | { | 1942 | } |
1902 | const btManifoldPoint& pt = contactManifold->getContactPoint(p); | 1943 | } |
1903 | // If a penetrating contact, this is a hit | 1944 | } |
1904 | if (pt.getDistance()<0.f) | 1945 | } |
1905 | { | 1946 | |
1906 | const btVector3& contactPoint = pt.getPositionWorldOnA(); | ||
1907 | const btVector3& normalOnA = -pt.m_normalWorldOnB; | ||
1908 | RecordCollision(objA, objB, contactPoint, normalOnA, pt.getDistance()); | ||
1909 | // Only one contact point for each set of colliding objects | ||
1910 | break; | ||
1911 | } | ||
1912 | } | ||
1913 | } | ||
1914 | } | ||
1915 | } | ||
1916 | */ | ||
1917 | } | 1947 | } |
1918 | private static void RecordCollision(BSAPIXNA world, CollisionObject objA, CollisionObject objB, IndexedVector3 contact, IndexedVector3 norm, float penetration) | 1948 | private static void RecordCollision(BSAPIXNA world, CollisionObject objA, CollisionObject objB, IndexedVector3 contact, IndexedVector3 norm, float penetration) |
1919 | { | 1949 | { |
@@ -1934,7 +1964,7 @@ private sealed class BulletConstraintXNA : BulletConstraint | |||
1934 | contactNormal = -contactNormal; | 1964 | contactNormal = -contactNormal; |
1935 | } | 1965 | } |
1936 | 1966 | ||
1937 | ulong collisionID = ((ulong) idA << 32) | idB; | 1967 | //ulong collisionID = ((ulong) idA << 32) | idB; |
1938 | 1968 | ||
1939 | CollisionDesc cDesc = new CollisionDesc() | 1969 | CollisionDesc cDesc = new CollisionDesc() |
1940 | { | 1970 | { |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs index f1ef449..7ad7c89 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | |||
@@ -158,6 +158,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
158 | get { return (Type != Vehicle.TYPE_NONE && Prim.IsPhysicallyActive); } | 158 | get { return (Type != Vehicle.TYPE_NONE && Prim.IsPhysicallyActive); } |
159 | } | 159 | } |
160 | 160 | ||
161 | // Return 'true' if this a vehicle that should be sitting on the ground | ||
162 | public bool IsGroundVehicle | ||
163 | { | ||
164 | get { return (Type == Vehicle.TYPE_CAR || Type == Vehicle.TYPE_SLED); } | ||
165 | } | ||
166 | |||
161 | #region Vehicle parameter setting | 167 | #region Vehicle parameter setting |
162 | internal void ProcessFloatVehicleParam(Vehicle pParam, float pValue) | 168 | internal void ProcessFloatVehicleParam(Vehicle pParam, float pValue) |
163 | { | 169 | { |
@@ -1176,6 +1182,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
1176 | private void ApplyGravity(float pTimeStep) | 1182 | private void ApplyGravity(float pTimeStep) |
1177 | { | 1183 | { |
1178 | Vector3 appliedGravity = m_VehicleGravity * m_vehicleMass; | 1184 | Vector3 appliedGravity = m_VehicleGravity * m_vehicleMass; |
1185 | |||
1186 | // Hack to reduce downward force if the vehicle is probably sitting on the ground | ||
1187 | if (Prim.IsColliding && IsGroundVehicle) | ||
1188 | appliedGravity *= 0.2f; | ||
1189 | |||
1179 | VehicleAddForce(appliedGravity); | 1190 | VehicleAddForce(appliedGravity); |
1180 | 1191 | ||
1181 | VDetailLog("{0}, MoveLinear,applyGravity,vehGrav={1},appliedForce-{2}", | 1192 | VDetailLog("{0}, MoveLinear,applyGravity,vehGrav={1},appliedForce-{2}", |