Browse Source

WIP of adjusting the reflection probe's bake to utilize the ReflectionManager and CubeReflector instead of duplicating the capture code.

Areloch 6 years ago
parent
commit
050f1e226a

+ 27 - 94
Engine/source/T3D/lighting/reflectionProbe.cpp

@@ -51,6 +51,8 @@
 #include "gfx/gfxTextureManager.h"
 #include "T3D/lighting/IBLUtilities.h"
 
+#include "scene/reflector.h"
+
 extern bool gEditingMission;
 extern ColorI gCanvasClearColor;
 bool ReflectionProbe::smRenderPreviewProbes = true;
@@ -584,6 +586,8 @@ void ReflectionProbe::updateMaterial()
 
    if (mReflectionModeType != DynamicCubemap)
    {
+      mProbeInfo->mCubeReflector.unregisterReflector();
+
       if ((mReflectionModeType == BakedCubemap) && !mProbeUniqueID.isEmpty())
       {
          if (mPrefilterMap != nullptr && mPrefilterMap->mCubemap.isValid())
@@ -609,6 +613,8 @@ void ReflectionProbe::updateMaterial()
       if (mReflectionModeType == DynamicCubemap && !mDynamicCubemap.isNull())
       {
          mProbeInfo->mCubemap = mDynamicCubemap;
+
+         mProbeInfo->mCubeReflector.registerReflector(this, reflectorDesc); //need to decide how we wanna do the reflectorDesc. static name or a field
       }
       else
       {
@@ -904,17 +910,6 @@ void ReflectionProbe::bake(String outputPath, S32 resolution, bool renderWithPro
 
    U32 startMSTime = Platform::getRealMilliseconds();
 
-   /*PostEffect *preCapture = dynamic_cast<PostEffect*>(Sim::findObject("AL_PreCapture"));
-   PostEffect *deferredShading = dynamic_cast<PostEffect*>(Sim::findObject("AL_DeferredShading"));
-   if (preCapture)
-   {
-	   preCapture->setShaderConst("$radius",String::ToString(mRadius));
-	   preCapture->setShaderConst("$captureRez", String::ToString(F32(resolution)));
-	   preCapture->enable();
-   }
-   if (deferredShading)
-      deferredShading->disable();*/
-
    GFXCubemapHandle sceneCaptureCubemap;
 
    if (mReflectionModeType == DynamicCubemap && mDynamicCubemap.isNull())
@@ -968,91 +963,34 @@ void ReflectionProbe::bake(String outputPath, S32 resolution, bool renderWithPro
    if (!renderWithProbes)
       RenderProbeMgr::smRenderReflectionProbes = false;
 
-   for (U32 i = 0; i < 6; ++i)
-   {
-      GFXTexHandle blendTex;
-      blendTex.set(resolution, resolution, GFXFormatR16G16B16A16F, &GFXRenderTargetProfile, "");
-
-      GFXTextureTargetRef baseTarget = GFX->allocRenderToTextureTarget();
-
-      GFX->clearTextureStateImmediate(0);
-      
-      baseTarget->attachTexture(GFXTextureTarget::Color0, sceneCaptureCubemap, i);
-
-      // Standard view that will be overridden below.
-      VectorF vLookatPt(0.0f, 0.0f, 0.0f), vUpVec(0.0f, 0.0f, 0.0f), vRight(0.0f, 0.0f, 0.0f);
-
-      switch (i)
-      {
-         case 0: // D3DCUBEMAP_FACE_POSITIVE_X:
-            vLookatPt = VectorF(1.0f, 0.0f, 0.0f);
-            vUpVec = VectorF(0.0f, 1.0f, 0.0f);
-            break;
-         case 1: // D3DCUBEMAP_FACE_NEGATIVE_X:
-            vLookatPt = VectorF(-1.0f, 0.0f, 0.0f);
-            vUpVec = VectorF(0.0f, 1.0f, 0.0f);
-            break;
-         case 2: // D3DCUBEMAP_FACE_POSITIVE_Y:
-            vLookatPt = VectorF(0.0f, 1.0f, 0.0f);
-            vUpVec = VectorF(0.0f, 0.0f, -1.0f);
-            break;
-         case 3: // D3DCUBEMAP_FACE_NEGATIVE_Y:
-            vLookatPt = VectorF(0.0f, -1.0f, 0.0f);
-            vUpVec = VectorF(0.0f, 0.0f, 1.0f);
-            break;
-         case 4: // D3DCUBEMAP_FACE_POSITIVE_Z:
-            vLookatPt = VectorF(0.0f, 0.0f, 1.0f);
-            vUpVec = VectorF(0.0f, 1.0f, 0.0f);
-            break;
-         case 5: // D3DCUBEMAP_FACE_NEGATIVE_Z:
-            vLookatPt = VectorF(0.0f, 0.0f, -1.0f);
-            vUpVec = VectorF(0.0f, 1.0f, 0.0f);
-            break;
-      }
-
-      // create camera matrix
-      VectorF cross = mCross(vUpVec, vLookatPt);
-      cross.normalizeSafe();
+   CubeReflector cubeRefl;
+   ReflectParams reflParams;
 
-      MatrixF matView(true);
-      matView.setColumn(0, cross);
-      matView.setColumn(1, vLookatPt);
-      matView.setColumn(2, vUpVec);
-      matView.setPosition(getPosition()+mProbePosOffset);
-      matView.inverse();
+   //need to get the query somehow. Likely do some sort of get function to fetch from the guiTSControl that's active
+   CameraQuery query; //need to get the last cameraQuery
 
-      // set projection to 90 degrees vertical and horizontal
-      F32 left, right, top, bottom;
-      F32 nearPlane = 0.01f;
-      F32 farDist = 1000.f;
+   Frustum culler;
+   culler.set(false,
+      query.fov,
+      (F32)resolution / (F32)resolution,
+      query.nearPlane,
+      query.farPlane,
+      query.cameraMatrix);
 
-      MathUtils::makeFrustum(&left, &right, &top, &bottom, M_HALFPI_F, 1.0f, nearPlane);
-      Frustum frustum(false, left, right, top, bottom, nearPlane, farDist);
+   S32 stereoTarget = GFX->getCurrentStereoTarget();
 
-      F32 detailAdjustBackup = TSShapeInstance::smDetailAdjust;
-      TSShapeInstance::smDetailAdjust *= getNextPow2(resolution);
-      renderFrame(&baseTarget, matView, frustum, mCaptureMask & EDITOR_RENDER_TYPEMASK, gCanvasClearColor);
-      TSShapeInstance::smDetailAdjust = detailAdjustBackup;
+   reflParams.culler = culler;
+   reflParams.eyeId = stereoTarget;
+   reflParams.query = &query;
+   reflParams.startOfUpdateMs = startMSTime;
+   reflParams.viewportExtent = Point2I(resolution, resolution);
 
-      baseTarget->resolve();
-   }
-
-   if (sceneCaptureCubemap.isValid())
-   {
-      validCubemap = true;
-      mDirty = false;
-   }
-   else
-   {
-      validCubemap = false;
-   }
+   cubeRefl.updateReflection(reflParams);
 
    //Now, save out the maps
    //create irridiance cubemap
-   if (validCubemap)
+   if (cubeRefl.getCubemap())
    {
-      bool se = isServerObject();
-
       //Just to ensure we're prepped for the generation
       createClientResources();
 
@@ -1073,8 +1011,8 @@ void ReflectionProbe::bake(String outputPath, S32 resolution, bool renderWithPro
 
       GFXTextureTargetRef renderTarget = GFX->allocRenderToTextureTarget(false);
 
-      IBLUtilities::GenerateIrradianceMap(renderTarget, sceneCaptureCubemap, mIrridianceMap->mCubemap);
-      IBLUtilities::GeneratePrefilterMap(renderTarget, sceneCaptureCubemap, mPrefilterMipLevels, mPrefilterMap->mCubemap);
+      IBLUtilities::GenerateIrradianceMap(renderTarget, cubeRefl.getCubemap(), mIrridianceMap->mCubemap);
+      IBLUtilities::GeneratePrefilterMap(renderTarget, cubeRefl.getCubemap(), mPrefilterMipLevels, mPrefilterMap->mCubemap);
 
       IBLUtilities::SaveCubeMap(getIrradianceMapPath(), mIrridianceMap->mCubemap);
       IBLUtilities::SaveCubeMap(getPrefilterMapPath(), mPrefilterMap->mCubemap);
@@ -1089,11 +1027,6 @@ void ReflectionProbe::bake(String outputPath, S32 resolution, bool renderWithPro
 
    setMaskBits(-1);
 
-   /*if (preCapture)
-      preCapture->disable();
-   if (deferredShading)
-      deferredShading->enable();*/
-
    U32 endMSTime = Platform::getRealMilliseconds();
    F32 diffTime = F32(endMSTime - startMSTime);
 

+ 2 - 1
Engine/source/renderInstance/renderProbeMgr.h

@@ -67,9 +67,10 @@ struct ProbeRenderInst : public SystemInterface<ProbeRenderInst>
    Point3F mProbePosOffset;
 
    GFXCubemapHandle mCubemap;
-
    GFXCubemapHandle mIrradianceCubemap;
 
+   CubeReflector mCubeReflector;
+
    GFXTexHandle *mBRDFTexture;
 
    /// The priority of this light used for