diff --git a/Engine/source/T3D/lighting/reflectionProbe.cpp b/Engine/source/T3D/lighting/reflectionProbe.cpp index 8aaac186c..7ba6593b9 100644 --- a/Engine/source/T3D/lighting/reflectionProbe.cpp +++ b/Engine/source/T3D/lighting/reflectionProbe.cpp @@ -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) { diff --git a/Engine/source/T3D/lighting/reflectionProbe.h b/Engine/source/T3D/lighting/reflectionProbe.h index e803e502d..90100a020 100644 --- a/Engine/source/T3D/lighting/reflectionProbe.h +++ b/Engine/source/T3D/lighting/reflectionProbe.h @@ -112,6 +112,7 @@ protected: ProbeRenderInst::ProbeShapeType mProbeShapeType; ProbeRenderInst* mProbeInfo; + U32 mProbeInfoIdx; //Indirect Lighting Contribution stuff IndrectLightingModeType mIndrectLightingModeType; diff --git a/Engine/source/lighting/probeManager.cpp b/Engine/source/lighting/probeManager.cpp index 368a4bb1b..8503fa4c9 100644 --- a/Engine/source/lighting/probeManager.cpp +++ b/Engine/source/lighting/probeManager.cpp @@ -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(); diff --git a/Engine/source/lighting/probeManager.h b/Engine/source/lighting/probeManager.h index 8ac8b361f..7f06a8056 100644 --- a/Engine/source/lighting/probeManager.h +++ b/Engine/source/lighting/probeManager.h @@ -277,6 +277,8 @@ public: SpecialProbeTypesCount }; + Vector 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 smActivateSignal; diff --git a/Engine/source/renderInstance/renderProbeMgr.cpp b/Engine/source/renderInstance/renderProbeMgr.cpp index ba0e75bf5..13f5a4b97 100644 --- a/Engine/source/renderInstance/renderProbeMgr.cpp +++ b/Engine/source/renderInstance/renderProbeMgr.cpp @@ -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();