implement per-class globalshaders

This commit is contained in:
Ricardo Luís Vaz Silva 2025-01-10 19:52:58 -03:00 committed by Magnus Norddahl
commit 91300ac3b4
5 changed files with 24 additions and 14 deletions

View file

@ -174,6 +174,11 @@ protected:
virtual void DoDrawIndexed(int dt, int index, int count, bool apply) = 0;
public:
int getShaderIndex()
{
return (mMaterial.mOverrideShader > 0) ? mMaterial.mOverrideShader : (mMaterial.mMaterial ? mMaterial.mMaterial->GetShaderIndex() : 0);
}
uint64_t firstFrame = 0;
void Reset()
@ -541,10 +546,10 @@ public:
}
private:
void SetMaterial(FMaterial *mat, int clampmode, int translation, int overrideshader);
void SetMaterial(FMaterial *mat, int clampmode, int translation, int overrideshader, PClass *cls);
public:
void SetMaterial(FGameTexture* tex, EUpscaleFlags upscalemask, int scaleflags, int clampmode, int translation, int overrideshader)
void SetMaterial(FGameTexture* tex, EUpscaleFlags upscalemask, int scaleflags, int clampmode, int translation, int overrideshader, PClass *cls = nullptr)
{
tex->setSeen();
if (!sysCallbacks.PreBindTexture || !sysCallbacks.PreBindTexture(this, tex, upscalemask, scaleflags, clampmode, translation, overrideshader))
@ -553,12 +558,12 @@ public:
}
auto mat = FMaterial::ValidateTexture(tex, scaleflags);
assert(mat);
SetMaterial(mat, clampmode, translation, overrideshader);
SetMaterial(mat, clampmode, translation, overrideshader, cls);
}
void SetMaterial(FGameTexture* tex, EUpscaleFlags upscalemask, int scaleflags, int clampmode, FTranslationID translation, int overrideshader)
void SetMaterial(FGameTexture* tex, EUpscaleFlags upscalemask, int scaleflags, int clampmode, FTranslationID translation, int overrideshader, PClass *cls = nullptr)
{
SetMaterial(tex, upscalemask, scaleflags, clampmode, translation.index(), overrideshader);
SetMaterial(tex, upscalemask, scaleflags, clampmode, translation.index(), overrideshader, cls);
}

View file

@ -36,29 +36,29 @@ CVAR(Bool, gl_customshader, true, 0);
TArray<UserShaderDesc> usershaders;
void FRenderState::SetMaterial(FMaterial *mat, int clampmode, int translation, int overrideshader)
void FRenderState::SetMaterial(FMaterial *mat, int clampmode, int translation, int overrideshader, PClass *cls)
{
mMaterial.mMaterial = mat;
mMaterial.mClampMode = clampmode;
mMaterial.mTranslation = translation;
if(overrideshader > 0)
if(overrideshader >= FIRST_USER_SHADER)
{
mMaterial.mOverrideShader = overrideshader;
mMaterial.globalShaderAddr = {0, 3, 0};
}
else
{ // handle per-map global shaders
{ // handle per-map/per-class global shaders
GlobalShaderAddr addr;
auto globalshader = GetGlobalShader(mat->GetShaderIndex(), nullptr, addr);
auto globalshader = GetGlobalShader((overrideshader > 0) ? overrideshader : mat->GetShaderIndex(), cls, addr);
if(addr.type == 1 && globalshader->shaderindex >= 0)
if(addr.type > 0 && globalshader->shaderindex >= 0)
{
mMaterial.mOverrideShader = globalshader->shaderindex;
mMaterial.globalShaderAddr = addr;
}
else
{
mMaterial.mOverrideShader = -1;
mMaterial.mOverrideShader = overrideshader;
mMaterial.globalShaderAddr = {0, 3, 0};
}
}

View file

@ -68,7 +68,12 @@ TMap<FName, GlobalShaderDesc> classshaders[NUM_BUILTIN_SHADERS];
const GlobalShaderDesc * GetGlobalShader(int shaderNum, PClass * curActor, GlobalShaderAddr &addr)
{
if(shaderNum < NUM_BUILTIN_SHADERS)
if(shaderNum >= NUM_BUILTIN_SHADERS && usershaders[shaderNum - NUM_BUILTIN_SHADERS].shaderFlags & SFlag_Global)
{ // allow class and map shaders to override gobal shaders
shaderNum = usershaders[shaderNum - NUM_BUILTIN_SHADERS].shaderType;
}
if(shaderNum >= 0 && shaderNum < NUM_BUILTIN_SHADERS)
{
GlobalShaderDesc * shader;
if(curActor)

View file

@ -136,7 +136,7 @@ void FHWModelRenderer::SetInterpolation(double inter)
void FHWModelRenderer::SetMaterial(FGameTexture *skin, bool clampNoFilter, FTranslationID translation, AActor * act)
{
state.SetMaterial(skin, UF_Skin, 0, clampNoFilter ? CLAMP_NOFILTER : CLAMP_NONE, translation, -1);
state.SetMaterial(skin, UF_Skin, 0, clampNoFilter ? CLAMP_NOFILTER : CLAMP_NONE, translation, -1, act ? act->GetClass() : nullptr);
state.SetLightIndex(modellightindex);
}

View file

@ -238,7 +238,7 @@ void HWSprite::DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent)
}
uint32_t spritetype = actor? uint32_t(actor->renderflags & RF_SPRITETYPEMASK) : 0;
if (texture) state.SetMaterial(texture, UF_Sprite, (spritetype == RF_FACESPRITE) ? CTF_Expand : 0, clampmode, translation, OverrideShader);
if (texture) state.SetMaterial(texture, UF_Sprite, (spritetype == RF_FACESPRITE) ? CTF_Expand : 0, clampmode, translation, OverrideShader, actor ? actor->GetClass() : nullptr);
else if (!modelframe) state.EnableTexture(false);
//SetColor(lightlevel, rel, Colormap, trans);