Files
tech5/source/engine/gamelib/effects/gamelibeffects.cpp
T
2026-08-09 04:29:27 -07:00

110 lines
3.5 KiB
C++

#include "gamelib/effects/gamelibeffects.h"
idRenderModelEffects* GameLib_AllocEffectsModel(idRenderWorld* renderWorld);
idRenderModelDecal* GameLib_GetDecalModel(idRenderWorld* renderWorld);
idRenderModelBeam* GameLib_AllocBeamModel(idRenderWorld* renderWorld);
void GameLib_CommitEffectsModel(idRenderModelEffects* model);
void GameLib_CommitDecalModel(idRenderModelDecal* model);
void GameLib_CommitBeamModel(idRenderModelBeam* model);
void GameLib_FreeEffectsModel(idRenderModelEffects* model);
void GameLib_FreeBeamModel(idRenderModelBeam* model);
void GameLib_UpdateEffectsModel(idRenderModelEffects* model,
int currentTime, int gameMsPerFrame);
void GameLib_UpdateBeamModel(idRenderModelBeam* model, int currentTime);
idGameLibEffects::idGameLibEffects()
: effectsModel(nullptr)
, decalModel(nullptr)
, beamModel(nullptr)
, effectsModelManager()
, deferredDecalManager()
, ribbonModelManager()
, weaponTraceManager()
, fxModelRecycler()
, weaponImpactManager()
, impactManager()
, initialized(false) {
}
idGameLibEffects::~idGameLibEffects() {
Shutdown();
}
void idGameLibEffects::Init(idRenderWorld* const renderWorld,
idClip* const clip, const float diversity,
const int localPlayerIndex) {
if (initialized) {
Shutdown();
}
if (renderWorld == nullptr) {
return;
}
effectsModel = GameLib_AllocEffectsModel(renderWorld);
decalModel = GameLib_GetDecalModel(renderWorld);
beamModel = GameLib_AllocBeamModel(renderWorld);
if (effectsModel != nullptr) {
GameLib_CommitEffectsModel(effectsModel);
}
if (decalModel != nullptr) {
GameLib_CommitDecalModel(decalModel);
}
if (beamModel != nullptr) {
GameLib_CommitBeamModel(beamModel);
}
effectsModelManager.Init();
deferredDecalManager.Init(clip, decalModel);
ribbonModelManager.Shutdown();
weaponTraceManager.Init();
fxModelRecycler.Init();
weaponImpactManager.Init(&effectsModelManager, diversity, 64,
localPlayerIndex);
impactManager.Init(&effectsModelManager, diversity, 32,
localPlayerIndex);
initialized = true;
}
void idGameLibEffects::Shutdown() {
initialized = false;
effectsModelManager.Shutdown();
deferredDecalManager.Shutdown();
ribbonModelManager.Shutdown();
weaponTraceManager.Init();
fxModelRecycler.Shutdown();
weaponImpactManager.Shutdown();
impactManager.Shutdown();
if (effectsModel != nullptr) {
GameLib_FreeEffectsModel(effectsModel);
effectsModel = nullptr;
}
if (beamModel != nullptr) {
GameLib_FreeBeamModel(beamModel);
beamModel = nullptr;
}
// The decal model is owned by idRenderWorld and is not freed here in the
// recovered shutdown path.
decalModel = nullptr;
}
bool idGameLibEffects::Update(const int currentTime,
const int gameMsPerFrame, const int serverCurrentTime) {
if (!initialized) {
return false;
}
deferredDecalManager.Update(currentTime);
if (effectsModel != nullptr) {
GameLib_UpdateEffectsModel(effectsModel, currentTime, gameMsPerFrame);
}
if (beamModel != nullptr) {
GameLib_UpdateBeamModel(beamModel, currentTime);
}
weaponTraceManager.Update();
const idVec3 origin(0.0f, 0.0f, 0.0f);
const idMat3 axis(1.0f);
weaponImpactManager.Update(origin, axis, currentTime, serverCurrentTime);
impactManager.Update(origin, axis, currentTime, serverCurrentTime);
return true;
}