Implemented registration of probes to avoid rendering all probes when unneeded.

This commit is contained in:
Areloch 2018-11-19 01:18:09 -06:00
parent a4e592534e
commit ecef09525a
5 changed files with 26 additions and 3 deletions

View file

@ -142,6 +142,8 @@ ReflectionProbe::ReflectionProbe()
mProbePosOffset = Point3F::Zero;
mEditPosOffset = false;
mProbeInfoIdx = -1;
}
ReflectionProbe::~ReflectionProbe()
@ -461,6 +463,7 @@ void ReflectionProbe::updateProbeParams()
if (mProbeInfo == nullptr)
{
mProbeInfo = new ProbeRenderInst();
mProbeInfoIdx = ProbeRenderInst::all.size() - 1;
mProbeInfo->mIsEnabled = false;
}
@ -666,7 +669,7 @@ void ReflectionProbe::prepRenderImage(SceneRenderState *state)
mProbeInfo->mScore *= mMax(mAbs(mDot(vect, state->getCameraTransform().getForwardVector())),0.001f);
//Register
//PROBEMGR->registerProbe(mProbeInfo, this);
PROBEMGR->registerProbe(mProbeInfoIdx);
if (ReflectionProbe::smRenderPreviewProbes && gEditingMission && mEditorShapeInst && mPrefilterMap != nullptr)
{

View file

@ -112,6 +112,7 @@ protected:
ProbeRenderInst::ProbeShapeType mProbeShapeType;
ProbeRenderInst* mProbeInfo;
U32 mProbeInfoIdx;
//Indirect Lighting Contribution stuff
IndrectLightingModeType mIndrectLightingModeType;

View file

@ -201,6 +201,15 @@ ProbeRenderInst* ProbeManager::createProbeInfo(ProbeRenderInst* probe /* = NULL
return outProbe;
}
void ProbeManager::registerProbe(U32 probeIdx)
{
//Mostly for consolidation, but also lets us sanity check or prep any other data we need for rendering this in one place at time of flagging for render
if (probeIdx >= ProbeRenderInst::all.size())
return;
mRegisteredProbes.push_back_unique(probeIdx);
}
/*void ProbeManager::initLightFields()
{
ProbeManagerMap &ProbeManagers = _getProbeManagers();

View file

@ -277,6 +277,8 @@ public:
SpecialProbeTypesCount
};
Vector<U32> mRegisteredProbes;
ProbeManager();
~ProbeManager();
@ -284,6 +286,8 @@ public:
///
static ProbeRenderInst* createProbeInfo(ProbeRenderInst* light = NULL);
void registerProbe(U32 probeIdx);
/// The light manager activation signal.
static Signal<void(const char*,bool)> smActivateSignal;

View file

@ -198,6 +198,9 @@ void RenderProbeMgr::render( SceneRenderState *state )
if (!ProbeRenderInst::all.size())
return;
if (PROBEMGR->mRegisteredProbes.empty())
return;
if (!ProbeManager::smRenderReflectionProbes)
return;
@ -255,9 +258,9 @@ void RenderProbeMgr::render( SceneRenderState *state )
ProbeManager::SkylightMaterialInfo* skylightMat = PROBEMGR->getSkylightMaterial();
ProbeManager::ReflectProbeMaterialInfo* reflProbeMat = PROBEMGR->getReflectProbeMaterial();
for (U32 i = 0; i < ProbeRenderInst::all.size(); i++)
for (U32 i = 0; i < PROBEMGR->mRegisteredProbes.size(); i++)
{
ProbeRenderInst* curEntry = ProbeRenderInst::all[i];
ProbeRenderInst* curEntry = ProbeRenderInst::all[PROBEMGR->mRegisteredProbes[i]];
if (!curEntry->mIsEnabled)
continue;
@ -321,6 +324,9 @@ void RenderProbeMgr::render( SceneRenderState *state )
}
}
//And clean us up
PROBEMGR->mRegisteredProbes.clear();
probeLightingTargetRef->resolve();
GFX->popActiveRenderTarget();