unsigned cPhysicsJointHingeNewton::LimitCallback(const NewtonJoint* pHinge, NewtonHingeSliderUpdateDesc* pDesc) { cPhysicsJointHingeNewton* pHingeJoint = (cPhysicsJointHingeNewton*)NewtonJointGetUserData(pHinge); //pHingeJoint->OnPhysicsUpdate(); if(pHingeJoint->mfMaxAngle == 0 && pHingeJoint->mfMinAngle == 0) return 0; float fAngle = NewtonHingeGetJointAngle (pHinge); //Avoid oscillation CheckLimitAutoSleep(pHingeJoint, pHingeJoint->mfMinAngle,pHingeJoint->mfMaxAngle,fAngle); bool bSkipLimitCheck = false; if(fabs(pHingeJoint->mfPreviousAngle - fAngle) > cMath::ToRad(300)) bSkipLimitCheck = true; //Max limit if (fAngle > pHingeJoint->mfMaxAngle && bSkipLimitCheck==false) { pHingeJoint->OnMaxLimit(); pDesc->m_accel = NewtonHingeCalculateStopAlpha (pHinge, pDesc, pHingeJoint->mfMaxAngle); pDesc->m_maxFriction =0; pHingeJoint->mfPreviousAngle = fAngle; return 1; } //Min limit else if (fAngle < pHingeJoint->mfMinAngle && bSkipLimitCheck==false) { pHingeJoint->OnMinLimit(); pDesc->m_accel = NewtonHingeCalculateStopAlpha (pHinge, pDesc, pHingeJoint->mfMinAngle); pDesc->m_minFriction =0; pHingeJoint->mfPreviousAngle = fAngle; return 1; } else { if(pHingeJoint->mpParentBody ==NULL || pHingeJoint->mpParentBody->GetMass()==0) { if( (pHingeJoint->mfStickyMaxDistance != 0 && fabs(fAngle - pHingeJoint->mfMaxAngle) < pHingeJoint->mfStickyMaxDistance) || (pHingeJoint->mfStickyMinDistance != 0 && fabs(fAngle - pHingeJoint->mfMinAngle) < pHingeJoint->mfStickyMinDistance) ) { pHingeJoint->mpChildBody->SetAngularVelocity(0); pHingeJoint->mpChildBody->SetLinearVelocity(0); } } pHingeJoint->OnNoLimit(); } pHingeJoint->mfPreviousAngle = fAngle; return 0; }
unsigned cPhysicsJointScrewNewton::LimitCallback(const NewtonJoint* pScrew, NewtonHingeSliderUpdateDesc* pDesc) { cPhysicsJointScrewNewton* pScrewJoint = (cPhysicsJointScrewNewton*)NewtonJointGetUserData(pScrew); //pScrewJoint->OnPhysicsUpdate(); float fDistance = NewtonCorkscrewGetJointPosit (pScrew); //Log("Dist: %f\n",fDistance); if(pScrewJoint->mfMinDistance == 0 && pScrewJoint->mfMaxDistance == 0) return 0; //Avoid oscillation CheckLimitAutoSleep(pScrewJoint, pScrewJoint->mfMinDistance,pScrewJoint->mfMaxDistance,fDistance); if (fDistance < pScrewJoint->mfMinDistance) { pScrewJoint->OnMinLimit(); pDesc->m_accel = NewtonCorkscrewCalculateStopAccel (pScrew, pDesc, pScrewJoint->mfMinDistance); pDesc->m_minFriction =0; return 1; } else if (fDistance > pScrewJoint->mfMaxDistance) { pScrewJoint->OnMaxLimit(); pDesc->m_accel = NewtonCorkscrewCalculateStopAccel (pScrew, pDesc, pScrewJoint->mfMaxDistance); pDesc->m_maxFriction =0; return 1; } else { if(pScrewJoint->mpParentBody ==NULL || pScrewJoint->mpParentBody->GetMass()==0) { if( (pScrewJoint->mfStickyMaxDistance != 0 && fabs(fDistance - pScrewJoint->mfMaxDistance) < pScrewJoint->mfStickyMaxDistance) || (pScrewJoint->mfStickyMinDistance != 0 && fabs(fDistance - pScrewJoint->mfMinDistance) < pScrewJoint->mfStickyMinDistance) ) { pScrewJoint->mpChildBody->SetAngularVelocity(0); pScrewJoint->mpChildBody->SetLinearVelocity(0); } } pScrewJoint->OnNoLimit(); } return 0; }