示例#1
0
/*
================
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;
}
示例#2
0
/*
================
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 );
}