diff options
author | Erwin Coumans <blender@erwincoumans.com> | 2006-11-13 00:05:10 +0300 |
---|---|---|
committer | Erwin Coumans <blender@erwincoumans.com> | 2006-11-13 00:05:10 +0300 |
commit | 3a1b7ece402001f2f93669a7b36c32f5e7827bab (patch) | |
tree | a91e600407b0709922b7df3fa2a53f380cf7eb76 /extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp | |
parent | 22d97b2e346e3cb3fc38704a0460e2dd4d9a0abb (diff) |
updating Bullet 2.x with latest changes. The integration + C-API will follow at some stage.
Diffstat (limited to 'extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp')
-rw-r--r-- | extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp | 125 |
1 files changed, 67 insertions, 58 deletions
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp index ac06f718c9e..568bcc40939 100644 --- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp +++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp @@ -32,6 +32,27 @@ int totalCpd = 0; int gTotalContactPoints = 0; +struct btOrderIndex +{ + short int m_manifoldIndex; + short int m_pointIndex; +}; + +#define SEQUENTIAL_IMPULSE_MAX_SOLVER_POINTS 16384 +static btOrderIndex gOrder[SEQUENTIAL_IMPULSE_MAX_SOLVER_POINTS]; +static unsigned long btSeed2 = 0; +unsigned long btRand2() +{ + btSeed2 = (1664525L*btSeed2 + 1013904223L) & 0xffffffff; + return btSeed2; +} + +int btRandInt2 (int n) +{ + float a = float(n) / 4294967296.0f; + return (int) (float(btRand2()) * a); +} + bool MyContactDestroyedCallback(void* userPersistentData) { assert (userPersistentData); @@ -69,52 +90,62 @@ float btSequentialImpulseConstraintSolver::solveGroup(btPersistentManifold** man btProfiler::beginBlock("solve"); #endif //USE_PROFILE + int totalPoints = 0; + { int j; for (j=0;j<numManifolds;j++) { - int k=j; - prepareConstraints(manifoldPtr[k],info,debugDrawer); - solve(manifoldPtr[k],info,0,debugDrawer); + prepareConstraints(manifoldPtr[j],info,debugDrawer); } } - - - //should traverse the contacts random order... - int i; - for ( i = 0;i<numiter-1;i++) + { int j; for (j=0;j<numManifolds;j++) { - int k=j; - if (i&1) - k=numManifolds-j-1; - - solve(manifoldPtr[k],info,i,debugDrawer); + for (int p=0;p<manifoldPtr[j]->getNumContacts();p++) + { + gOrder[totalPoints].m_manifoldIndex = j; + gOrder[totalPoints].m_pointIndex = p; + totalPoints++; + } } - } -#ifdef USE_PROFILE - btProfiler::endBlock("solve"); - - btProfiler::beginBlock("solveFriction"); -#endif //USE_PROFILE - - //now solve the friction - for (i = 0;i<numiter-1;i++) + + + //should traverse the contacts random order... + int iteration; + for ( iteration = 0;iteration<numiter-1;iteration++) { int j; - for (j=0;j<numManifolds;j++) + if ((iteration & 7) == 0) { + for (j=0; j<totalPoints; ++j) { + btOrderIndex tmp = gOrder[j]; + int swapi = btRandInt2(j+1); + gOrder[j] = gOrder[swapi]; + gOrder[swapi] = tmp; + } + } + + for (j=0;j<totalPoints;j++) { - int k = j; - if (i&1) - k=numManifolds-j-1; - solveFriction(manifoldPtr[k],info,i,debugDrawer); + btPersistentManifold* manifold = manifoldPtr[gOrder[j].m_manifoldIndex]; + solve( (btRigidBody*)manifold->getBody0(), + (btRigidBody*)manifold->getBody1() + ,manifold->getContactPoint(gOrder[j].m_pointIndex),info,iteration,debugDrawer); + } + + for (j=0;j<totalPoints;j++) + { + btPersistentManifold* manifold = manifoldPtr[gOrder[j].m_manifoldIndex]; + solveFriction((btRigidBody*)manifold->getBody0(), + (btRigidBody*)manifold->getBody1(),manifold->getContactPoint(gOrder[j].m_pointIndex),info,iteration,debugDrawer); } } + #ifdef USE_PROFILE - btProfiler::endBlock("solveFriction"); + btProfiler::endBlock("solve"); #endif //USE_PROFILE return 0.f; @@ -225,7 +256,7 @@ void btSequentialImpulseConstraintSolver::prepareConstraints(btPersistentManifol btScalar penVel = -cpd->m_penetration/info.m_timeStep; - if (cpd->m_restitution >= penVel) + if (cpd->m_restitution > penVel) { cpd->m_penetration = 0.f; } @@ -233,7 +264,7 @@ void btSequentialImpulseConstraintSolver::prepareConstraints(btPersistentManifol float relaxation = info.m_damping; - cpd->m_appliedImpulse *= relaxation; + cpd->m_appliedImpulse =0.f;//*= relaxation; //for friction cpd->m_prevAppliedImpulse = cpd->m_appliedImpulse; @@ -260,8 +291,8 @@ void btSequentialImpulseConstraintSolver::prepareConstraints(btPersistentManifol btVector3 totalImpulse = #ifndef NO_FRICTION_WARMSTART - cp.m_frictionWorldTangential0*cp.m_accumulatedTangentImpulse0+ - cp.m_frictionWorldTangential1*cp.m_accumulatedTangentImpulse1+ + cpd->m_frictionWorldTangential0*cpd->m_accumulatedTangentImpulse0+ + cpd->m_frictionWorldTangential1*cpd->m_accumulatedTangentImpulse1+ #endif //NO_FRICTION_WARMSTART cp.m_normalWorldOnB*cpd->m_appliedImpulse; @@ -304,29 +335,16 @@ void btSequentialImpulseConstraintSolver::prepareConstraints(btPersistentManifol } } -float btSequentialImpulseConstraintSolver::solve(btPersistentManifold* manifoldPtr, const btContactSolverInfo& info,int iter,btIDebugDraw* debugDrawer) +float btSequentialImpulseConstraintSolver::solve(btRigidBody* body0,btRigidBody* body1, btManifoldPoint& cp, const btContactSolverInfo& info,int iter,btIDebugDraw* debugDrawer) { - btRigidBody* body0 = (btRigidBody*)manifoldPtr->getBody0(); - btRigidBody* body1 = (btRigidBody*)manifoldPtr->getBody1(); - float maxImpulse = 0.f; { - const int numpoints = manifoldPtr->getNumContacts(); btVector3 color(0,1,0); - for (int i=0;i<numpoints ;i++) { - - int j=i; - if (iter % 2) - j = numpoints-1-i; - else - j=i; - - btManifoldPoint& cp = manifoldPtr->getContactPoint(j); - if (cp.getDistance() <= 0.f) + if (cp.getDistance() <= 0.f) { if (iter == 0) @@ -353,24 +371,15 @@ float btSequentialImpulseConstraintSolver::solve(btPersistentManifold* manifoldP return maxImpulse; } -float btSequentialImpulseConstraintSolver::solveFriction(btPersistentManifold* manifoldPtr, const btContactSolverInfo& info,int iter,btIDebugDraw* debugDrawer) +float btSequentialImpulseConstraintSolver::solveFriction(btRigidBody* body0,btRigidBody* body1, btManifoldPoint& cp, const btContactSolverInfo& info,int iter,btIDebugDraw* debugDrawer) { - btRigidBody* body0 = (btRigidBody*)manifoldPtr->getBody0(); - btRigidBody* body1 = (btRigidBody*)manifoldPtr->getBody1(); { - const int numpoints = manifoldPtr->getNumContacts(); btVector3 color(0,1,0); - for (int i=0;i<numpoints ;i++) { - - int j=i; - //if (iter % 2) - // j = numpoints-1-i; - - btManifoldPoint& cp = manifoldPtr->getContactPoint(j); + if (cp.getDistance() <= 0.f) { |