mirror of
https://github.com/jmarshall23/DoomRTX.git
synced 2026-08-12 08:11:10 +02:00
343 lines
8.0 KiB
C++
343 lines
8.0 KiB
C++
#include "precompiled.h"
|
|
#pragma hdrstop
|
|
|
|
#include "prey_local.h"
|
|
|
|
|
|
CLASS_DECLARATION( idClass, hhFxInfo )
|
|
END_CLASS
|
|
|
|
|
|
hhFxInfo::hhFxInfo() {
|
|
Reset();
|
|
}
|
|
|
|
hhFxInfo::hhFxInfo( const hhFxInfo* fxInfo ) {
|
|
Assign( fxInfo );
|
|
}
|
|
|
|
hhFxInfo::hhFxInfo( const hhFxInfo& fxInfo ) {
|
|
Assign( &fxInfo );
|
|
}
|
|
|
|
void hhFxInfo::Save(idSaveGame *savefile) const {
|
|
fxInfoFlags_s infoFlags = flags;
|
|
LittleBitField( &infoFlags, sizeof( infoFlags ) );
|
|
savefile->Write( &infoFlags, sizeof( infoFlags ) );
|
|
|
|
savefile->WriteVec3( normal );
|
|
savefile->WriteVec3( incomingVector );
|
|
savefile->WriteVec3( bounceVector );
|
|
savefile->WriteString( bindBone );
|
|
entity.Save(savefile);
|
|
}
|
|
|
|
void hhFxInfo::Restore( idRestoreGame *savefile ) {
|
|
savefile->Read( &flags, sizeof( flags ) );
|
|
LittleBitField( &flags, sizeof( flags ) );
|
|
|
|
savefile->ReadVec3( normal );
|
|
savefile->ReadVec3( incomingVector );
|
|
savefile->ReadVec3( bounceVector );
|
|
savefile->ReadString( bindBone );
|
|
entity.Restore(savefile);
|
|
}
|
|
|
|
void hhFxInfo::WriteToSnapshot( idBitMsgDelta &msg ) const {
|
|
/*
|
|
msg.WriteBits(flags.normalIsSet, 1);
|
|
msg.WriteBits(flags.incomingIsSet, 1);
|
|
msg.WriteBits(flags.bounceIsSet, 1);
|
|
msg.WriteBits(flags.start, 1);
|
|
msg.WriteBits(flags.removeWhenDone, 1);
|
|
msg.WriteBits(flags.toggle, 1);
|
|
msg.WriteBits(flags.onlyVisibleInSpirit, 1);
|
|
msg.WriteBits(flags.onlyInvisibleInSpirit, 1);
|
|
msg.WriteBits(flags.useWeaponDepthHack, 1);
|
|
msg.WriteBits(flags.bNoRemoveWhenUnbound, 1);
|
|
|
|
msg.WriteFloat(normal.x);
|
|
msg.WriteFloat(normal.y);
|
|
msg.WriteFloat(normal.z);
|
|
msg.WriteFloat(incomingVector.x);
|
|
msg.WriteFloat(incomingVector.y);
|
|
msg.WriteFloat(incomingVector.z);
|
|
msg.WriteFloat(bounceVector.x);
|
|
msg.WriteFloat(bounceVector.y);
|
|
msg.WriteFloat(bounceVector.z);
|
|
msg.WriteString(bindBone);
|
|
msg.WriteBits(entity.GetSpawnId(), 32);
|
|
*/
|
|
|
|
msg.WriteBits(flags.normalIsSet, 1);
|
|
msg.WriteBits(flags.removeWhenDone, 1);
|
|
msg.WriteFloat(normal.x);
|
|
msg.WriteFloat(normal.y);
|
|
msg.WriteFloat(normal.z);
|
|
}
|
|
|
|
void hhFxInfo::ReadFromSnapshot( const idBitMsgDelta &msg ) {
|
|
/*
|
|
flags.normalIsSet = !!msg.ReadBits(1);
|
|
flags.incomingIsSet = !!msg.ReadBits(1);
|
|
flags.bounceIsSet = !!msg.ReadBits(1);
|
|
flags.start = !!msg.ReadBits(1);
|
|
flags.removeWhenDone = !!msg.ReadBits(1);
|
|
flags.toggle = !!msg.ReadBits(1);
|
|
flags.onlyVisibleInSpirit = !!msg.ReadBits(1);
|
|
flags.onlyInvisibleInSpirit = !!msg.ReadBits(1);
|
|
flags.useWeaponDepthHack = !!msg.ReadBits(1);
|
|
flags.bNoRemoveWhenUnbound = !!msg.ReadBits(1);
|
|
|
|
normal.x = msg.ReadFloat();
|
|
normal.y = msg.ReadFloat();
|
|
normal.z = msg.ReadFloat();
|
|
incomingVector.x = msg.ReadFloat();
|
|
incomingVector.y = msg.ReadFloat();
|
|
incomingVector.z = msg.ReadFloat();
|
|
bounceVector.x = msg.ReadFloat();
|
|
bounceVector.y = msg.ReadFloat();
|
|
bounceVector.z = msg.ReadFloat();
|
|
|
|
char buf[128];
|
|
msg.ReadString(buf, 128);
|
|
bindBone = buf;
|
|
entity.SetSpawnId(msg.ReadBits(32));
|
|
*/
|
|
|
|
flags.normalIsSet = !!msg.ReadBits(1);
|
|
flags.removeWhenDone = !!msg.ReadBits(1);
|
|
normal.x = msg.ReadFloat();
|
|
normal.y = msg.ReadFloat();
|
|
normal.z = msg.ReadFloat();
|
|
}
|
|
|
|
hhFxInfo& hhFxInfo::Assign( const hhFxInfo* fxInfo ) {
|
|
Reset();
|
|
|
|
if( !fxInfo ) {
|
|
return *this;
|
|
}
|
|
|
|
if( fxInfo->NormalIsSet() ) {
|
|
SetNormal( fxInfo->GetNormal() );
|
|
}
|
|
|
|
if( fxInfo->IncomingVectorIsSet() ) {
|
|
SetIncomingVector( fxInfo->GetIncomingVector() );
|
|
}
|
|
|
|
if( fxInfo->BounceVectorIsSet() ) {
|
|
SetBounceVector( fxInfo->GetBounceVector() );
|
|
}
|
|
|
|
if( fxInfo->EntityIsSet() ) {
|
|
SetEntity( fxInfo->GetEntity() );
|
|
}
|
|
|
|
if( fxInfo->BindBoneIsSet() ) {
|
|
SetBindBone( fxInfo->GetBindBone() );
|
|
}
|
|
|
|
SetStart( fxInfo->StartIsSet() );
|
|
|
|
RemoveWhenDone( fxInfo->RemoveWhenDone() );
|
|
|
|
Toggle( fxInfo->Toggle() );
|
|
|
|
OnlyVisibleInSpirit( fxInfo->OnlyVisibleInSpirit() );
|
|
OnlyInvisibleInSpirit( fxInfo->OnlyInvisibleInSpirit() );
|
|
UseWeaponDepthHack( fxInfo->UseWeaponDepthHack() );
|
|
NoRemoveWhenUnbound( fxInfo->NoRemoveWhenUnbound() );
|
|
|
|
return *this;
|
|
}
|
|
|
|
hhFxInfo& hhFxInfo::operator=( const hhFxInfo* fxInfo ) {
|
|
return Assign( fxInfo );
|
|
}
|
|
|
|
hhFxInfo& hhFxInfo::operator=( const hhFxInfo& fxInfo ) {
|
|
return Assign( &fxInfo );
|
|
}
|
|
|
|
void hhFxInfo::SetNormal( const idVec3 &v ) {
|
|
assert( v.Length() );
|
|
normal = v;
|
|
flags.normalIsSet = true;
|
|
}
|
|
|
|
void hhFxInfo::SetIncomingVector( const idVec3 &v ) {
|
|
assert( v.Length() );
|
|
incomingVector = v;
|
|
flags.incomingIsSet = true;
|
|
}
|
|
|
|
void hhFxInfo::SetBounceVector( const idVec3 &v ) {
|
|
assert( v.Length() );
|
|
bounceVector = v;
|
|
flags.bounceIsSet = true;
|
|
}
|
|
|
|
void hhFxInfo::SetEntity( idEntity *e ) {
|
|
entity = e;
|
|
}
|
|
|
|
void hhFxInfo::SetBindBone( const char* bindBone ) {
|
|
this->bindBone = bindBone;
|
|
}
|
|
|
|
void hhFxInfo::SetStart(const bool start) {
|
|
flags.start = start;
|
|
}
|
|
|
|
void hhFxInfo::RemoveWhenDone( const bool removeWhenDone ) {
|
|
flags.removeWhenDone = removeWhenDone;
|
|
}
|
|
|
|
void hhFxInfo::Toggle( const bool tf ) {
|
|
flags.toggle = tf;
|
|
}
|
|
|
|
void hhFxInfo::OnlyVisibleInSpirit( const bool spirit ) {
|
|
flags.onlyVisibleInSpirit = spirit;
|
|
}
|
|
|
|
void hhFxInfo::OnlyInvisibleInSpirit( const bool spirit ) {
|
|
flags.onlyInvisibleInSpirit = spirit;
|
|
}
|
|
|
|
void hhFxInfo::UseWeaponDepthHack( const bool weaponDepthHack ) {
|
|
flags.useWeaponDepthHack = weaponDepthHack;
|
|
}
|
|
|
|
void hhFxInfo::Triggered( const bool tf ) {
|
|
flags.triggered = tf;
|
|
}
|
|
|
|
const idVec3& hhFxInfo::GetNormal( ) const {
|
|
assert( flags.normalIsSet );
|
|
return( normal );
|
|
}
|
|
|
|
const idVec3& hhFxInfo::GetIncomingVector( ) const {
|
|
assert( flags.incomingIsSet );
|
|
return( incomingVector );
|
|
}
|
|
|
|
const idVec3& hhFxInfo::GetBounceVector( ) const {
|
|
assert( flags.bounceIsSet );
|
|
return( bounceVector );
|
|
}
|
|
|
|
const char* hhFxInfo::GetBindBone() const {
|
|
return bindBone.c_str();
|
|
}
|
|
|
|
idEntity* const hhFxInfo::GetEntity( ) const {
|
|
return( entity.GetEntity() );
|
|
}
|
|
|
|
bool hhFxInfo::RemoveWhenDone() const {
|
|
return flags.removeWhenDone;
|
|
}
|
|
|
|
bool hhFxInfo::StartIsSet() const {
|
|
return flags.start;
|
|
}
|
|
|
|
bool hhFxInfo::NormalIsSet( ) const {
|
|
return flags.normalIsSet;
|
|
}
|
|
|
|
bool hhFxInfo::IncomingVectorIsSet( ) const {
|
|
return flags.incomingIsSet;
|
|
}
|
|
|
|
bool hhFxInfo::BounceVectorIsSet( ) const {
|
|
return flags.bounceIsSet;
|
|
}
|
|
|
|
bool hhFxInfo::BindBoneIsSet() const {
|
|
return bindBone.Length() > 0;
|
|
}
|
|
|
|
bool hhFxInfo::EntityIsSet() const {
|
|
return entity.IsValid();
|
|
}
|
|
|
|
bool hhFxInfo::Toggle() const {
|
|
return flags.toggle;
|
|
}
|
|
|
|
bool hhFxInfo::OnlyVisibleInSpirit( void ) const {
|
|
return flags.onlyVisibleInSpirit;
|
|
}
|
|
|
|
bool hhFxInfo::OnlyInvisibleInSpirit( void ) const {
|
|
return flags.onlyInvisibleInSpirit;
|
|
}
|
|
|
|
bool hhFxInfo::UseWeaponDepthHack() const {
|
|
return flags.useWeaponDepthHack;
|
|
}
|
|
|
|
bool hhFxInfo::Triggered() const {
|
|
return flags.triggered;
|
|
}
|
|
|
|
void hhFxInfo::NoRemoveWhenUnbound( const bool noRemove ) {
|
|
flags.bNoRemoveWhenUnbound = noRemove;
|
|
}
|
|
|
|
bool hhFxInfo::NoRemoveWhenUnbound() const {
|
|
return flags.bNoRemoveWhenUnbound;
|
|
}
|
|
|
|
void hhFxInfo::Reset() {
|
|
entity = NULL;
|
|
normal.Zero(); bounceVector.Zero();
|
|
incomingVector.Zero();
|
|
bindBone.Empty();
|
|
flags.normalIsSet = false;
|
|
flags.bounceIsSet = false;
|
|
flags.incomingIsSet = false;
|
|
flags.start = true;
|
|
flags.removeWhenDone = true;
|
|
flags.toggle = false; // jrm
|
|
flags.onlyVisibleInSpirit = false;
|
|
flags.onlyInvisibleInSpirit = false; // tmj
|
|
flags.useWeaponDepthHack = false;
|
|
flags.triggered = false; // mdl
|
|
flags.bNoRemoveWhenUnbound = false; // mdc
|
|
}
|
|
|
|
bool hhFxInfo::GetAxisFor( int which, idVec3& dir ) const {
|
|
switch ( which ) {
|
|
case AXIS_NORMAL:
|
|
if ( NormalIsSet() ) { dir = GetNormal(); return true; }
|
|
else {
|
|
if ( g_debugFX.GetBool() ) gameLocal.Warning("Tried to get fxInfo Normal when it isn't set");
|
|
}
|
|
break;
|
|
case AXIS_BOUNCE:
|
|
if ( BounceVectorIsSet() ) { dir = GetBounceVector(); return true; }
|
|
else {
|
|
if ( g_debugFX.GetBool() ) gameLocal.Warning("Tried to get fxInfo Bounce Vector when it isn't set");
|
|
}
|
|
break;
|
|
case AXIS_CUSTOMLOCAL:
|
|
// handled in alternate path
|
|
if ( g_debugFX.GetBool() ) {
|
|
gameLocal.Warning("Using customlocal without axis");
|
|
}
|
|
break;
|
|
case AXIS_INCOMING:
|
|
if ( IncomingVectorIsSet() ) { dir = GetIncomingVector(); return true; }
|
|
else {
|
|
if ( g_debugFX.GetBool() ) gameLocal.Warning("Tried to get fxInfo Incoming Vector when it isn't set");
|
|
}
|
|
break;
|
|
}
|
|
return false;
|
|
} |