Files
DoomRTX/neo/prey/Prey/physics_delta.cpp
2026-05-05 15:01:01 -07:00

156 lines
3.3 KiB
C++

#include "precompiled.h"
#pragma hdrstop
#include "prey_local.h"
CLASS_DECLARATION( idPhysics_Actor, hhPhysics_Delta )
END_CLASS
//============
// hhPhysics_Delta::hhPhysics_Delta
//============
hhPhysics_Delta::hhPhysics_Delta() {
delta.Zero();
} //. hhPhysics_Delta::hhPhysics_Delta()
//============
// hhPhysics_Delta::Evaluate
//============
bool hhPhysics_Delta::Evaluate( int timeStepMSec, int endTimeMSec ) {
trace_t trace;
idVec3 dest;
idRotation rotation;
float timeStep;
idVec3 velocity;
timeStep = MS2SEC( timeStepMSec );
velocity = delta / timeStep;
if ( delta == vec3_zero ) {
Rest();
return( false );
}
clipModel->Unlink(); // Taken from monster
dest = GetOrigin() + delta;
rotation.SetOrigin( GetOrigin() );
rotation.SetAngle( 0 );
//? Maybe model after the idPhysics_Monster::Slide move, where we
// slide along scholng
// If there was a collision, adjust the dest
if ( gameLocal.clip.Motion( trace, GetOrigin(), dest, rotation, clipModel,
GetAxis(), clipMask, self ) ) {
if ( self->AllowCollision( trace ) ) {
//gameLocal.Printf( "Hit something %.2f\n", trace.fraction );
dest = trace.endpos;
//? Move this elsewhere?
self->Collide( trace, velocity );
} //. We run into what we hit = )
//? Maybe we apply an impulse?
} //. We hit something
//gameLocal.Printf( "Moving from %s to %s (%s)\n", GetOrigin().ToString(),
// dest.ToString(), delta.ToString() );
//! What about origin and axis?
clipModel->Link( gameLocal.clip, self, 0, dest, GetAxis() ); // Taken from monster
// We are done with delta, so zero it out
delta.Zero();
return( true );
} //. hhPhysics_Delta::Evaluate( int, int );
//============
// hhPhysics_Delta::SetDelta
//============
void hhPhysics_Delta::SetDelta( const idVec3 &d ){
delta = d;
if ( delta != vec3_origin ) {
Activate();
}
} //. hhPhysics_Delta::SetDelta( const idVec3 & )
//============
// hhPhysics_Delta::Activate
//============
void hhPhysics_Delta::Activate(){
self->BecomeActive( TH_PHYSICS );
} //. hhPhysics_Delta::Activate( const idVec3 & )
//============
// hhPhysics_Delta::Rest
//============
void hhPhysics_Delta::Rest(){
self->BecomeInactive( TH_PHYSICS );
} //. hhPhysics_Delta::Rest( const idVec3 & )
//================
//hhPhysics_Delta::SetAxis
//================
void hhPhysics_Delta::SetAxis( const idMat3 &newAxis, int id ) {
// Ripped from idPhysics_Monster
clipModel->Link( gameLocal.clip, self, 0, clipModel->GetOrigin(), newAxis );
//? Activate();
}
//================
//hhPhysics_Delta::SetOrigin
//================
void hhPhysics_Delta::SetOrigin( const idVec3 &newOrigin, int id ) {
// Ripped from idPhysics_Monster
/*
idVec3 masterOrigin;
idMat3 masterAxis;
current.localOrigin = newOrigin;
if ( masterEntity ) {
self->GetMasterPosition( masterOrigin, masterAxis );
current.origin = masterOrigin + newOrigin * masterAxis;
}
else {
current.origin = newOrigin;
}
*/
clipModel->Link( gameLocal.clip, self, 0, newOrigin, clipModel->GetAxis() );
//? Activate();
}
//================
//hhPhysics_Delta::Save
//================
void hhPhysics_Delta::Save( idSaveGame *savefile ) const {
savefile->WriteVec3( delta );
}
//================
//hhPhysics_Delta::Restore
//================
void hhPhysics_Delta::Restore( idRestoreGame *savefile ) {
savefile->ReadVec3( delta );
}