New terrain blending

This commit is contained in:
Lukas Aldershaab 2020-12-29 02:00:14 +01:00
parent e92e945912
commit 4f472bf402
12 changed files with 967 additions and 179 deletions

View file

@ -401,16 +401,18 @@ bool TerrainCellMaterial::_initShader(bool deferredMat,
features.addFeature(MFT_isDeferred, featureIndex);
features.addFeature(MFT_TerrainDetailMap, featureIndex);
if (!(mat->getORMConfigMap().isEmpty()))
if (deferredMat)
{
if (deferredMat)
features.addFeature(MFT_isDeferred, featureIndex);
features.addFeature(MFT_TerrainORMMap, featureIndex);
}
else
{
features.addFeature(MFT_DeferredTerrainBlankInfoMap, featureIndex);
if (!(mat->getORMConfigMap().isEmpty()))
{
features.addFeature(MFT_TerrainORMMap, featureIndex);
}
else
{
features.addFeature(MFT_DeferredTerrainBlankInfoMap, featureIndex);
}
}
if (mat->getInvertRoughness())
features.addFeature(MFT_InvertRoughness, featureIndex);
@ -444,6 +446,12 @@ bool TerrainCellMaterial::_initShader(bool deferredMat,
featureIndex++;
}
// New blending
if (matCount > 0 && !Con::getBoolVariable("$Terrain::LerpBlend", false))
{
features.addFeature(MFT_TerrainHeightBlend);
}
MaterialFeatureData featureData;
featureData.features = features;
featureData.materialFeatures = features;
@ -528,6 +536,7 @@ bool TerrainCellMaterial::_initShader(bool deferredMat,
mLightMapTexConst = mShader->getShaderConstHandle("$lightMapTex");
mOneOverTerrainSizeConst = mShader->getShaderConstHandle("$oneOverTerrainSize");
mSquareSizeConst = mShader->getShaderConstHandle("$squareSize");
mBlendDepthConst = mShader->getShaderConstHandle("$baseBlendDepth");
mLightParamsConst = mShader->getShaderConstHandle("$rtParamslightInfoBuffer");
@ -634,6 +643,23 @@ bool TerrainCellMaterial::_initShader(bool deferredMat,
desc.samplers[sampler].minFilter = GFXTextureFilterLinear;
}
for (U32 i = 0; i < matCount && !baseOnly; i++)
{
TerrainMaterial* mat = mMaterialInfos[i]->mat;
if (mat == NULL)
continue;
// We only include materials that
// have more than a base texture.
if (mat->getDetailSize() <= 0 ||
mat->getDetailDistance() <= 0 ||
mat->getDetailMap().isEmpty())
continue;
mMaterialInfos[i]->mBlendDepthConst = mShader->getShaderConstHandle(avar("$blendDepth%d", i));
}
// If we're doing deferred it requires some
// special stencil settings for it to work.
if ( deferredMat )
@ -701,10 +727,13 @@ void TerrainCellMaterial::_updateMaterialConsts( )
detailScaleAndFadeArray[j] = detailScaleAndFade;
detailInfoArray[j] = detailIdStrengthParallax;
mConsts->setSafe(matInfo->mBlendDepthConst, matInfo->mat->getBlendDepth());
}
mConsts->setSafe(mDetailInfoVArrayConst, detailScaleAndFadeArray);
mConsts->setSafe(mDetailInfoPArrayConst, detailInfoArray);
}
bool TerrainCellMaterial::setupPass( const SceneRenderState *state,
@ -782,6 +811,8 @@ bool TerrainCellMaterial::setupPass( const SceneRenderState *state,
mConsts->set( mFogDataConst, fogData );
}
mConsts->setSafe( mBlendDepthConst, Con::getFloatVariable("$Terrain::BlendDepth", 0.2f) );
mConsts->setSafe( mFogColorConst, sceneData.fogColor );
if ( mLightInfoBufferConst->isValid() &&