diff --git a/src/gl/scene/gl_sprite.cpp b/src/gl/scene/gl_sprite.cpp index bc8275ddde..81b0772226 100644 --- a/src/gl/scene/gl_sprite.cpp +++ b/src/gl/scene/gl_sprite.cpp @@ -79,6 +79,7 @@ EXTERN_CVAR (Float, transsouls) extern TArray sprites; extern TArray SpriteFrames; +extern uint32_t r_renderercaps; enum HWRenderStyle { @@ -677,6 +678,13 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal) if (!(thing->flags & MF_STEALTH) || !mDrawer->FixedColormap || !gl_enhanced_nightvision || thing == camera) return; } + + // check renderrequired vs ~r_rendercaps, if anything matches we don't support that feature, + // check renderhidden vs r_rendercaps, if anything matches we do support that feature and should hide it. + if ((!!((uint32_t)(thing->renderrequired) & ~r_renderercaps)) || + (!!((uint32_t)(thing->renderhidden) & r_renderercaps))) + return; + int spritenum = thing->sprite; DVector2 sprscale = thing->Scale; if (thing->player != NULL) diff --git a/src/polyrenderer/scene/poly_sprite.cpp b/src/polyrenderer/scene/poly_sprite.cpp index 5b49274312..ca960dd582 100644 --- a/src/polyrenderer/scene/poly_sprite.cpp +++ b/src/polyrenderer/scene/poly_sprite.cpp @@ -32,6 +32,7 @@ EXTERN_CVAR(Float, transsouls) EXTERN_CVAR(Int, r_drawfuzz) +extern uint32_t r_renderercaps; bool RenderPolySprite::GetLine(AActor *thing, DVector2 &left, DVector2 &right) { @@ -176,6 +177,12 @@ bool RenderPolySprite::IsThingCulled(AActor *thing) return true; } + // check renderrequired vs ~r_rendercaps, if anything matches we don't support that feature, + // check renderhidden vs r_rendercaps, if anything matches we do support that feature and should hide it. + if ((!!((uint32_t)(thing->renderrequired) & ~r_renderercaps)) || + (!!((uint32_t)(thing->renderhidden) & r_renderercaps))) + return true; + return false; } diff --git a/src/scripting/thingdef_properties.cpp b/src/scripting/thingdef_properties.cpp index d10f505173..4ac679b450 100644 --- a/src/scripting/thingdef_properties.cpp +++ b/src/scripting/thingdef_properties.cpp @@ -1837,3 +1837,18 @@ DEFINE_SCRIPTED_PROPERTY(unmorphflash, S, PowerMorph) } +//========================================================================== +// actor render feature filters - stop rendering if the renderer does/does not support certain features +//========================================================================== +DEFINE_SCRIPTED_PROPERTY(renderrequired, I, Actor) +{ + PROP_INT_PARM(f, 0); + defaults->renderrequired = f; +} + +DEFINE_SCRIPTED_PROPERTY(renderhidden, I, Actor) +{ + PROP_INT_PARM(f, 0); + defaults->renderhidden = f; +} + diff --git a/src/swrenderer/scene/r_opaque_pass.cpp b/src/swrenderer/scene/r_opaque_pass.cpp index b772d62a4e..68c0abab8a 100644 --- a/src/swrenderer/scene/r_opaque_pass.cpp +++ b/src/swrenderer/scene/r_opaque_pass.cpp @@ -72,6 +72,7 @@ EXTERN_CVAR(Bool, r_fullbrightignoresectorcolor); EXTERN_CVAR(Bool, r_drawvoxels); +extern uint32_t r_renderercaps; namespace { @@ -968,6 +969,12 @@ namespace swrenderer return false; } + // check renderrequired vs ~r_rendercaps, if anything matches we don't support that feature, + // check renderhidden vs r_rendercaps, if anything matches we do support that feature and should hide it. + if ((!!((uint32_t)(thing->renderrequired) & ~r_renderercaps)) || + (!!((uint32_t)(thing->renderhidden) & r_renderercaps))) + return false; + // [ZZ] Or less definitely not visible (hue) // [ZZ] 10.01.2016: don't try to clip stuff inside a skybox against the current portal. RenderPortal *renderportal = Thread->Portal.get();