adds wetness

cliffsnotes:
   $Core::WetnessTexture = "core/rendering/images/wetMap.png"; //for the influence degree map
probes/skylight have a new canDamp boolean, set to off for probes, on for skylight by default.
:levelinfo has a dampness multiplier (0-1)
kicked up numTextures from 8 to 16 for shaderdata and postfx since that hit the 8 texture-in prior limit, and we've already adopted apis that can handle the higher count
This commit is contained in:
AzaezelX 2022-11-21 21:12:23 -06:00
parent e16351605b
commit d23ee397e6
31 changed files with 352 additions and 100 deletions

View file

@ -98,7 +98,9 @@ ProbeShaderConstants::ProbeShaderConstants()
mProbeIrradianceCubemapArraySC(NULL),
mProbeCountSC(NULL),
mBRDFTextureMap(NULL),
mWetnessTextureMap(NULL),
mSkylightCubemapIdxSC(NULL),
mSkylightDampSC(NULL),
mWorldToObjArraySC(NULL),
mMaxProbeDrawDistanceSC(NULL)
{
@ -135,8 +137,10 @@ void ProbeShaderConstants::init(GFXShader* shader)
mProbeCountSC = shader->getShaderConstHandle(ShaderGenVars::probeCount);
mBRDFTextureMap = shader->getShaderConstHandle(ShaderGenVars::BRDFTextureMap);
mWetnessTextureMap = shader->getShaderConstHandle(ShaderGenVars::WetnessTextureMap);
mSkylightCubemapIdxSC = shader->getShaderConstHandle(ShaderGenVars::skylightCubemapIdx);
mSkylightCubemapIdxSC = shader->getShaderConstHandle(ShaderGenVars::skylightCubemapIdx);
mSkylightDampSC = shader->getShaderConstHandle(ShaderGenVars::skylightDamp);
mMaxProbeDrawDistanceSC = shader->getShaderConstHandle(ShaderGenVars::maxProbeDrawDistance);
@ -145,10 +149,10 @@ void ProbeShaderConstants::init(GFXShader* shader)
bool ProbeShaderConstants::isValid()
{
if (mProbePositionArraySC->isValid() ||
mProbeConfigDataArraySC->isValid() ||
mRefScaleArraySC->isValid() ||
mProbeSpecularCubemapArraySC->isValid() ||
if (mProbePositionArraySC->isValid() &&
mProbeConfigDataArraySC->isValid() &&
mRefScaleArraySC->isValid() &&
mProbeSpecularCubemapArraySC->isValid() &&
mProbeIrradianceCubemapArraySC->isValid())
return true;
@ -169,6 +173,7 @@ RenderProbeMgr::RenderProbeMgr()
mLastConstants(nullptr),
mHasSkylight(false),
mSkylightCubemapIdx(-1),
mSkylightDamp(true),
mCubeMapCount(0),
mUseHDRCaptures(true)
{
@ -197,6 +202,7 @@ RenderProbeMgr::RenderProbeMgr(RenderInstType riType, F32 renderOrder, F32 proce
mEffectiveProbeCount = 0;
mHasSkylight = false;
mSkylightCubemapIdx = -1;
mSkylightDamp = true;
mLastConstants = nullptr;
mMipCount = 0;
mUseHDRCaptures = true;
@ -236,6 +242,12 @@ bool RenderProbeMgr::onAdd()
return false;
}
String wetnessTexturePath = GFXTextureManager::getWetnessTexturePath();
if (!mWetnessTexture.set(wetnessTexturePath, &GFXTexturePersistentProfile, "WetnessTexture"))
{
Con::errorf("RenderProbeMgr::onAdd: Failed to load Wetness Texture");
return false;
}
return true;
}
@ -306,6 +318,7 @@ void RenderProbeMgr::getBestProbes(const Point3F& objPosition, ProbeDataSet* pro
else
{
probeDataSet->skyLightIdx = curEntry.mCubemapIndex;
probeDataSet->skyLightDamp = curEntry.mProbeInfo->mCanDamp;
mHasSkylight = true;
}
}
@ -330,13 +343,13 @@ void RenderProbeMgr::getBestProbes(const Point3F& objPosition, ProbeDataSet* pro
probeDataSet->probeWorldToObjArray[i] = p2A;
p2A.inverse();
probeDataSet->refScaleArray[i] = curEntry.mProbeInfo->mProbeRefScale / (p2A.getScale()*2);
probeDataSet->refScaleArray[i].w = curEntry.mProbeInfo->mCanDamp? 1.0 : 0.0;
Point3F probePos = curEntry.mProbeInfo->mObject->getPosition();
Point3F refPos = probePos + curEntry.mProbeInfo->mProbeRefOffset * probeDataSet->refScaleArray[i].asPoint3F();
probeDataSet->probePositionArray[i] = Point4F(probePos.x, probePos.y, probePos.z, 0);
probeDataSet->probeRefPositionArray[i] = Point4F(refPos.x, refPos.y, refPos.z, 0);
}
}
@ -422,7 +435,7 @@ PostEffect* RenderProbeMgr::getProbeArrayEffect()
mProbeArrayEffect->setShaderConst("$numProbes", (S32)0);
mProbeArrayEffect->setShaderConst("$skylightCubemapIdx", (S32)-1);
mProbeArrayEffect->setShaderConst(ShaderGenVars::skylightDamp, (S32)true);
mProbeArrayEffect->setShaderConst("$cubeMips", (float)0);
mProbeArrayEffect->setShaderConst("$maxProbeDrawDistance", smMaxProbeDrawDistance);
@ -784,10 +797,14 @@ void RenderProbeMgr::_update4ProbeConsts(const SceneData& sgData,
shaderConsts->setSafe(probeShaderConsts->mProbeConfigDataArraySC, probeConfigAlignedArray);
}
if (probeShaderConsts->mBRDFTextureMap->getSamplerRegister() != -1 && mBRDFTexture.isValid())
if (mBRDFTexture.isValid(), probeShaderConsts->mBRDFTextureMap->getSamplerRegister() != -1)
GFX->setTexture(probeShaderConsts->mBRDFTextureMap->getSamplerRegister(), mBRDFTexture);
if (mWetnessTexture.isValid() && probeShaderConsts->mWetnessTextureMap->getSamplerRegister() != -1)
GFX->setTexture(probeShaderConsts->mWetnessTextureMap->getSamplerRegister(), mWetnessTexture);
shaderConsts->setSafe(probeShaderConsts->mSkylightCubemapIdxSC, (float)probeSet.skyLightIdx);
shaderConsts->setSafe(probeShaderConsts->mSkylightDampSC, (int)probeSet.skyLightDamp);
if (probeShaderConsts->mProbeSpecularCubemapArraySC->getSamplerRegister() != -1)
GFX->setCubeArrayTexture(probeShaderConsts->mProbeSpecularCubemapArraySC->getSamplerRegister(), mPrefilterArray);
@ -859,6 +876,11 @@ void RenderProbeMgr::render( SceneRenderState *state )
String probeCapturing = Con::getVariable("$Probes::Capturing", "0");
mProbeArrayEffect->setShaderMacro("CAPTURING", probeCapturing);
mProbeArrayEffect->setTexture(3, mBRDFTexture);
mProbeArrayEffect->setCubemapArrayTexture(4, mPrefilterArray);
mProbeArrayEffect->setCubemapArrayTexture(5, mIrradianceArray);
mProbeArrayEffect->setTexture(6, mWetnessTexture);
//ssao mask
if (AdvancedLightBinManager::smUseSSAOMask)
{
@ -868,20 +890,16 @@ void RenderProbeMgr::render( SceneRenderState *state )
if (pTexObj)
{
mProbeArrayEffect->setShaderMacro("USE_SSAO_MASK");
mProbeArrayEffect->setTexture(6, pTexObj);
mProbeArrayEffect->setTexture(7, pTexObj);
}
}
else
{
mProbeArrayEffect->setTexture(6, GFXTexHandle(NULL));
mProbeArrayEffect->setTexture(7, GFXTexHandle(NULL));
}
mProbeArrayEffect->setTexture(3, mBRDFTexture);
mProbeArrayEffect->setCubemapArrayTexture(4, mPrefilterArray);
mProbeArrayEffect->setCubemapArrayTexture(5, mIrradianceArray);
mProbeArrayEffect->setShaderConst("$numProbes", (S32)mProbeData.effectiveProbeCount);
mProbeArrayEffect->setShaderConst("$skylightCubemapIdx", (S32)mProbeData.skyLightIdx);
mProbeArrayEffect->setShaderConst(ShaderGenVars::skylightDamp, mProbeData.skyLightDamp);
mProbeArrayEffect->setShaderConst("$cubeMips", (float)mPrefilterArray->getMipMapLevels());