Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErwin Coumans <blender@erwincoumans.com>2006-11-13 00:05:10 +0300
committerErwin Coumans <blender@erwincoumans.com>2006-11-13 00:05:10 +0300
commit3a1b7ece402001f2f93669a7b36c32f5e7827bab (patch)
treea91e600407b0709922b7df3fa2a53f380cf7eb76 /extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp
parent22d97b2e346e3cb3fc38704a0460e2dd4d9a0abb (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.cpp125
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)
{