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

This commit is contained in:
Areloch 2019-02-13 00:37:50 -06:00
parent 34abe1b835
commit b0c89dddff
2 changed files with 29 additions and 95 deletions

View file

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

View file

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