From 4aa371cea27e633a4e76eaf3208978e6de913711 Mon Sep 17 00:00:00 2001 From: Azaezel Date: Thu, 7 Feb 2019 08:05:39 -0600 Subject: [PATCH] remove push_back uses in favor of consistent [i], fill probe data with defaults before overriding to ensure no garbage data is getting referenced. --- .../source/renderInstance/renderProbeMgr.cpp | 64 ++++++++++++------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/Engine/source/renderInstance/renderProbeMgr.cpp b/Engine/source/renderInstance/renderProbeMgr.cpp index e74e985b1..8526ebdce 100644 --- a/Engine/source/renderInstance/renderProbeMgr.cpp +++ b/Engine/source/renderInstance/renderProbeMgr.cpp @@ -670,18 +670,36 @@ void RenderProbeMgr::render( SceneRenderState *state ) Vector probeUseSphereMode; Vector probeRadius; Vector probeAttenuation; - - probePositions.setSize(MAXPROBECOUNT); - probeWorldToObj.setSize(MAXPROBECOUNT); - probeBBMin.setSize(MAXPROBECOUNT); - probeBBMax.setSize(MAXPROBECOUNT); - probeUseSphereMode.setSize(MAXPROBECOUNT); - probeRadius.setSize(MAXPROBECOUNT); - probeAttenuation.setSize(MAXPROBECOUNT); - Vector cubeMaps; Vector irradMaps; + probePositions.setSize(MAXPROBECOUNT); + probePositions.fill(Point3F::Zero); + + probeWorldToObj.setSize(MAXPROBECOUNT); + probeWorldToObj.fill(MatrixF::Identity); + + probeBBMin.setSize(MAXPROBECOUNT); + probeBBMin.fill(Point3F::Zero); + + probeBBMax.setSize(MAXPROBECOUNT); + probeBBMax.fill(Point3F::Zero); + + probeUseSphereMode.setSize(MAXPROBECOUNT); + probeUseSphereMode.fill(0.0f); + + probeRadius.setSize(MAXPROBECOUNT); + probeRadius.fill(0.0f); + + probeAttenuation.setSize(MAXPROBECOUNT); + probeAttenuation.fill(0.0f); + + cubeMaps.setSize(MAXPROBECOUNT); + cubeMaps.fill(NULL); + + irradMaps.setSize(MAXPROBECOUNT); + irradMaps.fill(NULL); + U32 effectiveProbeCount = 0; for (U32 i = 0; i < probeCount; i++) @@ -709,7 +727,7 @@ void RenderProbeMgr::render( SceneRenderState *state ) MatrixF trans = curEntry->getTransform(); trans.inverse(); - probeWorldToObj.push_back(trans); + probeWorldToObj[i]=trans; probeBBMin[i] = curEntry->mBounds.minExtents; probeBBMax[i] = curEntry->mBounds.maxExtents; @@ -719,14 +737,15 @@ void RenderProbeMgr::render( SceneRenderState *state ) probeRadius[i] = curEntry->mRadius; probeAttenuation[i] = 1; - cubeMaps.push_back(curEntry->mCubemap); - irradMaps.push_back(curEntry->mIrradianceCubemap); + cubeMaps[i] = curEntry->mCubemap; + irradMaps[i] = curEntry->mIrradianceCubemap; effectiveProbeCount++; } if (effectiveProbeCount != 0) { + U32 count = effectiveProbeCount; matParams->setSafe(numProbesSC, (float)effectiveProbeCount); GFXCubemapArrayHandle mCubemapArray; @@ -735,8 +754,8 @@ void RenderProbeMgr::render( SceneRenderState *state ) GFXCubemapArrayHandle mIrradArray; mIrradArray = GFXCubemapArrayHandle(GFX->createCubemapArray()); - mCubemapArray->initStatic(cubeMaps.address(), cubeMaps.size()); - mIrradArray->initStatic(irradMaps.address(), irradMaps.size()); + mCubemapArray->initStatic(cubeMaps.address(), count); + mIrradArray->initStatic(irradMaps.address(), count); NamedTexTarget *deferredTarget = NamedTexTarget::find(RenderDeferredMgr::BufferName); if (deferredTarget) @@ -766,16 +785,17 @@ void RenderProbeMgr::render( SceneRenderState *state ) GFX->setCubeArrayTexture(4, mCubemapArray); GFX->setCubeArrayTexture(5, mIrradArray); - //Final packing - AlignedArray _probePositions(effectiveProbeCount, sizeof(Point4F), (U8*)probePositions.address(), false); - AlignedArray _probeBBMin(effectiveProbeCount, sizeof(Point4F), (U8*)probeBBMin.address(), false); - AlignedArray _probeBBMax(effectiveProbeCount, sizeof(Point4F), (U8*)probeBBMax.address(), false); - AlignedArray _probeUseSphereMode(effectiveProbeCount, sizeof(float), (U8*)probeUseSphereMode.address(), false); - AlignedArray _probeRadius(effectiveProbeCount, sizeof(float), (U8*)probeRadius.address(), false); - AlignedArray _probeAttenuation(effectiveProbeCount, sizeof(float), (U8*)probeAttenuation.address(), false); + + //Final packing + AlignedArray _probePositions(count, sizeof(Point4F), (U8*)probePositions.address(), false); + AlignedArray _probeBBMin(count, sizeof(Point4F), (U8*)probeBBMin.address(), false); + AlignedArray _probeBBMax(count, sizeof(Point4F), (U8*)probeBBMax.address(), false); + AlignedArray _probeUseSphereMode(count, sizeof(float), (U8*)probeUseSphereMode.address(), false); + AlignedArray _probeRadius(count, sizeof(float), (U8*)probeRadius.address(), false); + AlignedArray _probeAttenuation(count, sizeof(float), (U8*)probeAttenuation.address(), false); matParams->set(probePositionSC, _probePositions); - matParams->set(probeWorldToObjSC, probeWorldToObj.address(), effectiveProbeCount); + matParams->set(probeWorldToObjSC, probeWorldToObj.address(), count); matParams->set(probeBBMinSC, _probeBBMin); matParams->set(probeBBMaxSC, _probeBBMax); matParams->set(probeUseSphereModeSC, _probeUseSphereMode);