THIS IS AN ABOMINATION UNTO THE CODEBASE AND SHOULD BE REMOVED THE SECOND WE CAN SORT OUT WHAT THE HECK IS GOING ON WITH THAT QSORT

stops flickering by itterating through the probe list twice. once looking for the skylight, then doing the rest
This commit is contained in:
Azaezel 2018-11-28 18:12:12 -06:00
parent 18a02516d1
commit f50ab7ec58

View file

@ -222,7 +222,7 @@ void RenderProbeMgr::render( SceneRenderState *state )
_setupPerFrameParameters(state); _setupPerFrameParameters(state);
//Order the probes by size, biggest to smallest //Order the probes by size, biggest to smallest
dQsort(ProbeRenderInst::all.address(), ProbeRenderInst::all.size(), sizeof(const ProbeRenderInst*), AscendingReflectProbeInfluence); //dQsort(ProbeRenderInst::all.address(), ProbeRenderInst::all.size(), sizeof(const ProbeRenderInst*), AscendingReflectProbeInfluence);
//Specular //Specular
PROFILE_START(RenderProbeManager_ReflectProbeRender); PROFILE_START(RenderProbeManager_ReflectProbeRender);
@ -232,68 +232,85 @@ void RenderProbeMgr::render( SceneRenderState *state )
for (U32 i = 0; i < ProbeRenderInst::all.size(); i++) for (U32 i = 0; i < ProbeRenderInst::all.size(); i++)
{ {
ProbeRenderInst* curEntry = ProbeRenderInst::all[i]; ProbeRenderInst* curEntry = ProbeRenderInst::all[i];
if (!curEntry->mIsEnabled) if (!curEntry->mIsEnabled)
continue; continue;
if (curEntry->numPrims == 0) if (curEntry->numPrims == 0)
continue; continue;
if (curEntry->mIsSkylight && (!skylightMat || !skylightMat->matInstance)) if (curEntry->mIsSkylight && (!skylightMat || !skylightMat->matInstance))
continue; continue;
if (!curEntry->mIsSkylight && (!reflProbeMat || !reflProbeMat->matInstance)) if (!curEntry->mIsSkylight && (!reflProbeMat || !reflProbeMat->matInstance))
break; break;
//Setup if (curEntry->mIsSkylight)
MatrixF probeTrans = curEntry->getTransform(); {
//Setup
MatrixF probeTrans = curEntry->getTransform();
if (!curEntry->mIsSkylight) // Set geometry
{ GFX->setVertexBuffer(curEntry->vertBuffer);
if (curEntry->mProbeShapeType == ProbeRenderInst::Sphere) GFX->setPrimitiveBuffer(curEntry->primBuffer);
probeTrans.scale(curEntry->mRadius * 1.01f); probeTrans.scale(10); //force it to be big enough to surround the camera
} sgData.objTrans = &probeTrans;
else skylightMat->setProbeParameters(curEntry, state, worldToCameraXfm);
{
probeTrans.scale(10); //force it to be big enough to surround the camera
}
sgData.objTrans = &probeTrans; while (skylightMat->matInstance->setupPass(state, sgData))
{
// Set transforms
matrixSet.setWorld(*sgData.objTrans);
skylightMat->matInstance->setTransforms(matrixSet, state);
skylightMat->matInstance->setSceneInfo(state, sgData);
if(curEntry->mIsSkylight) GFX->drawPrimitive(GFXTriangleList, 0, curEntry->numPrims);
skylightMat->setProbeParameters(curEntry, state, worldToCameraXfm); }
else }
reflProbeMat->setProbeParameters(curEntry, state, worldToCameraXfm); }
// Set geometry for (U32 i = 0; i < ProbeRenderInst::all.size(); i++)
GFX->setVertexBuffer(curEntry->vertBuffer); {
GFX->setPrimitiveBuffer(curEntry->primBuffer); ProbeRenderInst* curEntry = ProbeRenderInst::all[i];
if (curEntry->mIsSkylight) if (!curEntry->mIsEnabled)
{ continue;
while (skylightMat->matInstance->setupPass(state, sgData))
{
// Set transforms
matrixSet.setWorld(*sgData.objTrans);
skylightMat->matInstance->setTransforms(matrixSet, state);
skylightMat->matInstance->setSceneInfo(state, sgData);
GFX->drawPrimitive(GFXTriangleList, 0, curEntry->numPrims); if (curEntry->numPrims == 0)
} continue;
}
else
{
while (reflProbeMat->matInstance->setupPass(state, sgData))
{
// Set transforms
matrixSet.setWorld(*sgData.objTrans);
reflProbeMat->matInstance->setTransforms(matrixSet, state);
reflProbeMat->matInstance->setSceneInfo(state, sgData);
GFX->drawPrimitive(GFXTriangleList, 0, curEntry->numPrims); if (curEntry->mIsSkylight && (!skylightMat || !skylightMat->matInstance))
} continue;
}
if (!curEntry->mIsSkylight && (!reflProbeMat || !reflProbeMat->matInstance))
break;
//Setup
MatrixF probeTrans = curEntry->getTransform();
if (!curEntry->mIsSkylight)
{
if (curEntry->mProbeShapeType == ProbeRenderInst::Sphere)
probeTrans.scale(curEntry->mRadius * 1.01f);
sgData.objTrans = &probeTrans;
reflProbeMat->setProbeParameters(curEntry, state, worldToCameraXfm);
// Set geometry
GFX->setVertexBuffer(curEntry->vertBuffer);
GFX->setPrimitiveBuffer(curEntry->primBuffer);
while (reflProbeMat->matInstance->setupPass(state, sgData))
{
// Set transforms
matrixSet.setWorld(*sgData.objTrans);
reflProbeMat->matInstance->setTransforms(matrixSet, state);
reflProbeMat->matInstance->setSceneInfo(state, sgData);
GFX->drawPrimitive(GFXTriangleList, 0, curEntry->numPrims);
}
}
} }
GFX->popActiveRenderTarget(); GFX->popActiveRenderTarget();