adds alphatest shadows for translucent objects

leverage the fact shadergen spits out a modified material per pass, in this instance the shadow pass, to basically flip the translucent aspect off if you've got both translucency and alphatesting flipped on.
This commit is contained in:
AzaezelX 2020-03-01 10:47:25 -06:00
parent 9c381caea2
commit ff4b025c2c
5 changed files with 7 additions and 3 deletions

View file

@ -260,7 +260,7 @@ void ShadowRenderPassManager::addInst( RenderInst *inst )
return; return;
const BaseMaterialDefinition *mat = meshRI->matInst->getMaterial(); 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 // Do not add this instance, return here and avoid the default behavior
// of calling up to Parent::addInst() // 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_TexAnim );
fd.features.removeFeature( MFT_DiffuseMap ); fd.features.removeFeature( MFT_DiffuseMap );
} }
else
fd.features.removeFeature(MFT_IsTranslucent);
// HACK: Need to figure out how to enable these // HACK: Need to figure out how to enable these
// suckers without this override call! // suckers without this override call!

View file

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

View file

@ -396,6 +396,7 @@ public:
/// for freeing the instance /// for freeing the instance
virtual BaseMatInstance* createMatInstance(); 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 isDoubleSided() const { return mDoubleSided; }
virtual bool isAutoGenerated() const { return mAutoGenerated; } virtual bool isAutoGenerated() const { return mAutoGenerated; }
virtual void setAutoGenerated(bool isAutoGenerated) { mAutoGenerated = isAutoGenerated; } virtual void setAutoGenerated(bool isAutoGenerated) { mAutoGenerated = isAutoGenerated; }

View file

@ -280,7 +280,7 @@ void TSMesh::innerRender( TSMaterialList *materials, const TSRenderState &rdata,
ri->primBuffIndex = mPrimBufferOffset + i; ri->primBuffIndex = mPrimBufferOffset + i;
// Translucent materials need the translucent type. // 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->type = RenderPassManager::RIT_Translucent;
ri->translucentSort = true; ri->translucentSort = true;