mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-14 16:14:38 +00:00
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:
parent
34abe1b835
commit
b0c89dddff
2 changed files with 29 additions and 95 deletions
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue