void dgWorld::StepDynamics (dgFloat32 timestep) { //SerializeToFile ("xxx.bin"); dgAssert (m_inUpdate == 0); dgAssert (GetThreadCount() >= 1); m_inUpdate ++; DG_TRACKTIME(__FUNCTION__); UpdateSkeletons(); UpdateBroadphase(timestep); UpdateDynamics (timestep); if (m_listeners.GetCount()) { for (dgListenerList::dgListNode* node = m_listeners.GetFirst(); node; node = node->GetNext()) { dgListener& listener = node->GetInfo(); if (listener.m_onPostUpdate) { listener.m_onPostUpdate(this, listener.m_userData, timestep); } } } m_inUpdate --; }
void dgSolver::CalculateForces() { DG_TRACKTIME(); m_firstPassCoef = dgFloat32(0.0f); const dgInt32 passes = m_solverPasses; const dgInt32 threadCounts = m_world->GetThreadCount(); InitSkeletons(); for (dgInt32 step = 0; step < 4; step++) { CalculateJointsAcceleration(); dgFloat32 accNorm = DG_SOLVER_MAX_ERROR * dgFloat32(2.0f); for (dgInt32 k = 0; (k < passes) && (accNorm > DG_SOLVER_MAX_ERROR); k++) { CalculateJointsForce(); accNorm = dgFloat32(0.0f); for (dgInt32 i = 0; i < threadCounts; i++) { accNorm = dgMax(accNorm, m_accelNorm[i]); } } UpdateSkeletons(); IntegrateBodiesVelocity(); } UpdateForceFeedback(); dgInt32 hasJointFeeback = 0; for (dgInt32 i = 0; i < DG_MAX_THREADS_HIVE_COUNT; i++) { hasJointFeeback |= m_hasJointFeeback[i]; } CalculateBodiesAcceleration(); if (hasJointFeeback) { UpdateKinematicFeedback(); } }