/* ================ sdPhysics_GeneralMover::Evaluate ================ */ bool sdPhysics_GeneralMover::Evaluate( int timeStepMSec, int endTimeMSec ) { if ( IsAtRest() ) { return false; } float oldPos = currentFraction; float diff = MS2SEC( timeStepMSec ) * rate; float newPos = currentFraction + diff; if ( newPos > 1.f ) { newPos = 1.f; } float distance = newPos - oldPos; self->OnMoveStarted(); idVec3 startPos = Lerp( move.startPos, move.endPos, oldPos ); idVec3 endPos = Lerp( move.startPos, move.endPos, newPos ); idMat3 startAxis = Lerp( move.startAngles, move.endAngles, oldPos ).ToMat3(); idMat3 endAxis = Lerp( move.startAngles, move.endAngles, newPos ).ToMat3(); bool collision = false; trace_t pushResults; gameLocal.push.ClipPush( pushResults, self, 0, startPos, startAxis, endPos, endAxis, GetClipModel( 0 ) ); if ( pushResults.fraction < 1.0f ) { collision = true; } self->OnMoveFinished(); if ( collision ) { self->OnTeamBlocked( self, gameLocal.entities[ pushResults.c.entityNum ] ); } else { SetCurrentPos( newPos ); } return currentFraction != oldPos; }
/* ================ sdPhysics_Linear::Evaluate ================ */ bool sdPhysics_Linear::Evaluate( int timeStepMSec, int endTimeMSec ) { current.origin.FixDenormals(); idVec3 oldLocalOrigin, oldOrigin, masterOrigin; idMat3 oldAxis, masterAxis; isBlocked = false; oldLocalOrigin = current.localOrigin; oldOrigin = current.origin; oldAxis = axis; current.localOrigin = current.linearExtrapolation.GetCurrentValue( endTimeMSec ); current.origin = current.localOrigin; if ( hasMaster ) { self->GetMasterPosition( masterOrigin, masterAxis ); if ( masterAxis.IsRotated() ) { current.origin = current.origin * masterAxis + masterOrigin; if ( isOrientated ) { axis *= masterAxis; } } else { current.origin += masterOrigin; } } if ( isPusher && ( oldOrigin != current.origin ) ) { gameLocal.push.ClipPush( pushResults, self, pushFlags, oldOrigin, oldAxis, current.origin, axis, GetClipModel() ); if ( pushResults.fraction < 1.0f ) { clipModel->Link( gameLocal.clip, self, 0, oldOrigin, oldAxis ); current.localOrigin = oldLocalOrigin; current.origin = oldOrigin; axis = oldAxis; isBlocked = true; return false; } } if ( clipModel ) { clipModel->Link( gameLocal.clip, self, 0, current.origin, axis ); } current.time = endTimeMSec; if ( TestIfAtRest() ) { Rest(); } return ( current.origin != oldOrigin ); }