Files
2026-08-09 04:29:27 -07:00

120 lines
4.4 KiB
C++

#include "gamelib/effects/lensflaremanager.h"
bool GameLib_CreateFlareModels(idRenderWorld* renderWorld,
const idDeclFlare* flareDecl, idRenderModelFlare*& flareModel,
idRenderModelFlareOcclusionQuad*& occlusionModel);
void GameLib_DeleteFlareModel(idRenderModelFlare* flareModel,
idRenderModelFlareOcclusionQuad* occlusionModel);
void GameLib_ConfigureFlareModels(idRenderModelFlare* flareModel,
idRenderModelFlareOcclusionQuad* occlusionModel, float quadScale,
bool autosprited, bool sunFlare);
void GameLib_UpdateFlareModels(idRenderModelFlare* flareModel,
idRenderModelFlareOcclusionQuad* occlusionModel,
const idVec3& flareOrigin, const idVec3& occlusionOrigin,
const idMat3& axis, float fadeStartRange, float fadeEndRange,
const idVec4& color, float coverage, bool hidden);
void GameLib_ApplyFlareCoverage(idRenderModelFlare* flareModel,
float coverage);
void GameLib_ApplyFlareColor(idRenderModelFlare* flareModel,
const idVec4& color);
idLensFlareManager::idLensFlareManager()
: flareRenderModel(nullptr)
, flareOcclusionQuadModel(nullptr)
, sunDirection()
, occlusionOffset()
, isAutosprited(false)
, isInitialized(false) {
sunDirection.Zero();
occlusionOffset.Zero();
}
idLensFlareManager::~idLensFlareManager() {
if (flareRenderModel != nullptr || flareOcclusionQuadModel != nullptr) {
GameLib_DeleteFlareModel(flareRenderModel,
flareOcclusionQuadModel);
}
flareRenderModel = nullptr;
flareOcclusionQuadModel = nullptr;
isInitialized = false;
}
void idLensFlareManager::Init(idRenderWorld* const renderWorld,
const idDeclFlare* const flareDecl, const float quadSize,
const idVec3& sunDirection_, const idVec3& occlusionOffset_,
const bool isAutosprited_) {
if (flareDecl == nullptr) {
return;
}
sunDirection = sunDirection_;
occlusionOffset = occlusionOffset_;
isAutosprited = isAutosprited_;
if (!GameLib_CreateFlareModels(renderWorld, flareDecl,
flareRenderModel, flareOcclusionQuadModel)) {
flareRenderModel = nullptr;
flareOcclusionQuadModel = nullptr;
return;
}
const bool sunFlare = sunDirection.LengthSqr() > 0.0f;
const float quadScale = quadSize < 8.0f ? 8.0f - quadSize : 0.0f;
GameLib_ConfigureFlareModels(flareRenderModel,
flareOcclusionQuadModel, quadScale, isAutosprited, sunFlare);
isInitialized = true;
}
void idLensFlareManager::ApplyFade(const float fade) {
if (flareRenderModel != nullptr) {
GameLib_ApplyFlareCoverage(flareRenderModel, fade);
}
}
void idLensFlareManager::ApplyColor(const idVec4& color) {
if (flareRenderModel != nullptr) {
GameLib_ApplyFlareColor(flareRenderModel, color);
}
}
void idLensFlareManager::StartFlare(const idVec3& origin,
const idMat3& axis, const idVec4& color, const float fadeStartRange,
const float fadeEndRange) {
if (!isInitialized || flareRenderModel == nullptr ||
flareOcclusionQuadModel == nullptr) {
return;
}
const bool sunFlare = sunDirection.LengthSqr() > 0.0f;
const idVec3 flareOrigin = sunFlare ? sunDirection : origin;
const idVec3 quadOrigin = sunFlare
? sunDirection : origin + occlusionOffset;
GameLib_UpdateFlareModels(flareRenderModel, flareOcclusionQuadModel,
flareOrigin, quadOrigin, axis, fadeStartRange, fadeEndRange,
color, 1.0f, false);
}
void idLensFlareManager::StopFlare() {
if (flareRenderModel == nullptr || flareOcclusionQuadModel == nullptr) {
return;
}
GameLib_UpdateFlareModels(flareRenderModel, flareOcclusionQuadModel,
idVec3(0.0f, 0.0f, 0.0f), idVec3(0.0f, 0.0f, 0.0f),
idMat3(1.0f), 0.0f, 0.0f,
idVec4(1.0f, 1.0f, 1.0f, 1.0f), 0.0f, true);
}
void idLensFlareManager::Update(const idVec3& origin,
const idMat3& axis, const int time, const bool bindOrigin,
const bool bindAxis) {
(void)time;
if (!isInitialized || flareRenderModel == nullptr ||
flareOcclusionQuadModel == nullptr) {
return;
}
if (sunDirection.LengthSqr() == 0.0f && (bindOrigin || bindAxis)) {
const idVec3 flareOrigin = bindOrigin ? origin : sunDirection;
const idVec3 quadOrigin = flareOrigin + occlusionOffset;
GameLib_UpdateFlareModels(flareRenderModel,
flareOcclusionQuadModel, flareOrigin, quadOrigin,
bindAxis ? axis : idMat3(1.0f), 0.0f, 0.0f,
idVec4(1.0f, 1.0f, 1.0f, 1.0f), 1.0f, false);
}
}