summaryrefslogtreecommitdiff
path: root/thirdparty/bullet/Bullet3Dynamics/shared/b3IntegrateTransforms.h
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/bullet/Bullet3Dynamics/shared/b3IntegrateTransforms.h')
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/shared/b3IntegrateTransforms.h113
1 files changed, 113 insertions, 0 deletions
diff --git a/thirdparty/bullet/Bullet3Dynamics/shared/b3IntegrateTransforms.h b/thirdparty/bullet/Bullet3Dynamics/shared/b3IntegrateTransforms.h
new file mode 100644
index 0000000000..e96f90d3f3
--- /dev/null
+++ b/thirdparty/bullet/Bullet3Dynamics/shared/b3IntegrateTransforms.h
@@ -0,0 +1,113 @@
+
+
+#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h"
+
+
+
+inline void integrateSingleTransform( __global b3RigidBodyData_t* bodies,int nodeID, float timeStep, float angularDamping, b3Float4ConstArg gravityAcceleration)
+{
+
+ if (bodies[nodeID].m_invMass != 0.f)
+ {
+ float BT_GPU_ANGULAR_MOTION_THRESHOLD = (0.25f * 3.14159254f);
+
+ //angular velocity
+ {
+ b3Float4 axis;
+ //add some hardcoded angular damping
+ bodies[nodeID].m_angVel.x *= angularDamping;
+ bodies[nodeID].m_angVel.y *= angularDamping;
+ bodies[nodeID].m_angVel.z *= angularDamping;
+
+ b3Float4 angvel = bodies[nodeID].m_angVel;
+
+ float fAngle = b3Sqrt(b3Dot3F4(angvel, angvel));
+
+ //limit the angular motion
+ if(fAngle*timeStep > BT_GPU_ANGULAR_MOTION_THRESHOLD)
+ {
+ fAngle = BT_GPU_ANGULAR_MOTION_THRESHOLD / timeStep;
+ }
+ if(fAngle < 0.001f)
+ {
+ // use Taylor's expansions of sync function
+ axis = angvel * (0.5f*timeStep-(timeStep*timeStep*timeStep)*0.020833333333f * fAngle * fAngle);
+ }
+ else
+ {
+ // sync(fAngle) = sin(c*fAngle)/t
+ axis = angvel * ( b3Sin(0.5f * fAngle * timeStep) / fAngle);
+ }
+
+ b3Quat dorn;
+ dorn.x = axis.x;
+ dorn.y = axis.y;
+ dorn.z = axis.z;
+ dorn.w = b3Cos(fAngle * timeStep * 0.5f);
+ b3Quat orn0 = bodies[nodeID].m_quat;
+ b3Quat predictedOrn = b3QuatMul(dorn, orn0);
+ predictedOrn = b3QuatNormalized(predictedOrn);
+ bodies[nodeID].m_quat=predictedOrn;
+ }
+ //linear velocity
+ bodies[nodeID].m_pos += bodies[nodeID].m_linVel * timeStep;
+
+ //apply gravity
+ bodies[nodeID].m_linVel += gravityAcceleration * timeStep;
+
+ }
+
+}
+
+inline void b3IntegrateTransform( __global b3RigidBodyData_t* body, float timeStep, float angularDamping, b3Float4ConstArg gravityAcceleration)
+{
+ float BT_GPU_ANGULAR_MOTION_THRESHOLD = (0.25f * 3.14159254f);
+
+ if( (body->m_invMass != 0.f))
+ {
+ //angular velocity
+ {
+ b3Float4 axis;
+ //add some hardcoded angular damping
+ body->m_angVel.x *= angularDamping;
+ body->m_angVel.y *= angularDamping;
+ body->m_angVel.z *= angularDamping;
+
+ b3Float4 angvel = body->m_angVel;
+ float fAngle = b3Sqrt(b3Dot3F4(angvel, angvel));
+ //limit the angular motion
+ if(fAngle*timeStep > BT_GPU_ANGULAR_MOTION_THRESHOLD)
+ {
+ fAngle = BT_GPU_ANGULAR_MOTION_THRESHOLD / timeStep;
+ }
+ if(fAngle < 0.001f)
+ {
+ // use Taylor's expansions of sync function
+ axis = angvel * (0.5f*timeStep-(timeStep*timeStep*timeStep)*0.020833333333f * fAngle * fAngle);
+ }
+ else
+ {
+ // sync(fAngle) = sin(c*fAngle)/t
+ axis = angvel * ( b3Sin(0.5f * fAngle * timeStep) / fAngle);
+ }
+ b3Quat dorn;
+ dorn.x = axis.x;
+ dorn.y = axis.y;
+ dorn.z = axis.z;
+ dorn.w = b3Cos(fAngle * timeStep * 0.5f);
+ b3Quat orn0 = body->m_quat;
+
+ b3Quat predictedOrn = b3QuatMul(dorn, orn0);
+ predictedOrn = b3QuatNormalized(predictedOrn);
+ body->m_quat=predictedOrn;
+ }
+
+ //apply gravity
+ body->m_linVel += gravityAcceleration * timeStep;
+
+ //linear velocity
+ body->m_pos += body->m_linVel * timeStep;
+
+ }
+
+}