|
@@ -243,7 +243,6 @@ bool ReflectProbeMatInstance::setupPass(SceneRenderState *state, const SceneData
|
|
RenderProbeMgr::RenderProbeMgr()
|
|
RenderProbeMgr::RenderProbeMgr()
|
|
: RenderBinManager(RenderPassManager::RIT_Probes, 1.0f, 1.0f),
|
|
: RenderBinManager(RenderPassManager::RIT_Probes, 1.0f, 1.0f),
|
|
mReflectProbeMaterial(nullptr),
|
|
mReflectProbeMaterial(nullptr),
|
|
- mSceneManager(nullptr),
|
|
|
|
mLastShader(nullptr),
|
|
mLastShader(nullptr),
|
|
mLastConstants(nullptr)
|
|
mLastConstants(nullptr)
|
|
{
|
|
{
|
|
@@ -276,6 +275,12 @@ RenderProbeMgr::RenderProbeMgr()
|
|
|
|
|
|
irradMaps.setSize(MAXPROBECOUNT);
|
|
irradMaps.setSize(MAXPROBECOUNT);
|
|
irradMaps.fill(NULL);
|
|
irradMaps.fill(NULL);
|
|
|
|
+
|
|
|
|
+ mEffectiveProbeCount = 0;
|
|
|
|
+
|
|
|
|
+ mProbeArrayEffect = nullptr;
|
|
|
|
+
|
|
|
|
+ numProbesSC = nullptr;
|
|
}
|
|
}
|
|
|
|
|
|
RenderProbeMgr::RenderProbeMgr(RenderInstType riType, F32 renderOrder, F32 processAddOrder)
|
|
RenderProbeMgr::RenderProbeMgr(RenderInstType riType, F32 renderOrder, F32 processAddOrder)
|
|
@@ -320,6 +325,21 @@ void RenderProbeMgr::registerProbe(U32 probeIdx)
|
|
return;
|
|
return;
|
|
|
|
|
|
mRegisteredProbes.push_back_unique(probeIdx);
|
|
mRegisteredProbes.push_back_unique(probeIdx);
|
|
|
|
+
|
|
|
|
+ //rebuild our probe data
|
|
|
|
+ //_setupStaticParameters();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void RenderProbeMgr::unregisterProbe(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.remove(probeIdx);
|
|
|
|
+
|
|
|
|
+ //rebuild our probe data
|
|
|
|
+ //_setupStaticParameters();
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
//
|
|
@@ -327,8 +347,12 @@ void RenderProbeMgr::registerProbe(U32 probeIdx)
|
|
PostEffect* RenderProbeMgr::getProbeArrayEffect()
|
|
PostEffect* RenderProbeMgr::getProbeArrayEffect()
|
|
{
|
|
{
|
|
if (!mProbeArrayEffect)
|
|
if (!mProbeArrayEffect)
|
|
|
|
+ {
|
|
mProbeArrayEffect = dynamic_cast<PostEffect*>(Sim::findObject("reflectionProbeArrayPostFX"));
|
|
mProbeArrayEffect = dynamic_cast<PostEffect*>(Sim::findObject("reflectionProbeArrayPostFX"));
|
|
|
|
|
|
|
|
+ if (!mProbeArrayEffect)
|
|
|
|
+ return nullptr;
|
|
|
|
+ }
|
|
return mProbeArrayEffect;
|
|
return mProbeArrayEffect;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -339,7 +363,115 @@ PostEffect* RenderProbeMgr::getProbeArrayEffect()
|
|
|
|
|
|
void RenderProbeMgr::_setupStaticParameters()
|
|
void RenderProbeMgr::_setupStaticParameters()
|
|
{
|
|
{
|
|
|
|
+ mLastShader = mProbeArrayEffect->getShader();
|
|
|
|
+
|
|
|
|
+ if (mLastShader == nullptr)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ mLastConstants = mLastShader->allocConstBuffer();
|
|
|
|
+
|
|
|
|
+ numProbesSC = mLastShader->getShaderConstHandle("$numProbes");
|
|
|
|
+
|
|
|
|
+ probePositionSC = mLastShader->getShaderConstHandle("$inProbePosArray");
|
|
|
|
+ probeWorldToObjSC = mLastShader->getShaderConstHandle("$worldToObjArray");
|
|
|
|
+ probeBBMinSC = mLastShader->getShaderConstHandle("$bbMinArray");
|
|
|
|
+ probeBBMaxSC = mLastShader->getShaderConstHandle("$bbMaxArray");
|
|
|
|
+ probeUseSphereModeSC = mLastShader->getShaderConstHandle("$useSphereMode");
|
|
|
|
+ probeRadiusSC = mLastShader->getShaderConstHandle("$radius");
|
|
|
|
+ probeAttenuationSC = mLastShader->getShaderConstHandle("$attenuation");
|
|
|
|
+
|
|
|
|
+ //Array rendering
|
|
|
|
+ U32 probeCount = ProbeRenderInst::all.size();
|
|
|
|
+
|
|
|
|
+ mEffectiveProbeCount = 0;
|
|
|
|
+
|
|
|
|
+ for (U32 i = 0; i < probeCount; i++)
|
|
|
|
+ {
|
|
|
|
+ if (mEffectiveProbeCount >= MAXPROBECOUNT)
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ ProbeRenderInst* curEntry = ProbeRenderInst::all[i];
|
|
|
|
+ if (!curEntry->mIsEnabled)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ if (curEntry->mCubemap.isNull() || curEntry->mIrradianceCubemap.isNull())
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ if (!curEntry->mCubemap->isInitialised())
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ if (curEntry->mIsSkylight)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ //Setup
|
|
|
|
+ const Point3F &probePos = curEntry->getPosition();
|
|
|
|
+ probePositions[i] = probePos + curEntry->mProbePosOffset;
|
|
|
|
+
|
|
|
|
+ MatrixF trans = curEntry->getTransform();
|
|
|
|
+ trans.inverse();
|
|
|
|
+
|
|
|
|
+ probeWorldToObj[i] = trans;
|
|
|
|
+
|
|
|
|
+ probeBBMin[i] = curEntry->mBounds.minExtents;
|
|
|
|
+ probeBBMax[i] = curEntry->mBounds.maxExtents;
|
|
|
|
+
|
|
|
|
+ probeUseSphereMode[i] = curEntry->mProbeShapeType == ProbeRenderInst::Sphere ? 1 : 0;
|
|
|
|
+
|
|
|
|
+ probeRadius[i] = curEntry->mRadius;
|
|
|
|
+ probeAttenuation[i] = 1;
|
|
|
|
+
|
|
|
|
+ cubeMaps[i] = curEntry->mCubemap;
|
|
|
|
+ irradMaps[i] = curEntry->mIrradianceCubemap;
|
|
|
|
+
|
|
|
|
+ mEffectiveProbeCount++;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (mEffectiveProbeCount != 0)
|
|
|
|
+ {
|
|
|
|
+ mCubemapArray = GFXCubemapArrayHandle(GFX->createCubemapArray());
|
|
|
|
+ mIrradArray = GFXCubemapArrayHandle(GFX->createCubemapArray());
|
|
|
|
+
|
|
|
|
+ mCubemapArray->initStatic(cubeMaps.address(), mEffectiveProbeCount);
|
|
|
|
+ mIrradArray->initStatic(irradMaps.address(), mEffectiveProbeCount);
|
|
|
|
|
|
|
|
+ /*NamedTexTarget *deferredTarget = NamedTexTarget::find(RenderDeferredMgr::BufferName);
|
|
|
|
+ if (deferredTarget)
|
|
|
|
+ GFX->setTexture(0, deferredTarget->getTexture());
|
|
|
|
+ else
|
|
|
|
+ GFX->setTexture(0, NULL);
|
|
|
|
+
|
|
|
|
+ NamedTexTarget *colorTarget = NamedTexTarget::find(RenderDeferredMgr::ColorBufferName);
|
|
|
|
+ if (colorTarget)
|
|
|
|
+ GFX->setTexture(1, colorTarget->getTexture());
|
|
|
|
+ else
|
|
|
|
+ GFX->setTexture(1, NULL);
|
|
|
|
+
|
|
|
|
+ NamedTexTarget *matinfoTarget = NamedTexTarget::find(RenderDeferredMgr::MatInfoBufferName);
|
|
|
|
+ if (matinfoTarget)
|
|
|
|
+ GFX->setTexture(2, matinfoTarget->getTexture());
|
|
|
|
+ else
|
|
|
|
+ GFX->setTexture(2, NULL);
|
|
|
|
+
|
|
|
|
+ if (mBrdfTexture)
|
|
|
|
+ {
|
|
|
|
+ GFX->setTexture(3, mBrdfTexture);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ GFX->setTexture(3, NULL);*/
|
|
|
|
+
|
|
|
|
+ //GFX->setCubeArrayTexture(4, mCubemapArray);
|
|
|
|
+ //GFX->setCubeArrayTexture(5, mIrradArray);
|
|
|
|
+
|
|
|
|
+ ProbeRenderInst* curEntry = ProbeRenderInst::all[0];
|
|
|
|
+ //count = MAXPROBECOUNT;
|
|
|
|
+ //Final packing
|
|
|
|
+ mProbePositions = AlignedArray<Point4F>(mEffectiveProbeCount, sizeof(Point4F), (U8*)probePositions.address(), false);
|
|
|
|
+ mProbeBBMin = AlignedArray<Point4F>(mEffectiveProbeCount, sizeof(Point4F), (U8*)probeBBMin.address(), false);
|
|
|
|
+ mProbeBBMax = AlignedArray<Point4F>(mEffectiveProbeCount, sizeof(Point4F), (U8*)probeBBMax.address(), false);
|
|
|
|
+ mProbeUseSphereMode = AlignedArray<float>(mEffectiveProbeCount, sizeof(float), (U8*)probeUseSphereMode.address(), false);
|
|
|
|
+ mProbeRadius = AlignedArray<float>(mEffectiveProbeCount, sizeof(float), (U8*)probeRadius.address(), false);
|
|
|
|
+ mProbeAttenuation = AlignedArray<float>(mEffectiveProbeCount, sizeof(float), (U8*)probeAttenuation.address(), false);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
void RenderProbeMgr::_setupPerFrameParameters(const SceneRenderState *state)
|
|
void RenderProbeMgr::_setupPerFrameParameters(const SceneRenderState *state)
|
|
@@ -432,27 +564,27 @@ ProbeShaderConstants* RenderProbeMgr::getProbeShaderConstants(GFXShaderConstBuff
|
|
ProbeConstantMap::Iterator iter = mConstantLookup.find(shader);
|
|
ProbeConstantMap::Iterator iter = mConstantLookup.find(shader);
|
|
if (iter != mConstantLookup.end())
|
|
if (iter != mConstantLookup.end())
|
|
{
|
|
{
|
|
- mLastConstants = iter->value;
|
|
|
|
|
|
+ mLastForwardConstants = iter->value;
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
ProbeShaderConstants* psc = new ProbeShaderConstants();
|
|
ProbeShaderConstants* psc = new ProbeShaderConstants();
|
|
mConstantLookup[shader] = psc;
|
|
mConstantLookup[shader] = psc;
|
|
|
|
|
|
- mLastConstants = psc;
|
|
|
|
|
|
+ mLastForwardConstants = psc;
|
|
}
|
|
}
|
|
|
|
|
|
// Set our new shader
|
|
// Set our new shader
|
|
mLastShader = shader;
|
|
mLastShader = shader;
|
|
}
|
|
}
|
|
|
|
|
|
- mLastConstants = new ProbeShaderConstants();
|
|
|
|
|
|
+ mLastForwardConstants = new ProbeShaderConstants();
|
|
|
|
|
|
// Make sure that our current lighting constants are initialized
|
|
// Make sure that our current lighting constants are initialized
|
|
- if (!mLastConstants->mInit)
|
|
|
|
- mLastConstants->init(shader);
|
|
|
|
|
|
+ if (!mLastForwardConstants->mInit)
|
|
|
|
+ mLastForwardConstants->init(shader);
|
|
|
|
|
|
- return mLastConstants;
|
|
|
|
|
|
+ return mLastForwardConstants;
|
|
}
|
|
}
|
|
|
|
|
|
void RenderProbeMgr::_update4ProbeConsts(const SceneData &sgData,
|
|
void RenderProbeMgr::_update4ProbeConsts(const SceneData &sgData,
|
|
@@ -629,7 +761,9 @@ void RenderProbeMgr::setProbeInfo(ProcessedMaterial *pmat,
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
void RenderProbeMgr::render( SceneRenderState *state )
|
|
void RenderProbeMgr::render( SceneRenderState *state )
|
|
{
|
|
{
|
|
- PROFILE_SCOPE(RenderProbeMgr_render);
|
|
|
|
|
|
+ //PROFILE_SCOPE(RenderProbeMgr_render);
|
|
|
|
+ if (getProbeArrayEffect() == nullptr)
|
|
|
|
+ return;
|
|
|
|
|
|
// Early out if nothing to draw.
|
|
// Early out if nothing to draw.
|
|
if (!ProbeRenderInst::all.size())
|
|
if (!ProbeRenderInst::all.size())
|
|
@@ -638,129 +772,38 @@ void RenderProbeMgr::render( SceneRenderState *state )
|
|
if (!RenderProbeMgr::smRenderReflectionProbes)
|
|
if (!RenderProbeMgr::smRenderReflectionProbes)
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
+ if (mEffectiveProbeCount == 0)
|
|
|
|
+ _setupStaticParameters(); //return;
|
|
|
|
+
|
|
GFXTransformSaver saver;
|
|
GFXTransformSaver saver;
|
|
|
|
|
|
GFXDEBUGEVENT_SCOPE(RenderProbeMgr_render, ColorI::WHITE);
|
|
GFXDEBUGEVENT_SCOPE(RenderProbeMgr_render, ColorI::WHITE);
|
|
|
|
|
|
- NamedTexTargetRef sceneColorTargetRef = NamedTexTarget::find("AL_FormatToken");
|
|
|
|
- if (sceneColorTargetRef.isNull())
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- GFXTextureTargetRef probeLightingTargetRef = GFX->allocRenderToTextureTarget();
|
|
|
|
-
|
|
|
|
- if (probeLightingTargetRef.isNull())
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- //Do a quick pass to update our probes if they're dirty
|
|
|
|
- //PROBEMGR->updateDirtyProbes();
|
|
|
|
-
|
|
|
|
- probeLightingTargetRef->attachTexture(GFXTextureTarget::Color0, sceneColorTargetRef->getTexture(0));
|
|
|
|
-
|
|
|
|
- GFX->pushActiveRenderTarget();
|
|
|
|
- GFX->setActiveRenderTarget(probeLightingTargetRef);
|
|
|
|
-
|
|
|
|
- GFX->setViewport(sceneColorTargetRef->getViewport());
|
|
|
|
-
|
|
|
|
- // Restore transforms
|
|
|
|
- MatrixSet &matrixSet = getRenderPass()->getMatrixSet();
|
|
|
|
- matrixSet.restoreSceneViewProjection();
|
|
|
|
-
|
|
|
|
- const MatrixF &worldToCameraXfm = matrixSet.getWorldToCamera();
|
|
|
|
-
|
|
|
|
- // Set up the SG Data
|
|
|
|
- SceneData sgData;
|
|
|
|
- sgData.init(state);
|
|
|
|
-
|
|
|
|
// Initialize and set the per-frame parameters after getting
|
|
// Initialize and set the per-frame parameters after getting
|
|
// the vector light material as we use lazy creation.
|
|
// the vector light material as we use lazy creation.
|
|
- _setupPerFrameParameters(state);
|
|
|
|
-
|
|
|
|
- //Order the probes by size, biggest to smallest
|
|
|
|
- //dQsort(ProbeRenderInst::all.address(), ProbeRenderInst::all.size(), sizeof(const ProbeRenderInst*), AscendingReflectProbeInfluence);
|
|
|
|
|
|
+ //_setupPerFrameParameters(state);
|
|
|
|
|
|
//Specular
|
|
//Specular
|
|
- PROFILE_START(RenderProbeManager_ReflectProbeRender);
|
|
|
|
-
|
|
|
|
- ReflectProbeMaterialInfo* reflProbeMat = getReflectProbeMaterial();
|
|
|
|
|
|
+ //PROFILE_START(RenderProbeManager_ReflectProbeRender);
|
|
|
|
|
|
- if (reflProbeMat == nullptr || reflProbeMat->matInstance == nullptr)
|
|
|
|
|
|
+ // If this is a non-diffuse pass or we have no objects to
|
|
|
|
+ // render then tell the effect to skip rendering.
|
|
|
|
+ if (!state->isDiffusePass()/* || binSize == 0*/|| !numProbesSC || !numProbesSC->isValid())
|
|
|
|
+ {
|
|
|
|
+ getProbeArrayEffect()->setSkip(true);
|
|
return;
|
|
return;
|
|
-
|
|
|
|
- MaterialParameters *matParams = reflProbeMat->matInstance->getMaterialParameters();
|
|
|
|
-
|
|
|
|
- MaterialParameterHandle *numProbesSC = reflProbeMat->matInstance->getMaterialParameterHandle("$numProbes");
|
|
|
|
-
|
|
|
|
- MaterialParameterHandle *probePositionSC = reflProbeMat->matInstance->getMaterialParameterHandle("$inProbePosArray");
|
|
|
|
- MaterialParameterHandle *probeWorldToObjSC = reflProbeMat->matInstance->getMaterialParameterHandle("$worldToObjArray");
|
|
|
|
- MaterialParameterHandle *probeBBMinSC = reflProbeMat->matInstance->getMaterialParameterHandle("$bbMinArray");
|
|
|
|
- MaterialParameterHandle *probeBBMaxSC = reflProbeMat->matInstance->getMaterialParameterHandle("$bbMaxArray");
|
|
|
|
- MaterialParameterHandle *probeUseSphereModeSC = reflProbeMat->matInstance->getMaterialParameterHandle("$useSphereMode");
|
|
|
|
- MaterialParameterHandle *probeRadiusSC = reflProbeMat->matInstance->getMaterialParameterHandle("$radius");
|
|
|
|
- MaterialParameterHandle *probeAttenuationSC = reflProbeMat->matInstance->getMaterialParameterHandle("$attenuation");
|
|
|
|
|
|
+ }
|
|
|
|
|
|
//Array rendering
|
|
//Array rendering
|
|
U32 probeCount = ProbeRenderInst::all.size();
|
|
U32 probeCount = ProbeRenderInst::all.size();
|
|
|
|
|
|
if (probeCount == 0)
|
|
if (probeCount == 0)
|
|
return;
|
|
return;
|
|
- MatrixF trans = MatrixF::Identity;
|
|
|
|
- sgData.objTrans = &trans;
|
|
|
|
-
|
|
|
|
- U32 effectiveProbeCount = 0;
|
|
|
|
|
|
|
|
- for (U32 i = 0; i < probeCount; i++)
|
|
|
|
|
|
+ if (mEffectiveProbeCount != 0)
|
|
{
|
|
{
|
|
- if (effectiveProbeCount >= MAXPROBECOUNT)
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
- ProbeRenderInst* curEntry = ProbeRenderInst::all[i];
|
|
|
|
- if (!curEntry->mIsEnabled)
|
|
|
|
- continue;
|
|
|
|
-
|
|
|
|
- if (curEntry->mCubemap.isNull() || curEntry->mIrradianceCubemap.isNull())
|
|
|
|
- continue;
|
|
|
|
-
|
|
|
|
- if (!curEntry->mCubemap->isInitialised())
|
|
|
|
- continue;
|
|
|
|
-
|
|
|
|
- if (curEntry->mIsSkylight)
|
|
|
|
- continue;
|
|
|
|
-
|
|
|
|
- //Setup
|
|
|
|
- const Point3F &probePos = curEntry->getPosition();
|
|
|
|
- probePositions[i] = probePos + curEntry->mProbePosOffset;
|
|
|
|
-
|
|
|
|
- MatrixF trans = curEntry->getTransform();
|
|
|
|
- trans.inverse();
|
|
|
|
-
|
|
|
|
- probeWorldToObj[i]=trans;
|
|
|
|
-
|
|
|
|
- probeBBMin[i] = curEntry->mBounds.minExtents;
|
|
|
|
- probeBBMax[i] = curEntry->mBounds.maxExtents;
|
|
|
|
-
|
|
|
|
- probeUseSphereMode[i] = curEntry->mProbeShapeType == ProbeRenderInst::Sphere ? 1 : 0;
|
|
|
|
-
|
|
|
|
- probeRadius[i] = curEntry->mRadius;
|
|
|
|
- probeAttenuation[i] = 1;
|
|
|
|
-
|
|
|
|
- cubeMaps[i] = curEntry->mCubemap;
|
|
|
|
- irradMaps[i] = curEntry->mIrradianceCubemap;
|
|
|
|
-
|
|
|
|
- effectiveProbeCount++;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (effectiveProbeCount != 0)
|
|
|
|
- {
|
|
|
|
- U32 count = effectiveProbeCount;
|
|
|
|
- matParams->setSafe(numProbesSC, (float)effectiveProbeCount);
|
|
|
|
-
|
|
|
|
- mCubemapArray = GFXCubemapArrayHandle(GFX->createCubemapArray());
|
|
|
|
- mIrradArray = GFXCubemapArrayHandle(GFX->createCubemapArray());
|
|
|
|
-
|
|
|
|
- mCubemapArray->initStatic(cubeMaps.address(), count);
|
|
|
|
- mIrradArray->initStatic(irradMaps.address(), count);
|
|
|
|
-
|
|
|
|
- NamedTexTarget *deferredTarget = NamedTexTarget::find(RenderDeferredMgr::BufferName);
|
|
|
|
|
|
+ //These will in theory be set by the postFX
|
|
|
|
+ /*NamedTexTarget *deferredTarget = NamedTexTarget::find(RenderDeferredMgr::BufferName);
|
|
if (deferredTarget)
|
|
if (deferredTarget)
|
|
GFX->setTexture(0, deferredTarget->getTexture());
|
|
GFX->setTexture(0, deferredTarget->getTexture());
|
|
else
|
|
else
|
|
@@ -776,7 +819,7 @@ void RenderProbeMgr::render( SceneRenderState *state )
|
|
if (matinfoTarget)
|
|
if (matinfoTarget)
|
|
GFX->setTexture(2, matinfoTarget->getTexture());
|
|
GFX->setTexture(2, matinfoTarget->getTexture());
|
|
else
|
|
else
|
|
- GFX->setTexture(2, NULL);
|
|
|
|
|
|
+ GFX->setTexture(2, NULL);*/
|
|
|
|
|
|
if (mBrdfTexture)
|
|
if (mBrdfTexture)
|
|
{
|
|
{
|
|
@@ -785,54 +828,33 @@ void RenderProbeMgr::render( SceneRenderState *state )
|
|
else
|
|
else
|
|
GFX->setTexture(3, NULL);
|
|
GFX->setTexture(3, NULL);
|
|
|
|
|
|
- //GFX->setCubeArrayTexture(4, mCubemapArray);
|
|
|
|
- //GFX->setCubeArrayTexture(5, mIrradArray);
|
|
|
|
|
|
+ GFX->setCubeArrayTexture(4, mCubemapArray);
|
|
|
|
+ GFX->setCubeArrayTexture(5, mIrradArray);
|
|
|
|
|
|
- ProbeRenderInst* curEntry = ProbeRenderInst::all[0];
|
|
|
|
- count = MAXPROBECOUNT;
|
|
|
|
- //Final packing
|
|
|
|
- AlignedArray<Point4F> _probePositions(count, sizeof(Point4F), (U8*)probePositions.address(), false);
|
|
|
|
- AlignedArray<Point4F> _probeBBMin(count, sizeof(Point4F), (U8*)probeBBMin.address(), false);
|
|
|
|
- AlignedArray<Point4F> _probeBBMax(count, sizeof(Point4F), (U8*)probeBBMax.address(), false);
|
|
|
|
- AlignedArray<float> _probeUseSphereMode(count, sizeof(float), (U8*)probeUseSphereMode.address(), false);
|
|
|
|
- AlignedArray<float> _probeRadius(count, sizeof(float), (U8*)probeRadius.address(), false);
|
|
|
|
- AlignedArray<float> _probeAttenuation(count, sizeof(float), (U8*)probeAttenuation.address(), false);
|
|
|
|
-
|
|
|
|
- matParams->set(probePositionSC, _probePositions);
|
|
|
|
- matParams->set(probeWorldToObjSC, probeWorldToObj.address(), count);
|
|
|
|
- matParams->set(probeBBMinSC, _probeBBMin);
|
|
|
|
- matParams->set(probeBBMaxSC, _probeBBMax);
|
|
|
|
- matParams->set(probeUseSphereModeSC, _probeUseSphereMode);
|
|
|
|
- matParams->set(probeRadiusSC, _probeRadius);
|
|
|
|
- matParams->set(probeAttenuationSC, _probeAttenuation);
|
|
|
|
-
|
|
|
|
- // Set geometry
|
|
|
|
- GFX->setVertexBuffer(mFarFrustumQuadVerts);
|
|
|
|
- GFX->setPrimitiveBuffer(NULL);
|
|
|
|
-
|
|
|
|
- while (reflProbeMat->matInstance->setupPass(state, sgData))
|
|
|
|
|
|
+ if (numProbesSC->isValid())
|
|
{
|
|
{
|
|
- // Set transforms
|
|
|
|
- matrixSet.setWorld(*sgData.objTrans);
|
|
|
|
- reflProbeMat->matInstance->setTransforms(matrixSet, state);
|
|
|
|
- reflProbeMat->matInstance->setSceneInfo(state, sgData);
|
|
|
|
|
|
+ mLastConstants->set(numProbesSC, (float)mEffectiveProbeCount);
|
|
|
|
+
|
|
|
|
+ mLastConstants->set(probePositionSC, mProbePositions);
|
|
|
|
|
|
- GFX->drawPrimitive(GFXTriangleStrip, 0, 2);
|
|
|
|
|
|
+ mLastConstants->set(probePositionSC, mProbePositions);
|
|
|
|
+ mLastConstants->set(probeWorldToObjSC, probeWorldToObj.address(), mEffectiveProbeCount);
|
|
|
|
+ mLastConstants->set(probeBBMinSC, mProbeBBMin);
|
|
|
|
+ mLastConstants->set(probeBBMaxSC, mProbeBBMax);
|
|
|
|
+ mLastConstants->set(probeUseSphereModeSC, mProbeUseSphereMode);
|
|
|
|
+ mLastConstants->set(probeRadiusSC, mProbeRadius);
|
|
|
|
+ mLastConstants->set(probeAttenuationSC, mProbeAttenuation);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- GFX->popActiveRenderTarget();
|
|
|
|
-
|
|
|
|
- //PROBEMGR->unregisterAllProbes();
|
|
|
|
- //PROBEMGR->mRegisteredProbes.clear();
|
|
|
|
-
|
|
|
|
- PROFILE_END();
|
|
|
|
|
|
+ // Finish up.
|
|
|
|
+ //if (isRenderingToTarget)
|
|
|
|
+ // _onPostRender();
|
|
|
|
|
|
- GFX->setVertexBuffer(NULL);
|
|
|
|
- GFX->setPrimitiveBuffer(NULL);
|
|
|
|
|
|
+ // Make sure the effect is gonna render.
|
|
|
|
+ getProbeArrayEffect()->setSkip(false);
|
|
|
|
|
|
- // Fire off a signal to let others know that light-bin rendering is ending now
|
|
|
|
- //getRenderSignal().trigger(state, this);
|
|
|
|
|
|
+ //PROFILE_END();
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
//
|