Browse Source

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

Areloch 6 years ago
parent
commit
c4a4fe5304

+ 4 - 1
Engine/source/T3D/lighting/reflectionProbe.cpp

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

+ 1 - 0
Engine/source/T3D/lighting/reflectionProbe.h

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

+ 9 - 0
Engine/source/lighting/probeManager.cpp

@@ -201,6 +201,15 @@ ProbeRenderInst* ProbeManager::createProbeInfo(ProbeRenderInst* probe /* = NULL
    return outProbe;
    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()
 /*void ProbeManager::initLightFields()
 {
 {
    ProbeManagerMap &ProbeManagers = _getProbeManagers();
    ProbeManagerMap &ProbeManagers = _getProbeManagers();

+ 4 - 0
Engine/source/lighting/probeManager.h

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

+ 8 - 2
Engine/source/renderInstance/renderProbeMgr.cpp

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