118 lines
3.5 KiB
C++
118 lines
3.5 KiB
C++
#include "gamelib/effects/deferreddecalmanager.h"
|
|
|
|
#include "gamelib/physics/physics.h"
|
|
#include "idlib/lib_print.h"
|
|
|
|
idClipQuery GameLib_SubmitDeferredDecalLineTrace(idClip* clip,
|
|
const idVec3& start, const idVec3& end, int clipMask);
|
|
bool GameLib_GetDeferredDecalLineTraceResult(idClip* clip,
|
|
idClipQuery& query, trace_t& result);
|
|
void GameLib_AddDeferredDecalFromPoint(idRenderModelDecal* decalModel,
|
|
const deferredDecalParams_t& parameters, int time,
|
|
const idVec3& origin, const idVec3& normal);
|
|
|
|
namespace {
|
|
|
|
constexpr std::uint64_t RECOVERED_EMPTY_CLIP_QUERY = 0x000007D000000000ULL;
|
|
|
|
} // namespace
|
|
|
|
idDeferredDecalQuery::idDeferredDecalQuery() {
|
|
Reset();
|
|
}
|
|
|
|
void idDeferredDecalQuery::Reset() {
|
|
theQuery.index = RECOVERED_EMPTY_CLIP_QUERY;
|
|
decalParams.decalMat = nullptr;
|
|
decalParams.depth = 8.0f;
|
|
decalParams.size.Set(32.0f, 32.0f);
|
|
decalParams.angle = 0.0f;
|
|
decalParams.lifetime = 10000;
|
|
decalParams.fadetime = 2000;
|
|
decalParams.fadeInEndTime = 0;
|
|
origin.Zero();
|
|
normal.Zero();
|
|
}
|
|
|
|
idDeferredDecalManager::idDeferredDecalManager()
|
|
: lineQueries{}
|
|
, numLineQueries(0)
|
|
, clip(nullptr)
|
|
, decalModel(nullptr) {
|
|
}
|
|
|
|
void idDeferredDecalManager::Init(idClip* const clip_,
|
|
idRenderModelDecal* const decalModel_) {
|
|
clip = clip_;
|
|
decalModel = decalModel_;
|
|
}
|
|
|
|
void idDeferredDecalManager::Shutdown() {
|
|
numLineQueries = 0;
|
|
clip = nullptr;
|
|
decalModel = nullptr;
|
|
for (idDeferredDecalQuery& query : lineQueries) {
|
|
query.Reset();
|
|
}
|
|
}
|
|
|
|
void idDeferredDecalManager::AddDecalFromLineTrace(
|
|
const deferredDecalParams_t* const decalParameters,
|
|
const idVec3& start, const idVec3& end, const int clipMask) {
|
|
if (clip == nullptr || decalModel == nullptr) {
|
|
return;
|
|
}
|
|
if (numLineQueries >= 16) {
|
|
idLibPrint::Warning("Too many deferred decal queries this frame!");
|
|
return;
|
|
}
|
|
if (decalParameters == nullptr || decalParameters->decalMat == nullptr) {
|
|
idLibPrint::Warning(
|
|
"Null decal passed in to "
|
|
"idDeferredDecalManager::AddDecalFromLineTrace");
|
|
return;
|
|
}
|
|
|
|
idDeferredDecalQuery& query = lineQueries[numLineQueries];
|
|
query.Reset();
|
|
query.theQuery = GameLib_SubmitDeferredDecalLineTrace(
|
|
clip, start, end, clipMask);
|
|
query.decalParams = *decalParameters;
|
|
++numLineQueries;
|
|
}
|
|
|
|
void idDeferredDecalManager::AddDecalFromPoint(
|
|
const deferredDecalParams_t* const decalParameters, const int time,
|
|
const idVec3& origin, const idVec3& normal) {
|
|
if (clip == nullptr || decalModel == nullptr) {
|
|
return;
|
|
}
|
|
if (decalParameters == nullptr || decalParameters->decalMat == nullptr) {
|
|
idLibPrint::Warning(
|
|
"Null decal passed in to "
|
|
"idDeferredDecalManager::AddDecalFromLineTrace");
|
|
return;
|
|
}
|
|
|
|
GameLib_AddDeferredDecalFromPoint(
|
|
decalModel, *decalParameters, time, origin, normal);
|
|
}
|
|
|
|
void idDeferredDecalManager::Update(const int time) {
|
|
if (clip == nullptr || decalModel == nullptr) {
|
|
return;
|
|
}
|
|
|
|
for (int index = 0; index < numLineQueries; ++index) {
|
|
idDeferredDecalQuery& query = lineQueries[index];
|
|
trace_t result{};
|
|
if (GameLib_GetDeferredDecalLineTraceResult(
|
|
clip, query.theQuery, result) && result.fraction < 1.0f) {
|
|
AddDecalFromPoint(&query.decalParams, time,
|
|
result.endpos, result.c.normal);
|
|
}
|
|
query.Reset();
|
|
}
|
|
numLineQueries = 0;
|
|
}
|