Ver Fonte

WIP of forward probe scoring.

Areloch há 6 anos atrás
pai
commit
bd170b5abe
1 ficheiros alterados com 38 adições e 13 exclusões
  1. 38 13
      Engine/source/renderInstance/renderProbeMgr.cpp

+ 38 - 13
Engine/source/renderInstance/renderProbeMgr.cpp

@@ -653,12 +653,14 @@ void RenderProbeMgr::_update4ProbeConsts(const SceneData &sgData,
       //irradMaps.clear();
       //irradMaps.clear();
       //Vector<U32> cubemapIdxes;
       //Vector<U32> cubemapIdxes;
 
 
+      S8 bestPickProbes[4] = { -1,-1,-1,-1 };
+
       U32 effectiveProbeCount = 0;
       U32 effectiveProbeCount = 0;
       bool hasSkylight = false;
       bool hasSkylight = false;
       for (U32 i = 0; i < probeCount; i++)
       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];
          const ProbeRenderInst& curEntry = *ProbeRenderInst::all[i];
          if (!curEntry.mIsEnabled)
          if (!curEntry.mIsEnabled)
@@ -678,20 +680,43 @@ void RenderProbeMgr::_update4ProbeConsts(const SceneData &sgData,
          }*/
          }*/
          if (!curEntry.mIsSkylight)
          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);
-
-            effectiveProbeCount++;
+            F32 dist = Point3F(sgData.objTrans->getPosition() - curEntry.getPosition()).len();
+
+            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->mProbeCountSC, (float)effectiveProbeCount);
 
 
       shaderConsts->setSafe(probeShaderConsts->mProbePositionSC, probePositionArray);
       shaderConsts->setSafe(probeShaderConsts->mProbePositionSC, probePositionArray);