diff --git a/Engine/source/renderInstance/renderProbeMgr.cpp b/Engine/source/renderInstance/renderProbeMgr.cpp index 077a3df9d..f291ea2c4 100644 --- a/Engine/source/renderInstance/renderProbeMgr.cpp +++ b/Engine/source/renderInstance/renderProbeMgr.cpp @@ -653,12 +653,14 @@ void RenderProbeMgr::_update4ProbeConsts(const SceneData &sgData, //irradMaps.clear(); //Vector cubemapIdxes; + S8 bestPickProbes[4] = { -1,-1,-1,-1 }; + U32 effectiveProbeCount = 0; bool hasSkylight = false; for (U32 i = 0; i < probeCount; i++) { - if (effectiveProbeCount >= MAX_FORWARD_PROBES) - break; + //if (effectiveProbeCount >= MAX_FORWARD_PROBES) + // break; const ProbeRenderInst& curEntry = *ProbeRenderInst::all[i]; if (!curEntry.mIsEnabled) @@ -678,20 +680,43 @@ void RenderProbeMgr::_update4ProbeConsts(const SceneData &sgData, }*/ if (!curEntry.mIsSkylight) { - probePositionArray[effectiveProbeCount] = curEntry.getPosition(); - probeRefPositionArray[effectiveProbeCount] = curEntry.mProbeRefOffset; - probeWorldToObjArray[effectiveProbeCount] = curEntry.getTransform(); - probeBoxMinArray[effectiveProbeCount] = curEntry.mBounds.minExtents; - probeBoxMaxArray[effectiveProbeCount] = curEntry.mBounds.maxExtents; - probeConfigArray[effectiveProbeCount] = Point4F(curEntry.mProbeShapeType, - curEntry.mRadius, - curEntry.mAtten, - curEntry.mCubemapIndex); + F32 dist = Point3F(sgData.objTrans->getPosition() - curEntry.getPosition()).len(); - effectiveProbeCount++; + if (dist > curEntry.mRadius || dist > curEntry.mExtents.len()) + continue; + + if(bestPickProbes[0] == -1 || (Point3F(sgData.objTrans->getPosition() - ProbeRenderInst::all[bestPickProbes[0]]->mPosition).len() > dist)) + bestPickProbes[0] = i; + else if (bestPickProbes[1] == -1 || (Point3F(sgData.objTrans->getPosition() - ProbeRenderInst::all[bestPickProbes[1]]->mPosition).len() > dist)) + bestPickProbes[1] = i; + else if (bestPickProbes[2] == -1 || (Point3F(sgData.objTrans->getPosition() - ProbeRenderInst::all[bestPickProbes[2]]->mPosition).len() > dist)) + bestPickProbes[2] = i; + else if (bestPickProbes[3] == -1 || (Point3F(sgData.objTrans->getPosition() - ProbeRenderInst::all[bestPickProbes[3]]->mPosition).len() > dist)) + bestPickProbes[3] = i; } } + //Grab our best probe picks + for (U32 i = 0; i < 4; i++) + { + if (bestPickProbes[i] == -1) + continue; + + const ProbeRenderInst& curEntry = *ProbeRenderInst::all[bestPickProbes[i]]; + + probePositionArray[effectiveProbeCount] = curEntry.getPosition(); + probeRefPositionArray[effectiveProbeCount] = curEntry.mProbeRefOffset; + probeWorldToObjArray[effectiveProbeCount] = curEntry.getTransform(); + probeBoxMinArray[effectiveProbeCount] = curEntry.mBounds.minExtents; + probeBoxMaxArray[effectiveProbeCount] = curEntry.mBounds.maxExtents; + probeConfigArray[effectiveProbeCount] = Point4F(curEntry.mProbeShapeType, + curEntry.mRadius, + curEntry.mAtten, + curEntry.mCubemapIndex); + + effectiveProbeCount++; + } + shaderConsts->setSafe(probeShaderConsts->mProbeCountSC, (float)effectiveProbeCount); shaderConsts->setSafe(probeShaderConsts->mProbePositionSC, probePositionArray);