Merge pull request #147 from Azaezel/alpha40_TranslucentShadows

adds alphatest shadows for translucent objects
This commit is contained in:
Areloch 2020-03-11 00:44:30 -05:00 committed by GitHub
commit 0e006b2264
8 changed files with 14 additions and 8 deletions

View file

@ -704,7 +704,7 @@ void ConvexShape::prepRenderImage( SceneRenderState *state )
// Set our Material
ri->matInst = matInst;
if (matInst->getMaterial()->isTranslucent())
if (matInst->getMaterial()->isTranslucent() && (!(matInst->getMaterial()->isAlphatest() && state->isShadowPass())))
{
ri->translucentSort = true;
ri->type = RenderPassManager::RIT_Translucent;

View file

@ -260,7 +260,7 @@ void ShadowRenderPassManager::addInst( RenderInst *inst )
return;
const BaseMaterialDefinition *mat = meshRI->matInst->getMaterial();
if ( !mat->castsShadows() || mat->isTranslucent() )
if ( !mat->castsShadows() || (mat->isTranslucent() && !mat->isAlphatest()))
{
// Do not add this instance, return here and avoid the default behavior
// of calling up to Parent::addInst()

View file

@ -190,6 +190,8 @@ void ShadowMaterialHook::_overrideFeatures( ProcessedMaterial *mat,
fd.features.removeFeature( MFT_TexAnim );
fd.features.removeFeature( MFT_DiffuseMap );
}
else
fd.features.removeFeature(MFT_IsTranslucent);
// HACK: Need to figure out how to enable these
// suckers without this override call!

View file

@ -37,6 +37,7 @@ public:
virtual bool isDoubleSided() const = 0;
virtual bool isLightmapped() const = 0;
virtual bool castsShadows() const = 0;
virtual bool isAlphatest() const = 0;
};
#endif // _BASEMATERIALDEFINITION_H_

View file

@ -395,7 +395,8 @@ public:
/// Allocates and returns a BaseMatInstance for this material. Caller is responsible
/// for freeing the instance
virtual BaseMatInstance* createMatInstance();
virtual bool isTranslucent() const { return mTranslucent && mTranslucentBlendOp != Material::None; }
virtual bool isTranslucent() const { return mTranslucent && mTranslucentBlendOp != Material::None; }
virtual bool isAlphatest() const { return mAlphaTest; }
virtual bool isDoubleSided() const { return mDoubleSided; }
virtual bool isAutoGenerated() const { return mAutoGenerated; }
virtual void setAutoGenerated(bool isAutoGenerated) { mAutoGenerated = isAutoGenerated; }

View file

@ -2496,9 +2496,10 @@ void AlphaTestGLSL::processPix( Vector<ShaderComponent*> &componentList,
{
// If we're below SM3 and don't have a depth output
// feature then don't waste an instruction here.
if ( GFX->getPixelShaderVersion() < 3.0 &&
if (( GFX->getPixelShaderVersion() < 3.0 &&
!fd.features[ MFT_EyeSpaceDepthOut ] &&
!fd.features[ MFT_DepthOut ] )
!fd.features[ MFT_DepthOut ] ) ||
fd.features[MFT_IsTranslucent])
{
output = NULL;
return;

View file

@ -2565,9 +2565,10 @@ void AlphaTestHLSL::processPix( Vector<ShaderComponent*> &componentList,
{
// If we're below SM3 and don't have a depth output
// feature then don't waste an instruction here.
if ( GFX->getPixelShaderVersion() < 3.0 &&
if (( GFX->getPixelShaderVersion() < 3.0 &&
!fd.features[ MFT_EyeSpaceDepthOut ] &&
!fd.features[ MFT_DepthOut ] )
!fd.features[ MFT_DepthOut ] ) ||
fd.features[MFT_IsTranslucent])
{
output = NULL;
return;

View file

@ -280,7 +280,7 @@ void TSMesh::innerRender( TSMaterialList *materials, const TSRenderState &rdata,
ri->primBuffIndex = mPrimBufferOffset + i;
// Translucent materials need the translucent type.
if ( matInst->getMaterial()->isTranslucent() )
if ( matInst->getMaterial()->isTranslucent() && (!(matInst->getMaterial()->isAlphatest() && state->isShadowPass())))
{
ri->type = RenderPassManager::RIT_Translucent;
ri->translucentSort = true;