3 #include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h"
5 inline void integrateSingleTransform(__global b3RigidBodyData_t* bodies, int nodeID, float timeStep, float angularDamping, b3Float4ConstArg gravityAcceleration)
7 if (bodies[nodeID].m_invMass != 0.f)
9 float BT_GPU_ANGULAR_MOTION_THRESHOLD = (0.25f * 3.14159254f);
14 //add some hardcoded angular damping
15 bodies[nodeID].m_angVel.x *= angularDamping;
16 bodies[nodeID].m_angVel.y *= angularDamping;
17 bodies[nodeID].m_angVel.z *= angularDamping;
19 b3Float4 angvel = bodies[nodeID].m_angVel;
21 float fAngle = b3Sqrt(b3Dot3F4(angvel, angvel));
23 //limit the angular motion
24 if (fAngle * timeStep > BT_GPU_ANGULAR_MOTION_THRESHOLD)
26 fAngle = BT_GPU_ANGULAR_MOTION_THRESHOLD / timeStep;
30 // use Taylor's expansions of sync function
31 axis = angvel * (0.5f * timeStep - (timeStep * timeStep * timeStep) * 0.020833333333f * fAngle * fAngle);
35 // sync(fAngle) = sin(c*fAngle)/t
36 axis = angvel * (b3Sin(0.5f * fAngle * timeStep) / fAngle);
43 dorn.w = b3Cos(fAngle * timeStep * 0.5f);
44 b3Quat orn0 = bodies[nodeID].m_quat;
45 b3Quat predictedOrn = b3QuatMul(dorn, orn0);
46 predictedOrn = b3QuatNormalized(predictedOrn);
47 bodies[nodeID].m_quat = predictedOrn;
50 bodies[nodeID].m_pos += bodies[nodeID].m_linVel * timeStep;
53 bodies[nodeID].m_linVel += gravityAcceleration * timeStep;
57 inline void b3IntegrateTransform(__global b3RigidBodyData_t* body, float timeStep, float angularDamping, b3Float4ConstArg gravityAcceleration)
59 float BT_GPU_ANGULAR_MOTION_THRESHOLD = (0.25f * 3.14159254f);
61 if ((body->m_invMass != 0.f))
66 //add some hardcoded angular damping
67 body->m_angVel.x *= angularDamping;
68 body->m_angVel.y *= angularDamping;
69 body->m_angVel.z *= angularDamping;
71 b3Float4 angvel = body->m_angVel;
72 float fAngle = b3Sqrt(b3Dot3F4(angvel, angvel));
73 //limit the angular motion
74 if (fAngle * timeStep > BT_GPU_ANGULAR_MOTION_THRESHOLD)
76 fAngle = BT_GPU_ANGULAR_MOTION_THRESHOLD / timeStep;
80 // use Taylor's expansions of sync function
81 axis = angvel * (0.5f * timeStep - (timeStep * timeStep * timeStep) * 0.020833333333f * fAngle * fAngle);
85 // sync(fAngle) = sin(c*fAngle)/t
86 axis = angvel * (b3Sin(0.5f * fAngle * timeStep) / fAngle);
92 dorn.w = b3Cos(fAngle * timeStep * 0.5f);
93 b3Quat orn0 = body->m_quat;
95 b3Quat predictedOrn = b3QuatMul(dorn, orn0);
96 predictedOrn = b3QuatNormalized(predictedOrn);
97 body->m_quat = predictedOrn;
101 body->m_linVel += gravityAcceleration * timeStep;
104 body->m_pos += body->m_linVel * timeStep;