110 lines
3.5 KiB
C++
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;
|
|
}
|