From 5b7e2edb66461e3a4e3163b5b15cba399ebb4f25 Mon Sep 17 00:00:00 2001 From: Areloch Date: Mon, 21 Jan 2019 01:50:13 -0600 Subject: [PATCH] WIP hook-in of the cubemap array. Also inversed probe transforms to make them correct. --- .../source/T3D/lighting/reflectionProbe.cpp | 10 +++--- Engine/source/lighting/probeManager.cpp | 26 +++++++------- Engine/source/lighting/probeManager.h | 4 +-- .../source/renderInstance/renderProbeMgr.cpp | 35 +++++++++++++++++-- 4 files changed, 53 insertions(+), 22 deletions(-) diff --git a/Engine/source/T3D/lighting/reflectionProbe.cpp b/Engine/source/T3D/lighting/reflectionProbe.cpp index 3214a867f..b3bad1bb6 100644 --- a/Engine/source/T3D/lighting/reflectionProbe.cpp +++ b/Engine/source/T3D/lighting/reflectionProbe.cpp @@ -574,8 +574,8 @@ void ReflectionProbe::processStaticCubemap() IBLUtilities::SaveCubeMap(getPrefilterMapPath(), mPrefilterMap->mCubemap); } - mProbeInfo->mCubemap = &mPrefilterMap->mCubemap; - mProbeInfo->mIrradianceCubemap = &mIrridianceMap->mCubemap; + mProbeInfo->mCubemap = mPrefilterMap->mCubemap; + mProbeInfo->mIrradianceCubemap = mIrridianceMap->mCubemap; } void ReflectionProbe::updateMaterial() @@ -588,17 +588,17 @@ void ReflectionProbe::updateMaterial() { if (mPrefilterMap != nullptr && mPrefilterMap->mCubemap.isValid()) { - mProbeInfo->mCubemap = &mPrefilterMap->mCubemap; + mProbeInfo->mCubemap = mPrefilterMap->mCubemap; } if (mIrridianceMap != nullptr && mIrridianceMap->mCubemap.isValid()) { - mProbeInfo->mIrradianceCubemap = &mIrridianceMap->mCubemap; + mProbeInfo->mIrradianceCubemap = mIrridianceMap->mCubemap; } } } else if (mReflectionModeType == DynamicCubemap && !mDynamicCubemap.isNull()) { - mProbeInfo->mCubemap = &mDynamicCubemap; + mProbeInfo->mCubemap = mDynamicCubemap; } if (mBrdfTexture.isValid()) diff --git a/Engine/source/lighting/probeManager.cpp b/Engine/source/lighting/probeManager.cpp index f9c3c6b6a..757abb5b9 100644 --- a/Engine/source/lighting/probeManager.cpp +++ b/Engine/source/lighting/probeManager.cpp @@ -71,13 +71,13 @@ ProbeRenderInst::ProbeRenderInst() : SystemInterface(), ProbeRenderInst::~ProbeRenderInst() { - if (mCubemap && mCubemap->isValid()) + if (mCubemap && mCubemap.isValid()) { - mCubemap->free(); + mCubemap.free(); } - if (mIrradianceCubemap && mIrradianceCubemap->isValid()) + if (mIrradianceCubemap && mIrradianceCubemap.isValid()) { - mIrradianceCubemap->free(); + mIrradianceCubemap.free(); } if (mBRDFTexture && mBRDFTexture->isValid()) { @@ -387,12 +387,12 @@ void ProbeManager::_update4ProbeConsts( const SceneData &sgData, probeLocalPositions[i].y = localProbePos.y; probeLocalPositions[i].z = localProbePos.z; - if (probe->mCubemap && !probe->mCubemap->isNull()) + if (probe->mCubemap && !probe->mCubemap.isNull()) { S32 samplerReg = probeCubemapSC->getSamplerRegister(); if(samplerReg != -1) - GFX->setCubeTexture(samplerReg + i, probe->mCubemap->getPointer()); + GFX->setCubeTexture(samplerReg + i, probe->mCubemap.getPointer()); } } @@ -410,9 +410,9 @@ void ProbeManager::_update4ProbeConsts( const SceneData &sgData, } else { - /*if (probe->mCubemap && !probe->mCubemap->isNull()) + /*if (probe->mCubemap && !probe->mCubemap.isNull()) { - GFX->setCubeTexture(1, probe->mCubemap->getPointer()); + GFX->setCubeTexture(1, probe->mCubemap.getPointer()); }*/ if (probeCubemapSC->isValid()) { @@ -1007,21 +1007,21 @@ void ProbeManager::ReflectProbeMaterialInfo::setProbeParameters(const ProbeRende GFX->setTexture(2, matInfoTexTarget->getTexture()); //Add some safety catches in the event the cubemaps aren't fully initialized yet - if (probeInfo->mCubemap == nullptr || probeInfo->mCubemap->isNull()) + if (probeInfo->mCubemap == nullptr || probeInfo->mCubemap.isNull()) { GFX->setCubeTexture(3, nullptr); matParams->setSafe(cubeMips, 2.0f); } else { - GFX->setCubeTexture(3, probeInfo->mCubemap->getPointer()); - matParams->setSafe(cubeMips, mPow(probeInfo->mCubemap->getPointer()->getMipMapLevels(), 2.0f)); + GFX->setCubeTexture(3, probeInfo->mCubemap.getPointer()); + matParams->setSafe(cubeMips, mPow(probeInfo->mCubemap.getPointer()->getMipMapLevels(), 2.0f)); } - if (probeInfo->mIrradianceCubemap == nullptr || probeInfo->mIrradianceCubemap->isNull()) + if (probeInfo->mIrradianceCubemap == nullptr || probeInfo->mIrradianceCubemap.isNull()) GFX->setCubeTexture(4, nullptr); else - GFX->setCubeTexture(4, probeInfo->mIrradianceCubemap->getPointer()); + GFX->setCubeTexture(4, probeInfo->mIrradianceCubemap.getPointer()); GFX->setTexture(5, probeInfo->mBRDFTexture->getPointer()); diff --git a/Engine/source/lighting/probeManager.h b/Engine/source/lighting/probeManager.h index 4996a379c..a9ef9b84a 100644 --- a/Engine/source/lighting/probeManager.h +++ b/Engine/source/lighting/probeManager.h @@ -88,9 +88,9 @@ struct ProbeRenderInst : public SystemInterface Box3F mBounds; Point3F mProbePosOffset; - GFXCubemapHandle *mCubemap; + GFXCubemapHandle mCubemap; - GFXCubemapHandle *mIrradianceCubemap; + GFXCubemapHandle mIrradianceCubemap; GFXTexHandle *mBRDFTexture; diff --git a/Engine/source/renderInstance/renderProbeMgr.cpp b/Engine/source/renderInstance/renderProbeMgr.cpp index eaf718915..6382e9fd4 100644 --- a/Engine/source/renderInstance/renderProbeMgr.cpp +++ b/Engine/source/renderInstance/renderProbeMgr.cpp @@ -318,12 +318,14 @@ void RenderProbeMgr::render( SceneRenderState *state ) dMemset(probeRadius.getBuffer(), 0, probeRadius.getBufferSize()); dMemset(probeAttenuation.getBuffer(), 0, probeAttenuation.getBufferSize()); + Vector cubeMaps; + Vector irradMaps; + if (reflProbeMat && reflProbeMat->matInstance) { MaterialParameters *matParams = reflProbeMat->matInstance->getMaterialParameters(); MaterialParameterHandle *numProbesSC = reflProbeMat->matInstance->getMaterialParameterHandle("$numProbes"); - matParams->setSafe(numProbesSC, (float)probeCount); MaterialParameterHandle *probePositionSC = reflProbeMat->matInstance->getMaterialParameterHandle("$inProbePosArray"); MaterialParameterHandle *probeWorldToObjSC = reflProbeMat->matInstance->getMaterialParameterHandle("$worldToObjArray"); @@ -333,6 +335,9 @@ void RenderProbeMgr::render( SceneRenderState *state ) MaterialParameterHandle *probeRadiusSC = reflProbeMat->matInstance->getMaterialParameterHandle("$radius"); MaterialParameterHandle *probeAttenuationSC = reflProbeMat->matInstance->getMaterialParameterHandle("$attenuation"); + MaterialParameterHandle *probeCubemapArraySC = reflProbeMat->matInstance->getMaterialParameterHandle("$cubeMap"); + MaterialParameterHandle *probeIrradianceArraySC = reflProbeMat->matInstance->getMaterialParameterHandle("$irradianceCubemap"); + U32 effectiveProbeCount = 0; for (U32 i = 0; i < probeCount; i++) @@ -342,11 +347,20 @@ void RenderProbeMgr::render( SceneRenderState *state ) ProbeRenderInst* curEntry = ProbeRenderInst::all[i]; + if (!curEntry->mIsEnabled) + continue; + + if (curEntry->mCubemap.isNull() || curEntry->mIrradianceCubemap.isNull()) + continue; + //Setup const Point3F &probePos = curEntry->getPosition(); probePositions[i] = probePos + curEntry->mProbePosOffset; - probeWorldToObj[i] = curEntry->getTransform(); + MatrixF trans = curEntry->getTransform(); + trans.inverse(); + + probeWorldToObj[i] = trans; probeBBMin[i] = curEntry->mBounds.minExtents; probeBBMax[i] = curEntry->mBounds.maxExtents; @@ -356,11 +370,28 @@ void RenderProbeMgr::render( SceneRenderState *state ) probeRadius[i] = curEntry->mRadius; probeAttenuation[i] = 1; + cubeMaps.push_back(curEntry->mCubemap); + irradMaps.push_back(curEntry->mIrradianceCubemap); + effectiveProbeCount++; } if (effectiveProbeCount != 0) { + matParams->setSafe(numProbesSC, (float)effectiveProbeCount); + + GFXCubemapArrayHandle mCubemapArray; + mCubemapArray = GFXCubemapArrayHandle(GFX->createCubemapArray()); + + GFXCubemapArrayHandle mIrradArray; + mIrradArray = GFXCubemapArrayHandle(GFX->createCubemapArray()); + + mCubemapArray->initStatic(cubeMaps.address(), cubeMaps.size()); + mIrradArray->initStatic(irradMaps.address(), irradMaps.size()); + + GFX->setCubeArrayTexture(3, mCubemapArray); + GFX->setCubeArrayTexture(4, mIrradArray); + matParams->set(probePositionSC, probePositions); matParams->set(probeWorldToObjSC, probeWorldToObj.address(), probeWorldToObj.size()); matParams->set(probeBBMinSC, probeBBMin);