mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-29 15:32:57 +00:00
Add stencil blend mode as apparently the shaded mode uses indices whiles stencil uses mask/alpha..
This commit is contained in:
parent
e7d64a380a
commit
5e9c9c825d
6 changed files with 33 additions and 12 deletions
|
@ -581,10 +581,13 @@ SSAVec4i DrawTriangleCodegen::ProcessPixel32(SSAVec4i bg, SSAInt *varying)
|
||||||
fg = Sample32(uvoffset);
|
fg = Sample32(uvoffset);
|
||||||
output = blend_revsub(shade_bgra_simple(fg, currentlight), bg, srcalpha, calc_blend_bgalpha(fg, destalpha));
|
output = blend_revsub(shade_bgra_simple(fg, currentlight), bg, srcalpha, calc_blend_bgalpha(fg, destalpha));
|
||||||
break;
|
break;
|
||||||
case TriBlendMode::Shaded:
|
case TriBlendMode::Stencil:
|
||||||
fg = Sample32(uvoffset);
|
fg = Sample32(uvoffset);
|
||||||
output = blend_stencil(shade_bgra_simple(SSAVec4i::unpack(color), currentlight), fg[3], bg, srcalpha, destalpha);
|
output = blend_stencil(shade_bgra_simple(SSAVec4i::unpack(color), currentlight), fg[3], bg, srcalpha, destalpha);
|
||||||
break;
|
break;
|
||||||
|
case TriBlendMode::Shaded:
|
||||||
|
output = blend_stencil(shade_bgra_simple(SSAVec4i::unpack(color), currentlight), Sample8(uvoffset), bg, srcalpha, destalpha);
|
||||||
|
break;
|
||||||
case TriBlendMode::TranslateCopy:
|
case TriBlendMode::TranslateCopy:
|
||||||
fg = TranslateSample32(uvoffset);
|
fg = TranslateSample32(uvoffset);
|
||||||
output = blend_copy(shade_bgra_simple(fg, currentlight));
|
output = blend_copy(shade_bgra_simple(fg, currentlight));
|
||||||
|
@ -662,6 +665,9 @@ SSAInt DrawTriangleCodegen::ProcessPixel8(SSAInt bg, SSAInt *varying)
|
||||||
fg = ToBgra(Shade8(Sample8(uvoffset)));
|
fg = ToBgra(Shade8(Sample8(uvoffset)));
|
||||||
output = ToPal8(blend_revsub(fg, ToBgra(bg), srcalpha, calc_blend_bgalpha(fg, destalpha)));
|
output = ToPal8(blend_revsub(fg, ToBgra(bg), srcalpha, calc_blend_bgalpha(fg, destalpha)));
|
||||||
break;
|
break;
|
||||||
|
case TriBlendMode::Stencil:
|
||||||
|
output = ToPal8(blend_stencil(ToBgra(Shade8(color)), (Sample8(uvoffset) == SSAInt(0)).select(SSAInt(0), SSAInt(256)), ToBgra(bg), srcalpha, destalpha));
|
||||||
|
break;
|
||||||
case TriBlendMode::Shaded:
|
case TriBlendMode::Shaded:
|
||||||
output = ToPal8(blend_stencil(ToBgra(Shade8(color)), Sample8(uvoffset), ToBgra(bg), srcalpha, destalpha));
|
output = ToPal8(blend_stencil(ToBgra(Shade8(color)), Sample8(uvoffset), ToBgra(bg), srcalpha, destalpha));
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -127,7 +127,7 @@ LLVMDrawers *LLVMDrawers::Instance()
|
||||||
|
|
||||||
LLVMDrawersImpl::LLVMDrawersImpl()
|
LLVMDrawersImpl::LLVMDrawersImpl()
|
||||||
{
|
{
|
||||||
int version = 4; // Increment this number if the drawer codegen is modified (forces recreation of the module).
|
int version = 5; // Increment this number if the drawer codegen is modified (forces recreation of the module).
|
||||||
std::string targetCPU = mProgram.GetTargetCPU();
|
std::string targetCPU = mProgram.GetTargetCPU();
|
||||||
bool loaded = mProgram.LoadCachedModule(version, targetCPU);
|
bool loaded = mProgram.LoadCachedModule(version, targetCPU);
|
||||||
if (!loaded)
|
if (!loaded)
|
||||||
|
|
|
@ -281,7 +281,8 @@ enum class TriBlendMode
|
||||||
Add, // blend_add(shade(fg), bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
Add, // blend_add(shade(fg), bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
||||||
Sub, // blend_sub(shade(fg), bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
Sub, // blend_sub(shade(fg), bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
||||||
RevSub, // blend_revsub(shade(fg), bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
RevSub, // blend_revsub(shade(fg), bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
||||||
Shaded, // blend_stencil(shade(color), fg, bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
Stencil, // blend_stencil(shade(color), fg.a, bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
||||||
|
Shaded, // blend_stencil(shade(color), fg.index, bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
||||||
TranslateCopy, // blend_copy(shade(translate(fg)))
|
TranslateCopy, // blend_copy(shade(translate(fg)))
|
||||||
TranslateAlphaBlend, // blend_alpha_blend(shade(translate(fg)), bg)
|
TranslateAlphaBlend, // blend_alpha_blend(shade(translate(fg)), bg)
|
||||||
TranslateAdd, // blend_add(shade(translate(fg)), bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
TranslateAdd, // blend_add(shade(translate(fg)), bg, srcalpha, calc_blend_bgalpha(fg, destalpha))
|
||||||
|
|
|
@ -130,6 +130,8 @@ void RenderPolyDecal::Render(const TriMatrix &worldToClip, DBaseDecal *decal, co
|
||||||
|
|
||||||
PolyDrawArgs args;
|
PolyDrawArgs args;
|
||||||
args.uniforms.flags = 0;
|
args.uniforms.flags = 0;
|
||||||
|
args.SetColormap(front->ColorMap);
|
||||||
|
args.SetTexture(tex, decal->Translation, true);
|
||||||
if (fullbrightSprite || fixedlightlev >= 0 || fixedcolormap)
|
if (fullbrightSprite || fixedlightlev >= 0 || fixedcolormap)
|
||||||
{
|
{
|
||||||
args.uniforms.light = 256;
|
args.uniforms.light = 256;
|
||||||
|
@ -150,8 +152,8 @@ void RenderPolyDecal::Render(const TriMatrix &worldToClip, DBaseDecal *decal, co
|
||||||
args.uniforms.color = ((uint32_t)decal->AlphaColor) >> 24;
|
args.uniforms.color = ((uint32_t)decal->AlphaColor) >> 24;
|
||||||
}
|
}
|
||||||
|
|
||||||
args.uniforms.srcalpha = 256;
|
args.uniforms.srcalpha = (uint32_t)(decal->Alpha * 256.0 + 0.5);
|
||||||
args.uniforms.destalpha = 0;
|
args.uniforms.destalpha = 256 - args.uniforms.srcalpha;
|
||||||
|
|
||||||
args.objectToClip = &worldToClip;
|
args.objectToClip = &worldToClip;
|
||||||
args.vinput = vertices;
|
args.vinput = vertices;
|
||||||
|
@ -160,8 +162,6 @@ void RenderPolyDecal::Render(const TriMatrix &worldToClip, DBaseDecal *decal, co
|
||||||
args.ccw = true;
|
args.ccw = true;
|
||||||
args.stenciltestvalue = 0;
|
args.stenciltestvalue = 0;
|
||||||
args.stencilwritevalue = 1;
|
args.stencilwritevalue = 1;
|
||||||
args.SetTexture(tex);
|
|
||||||
args.SetColormap(front->ColorMap);
|
|
||||||
//mode = R_SetPatchStyle (decal->RenderStyle, (float)decal->Alpha, decal->Translation, decal->AlphaColor);
|
//mode = R_SetPatchStyle (decal->RenderStyle, (float)decal->Alpha, decal->Translation, decal->AlphaColor);
|
||||||
PolyTriangleDrawer::draw(args, TriDrawVariant::DrawSubsector, TriBlendMode::Shaded);
|
PolyTriangleDrawer::draw(args, TriDrawVariant::DrawSubsector, TriBlendMode::Shaded);
|
||||||
}
|
}
|
||||||
|
|
|
@ -185,14 +185,14 @@ void RenderPolySprite::Render(const TriMatrix &worldToClip, AActor *thing, subse
|
||||||
args.uniforms.destalpha = (uint32_t)(256 - thing->Alpha * 256);
|
args.uniforms.destalpha = (uint32_t)(256 - thing->Alpha * 256);
|
||||||
args.uniforms.srcalpha = (uint32_t)(thing->Alpha * 256);
|
args.uniforms.srcalpha = (uint32_t)(thing->Alpha * 256);
|
||||||
args.uniforms.color = 0xff000000 | thing->fillcolor;
|
args.uniforms.color = 0xff000000 | thing->fillcolor;
|
||||||
blendmode = TriBlendMode::Shaded;
|
blendmode = TriBlendMode::Stencil;
|
||||||
}
|
}
|
||||||
else if (thing->RenderStyle == LegacyRenderStyles[STYLE_AddStencil])
|
else if (thing->RenderStyle == LegacyRenderStyles[STYLE_AddStencil])
|
||||||
{
|
{
|
||||||
args.uniforms.destalpha = 256;
|
args.uniforms.destalpha = 256;
|
||||||
args.uniforms.srcalpha = (uint32_t)(thing->Alpha * 256) * 2; // Don't know this needs to be multiplied by two..
|
args.uniforms.srcalpha = (uint32_t)(thing->Alpha * 256) * 2; // Don't know this needs to be multiplied by two..
|
||||||
args.uniforms.color = 0xff000000 | thing->fillcolor;
|
args.uniforms.color = 0xff000000 | thing->fillcolor;
|
||||||
blendmode = TriBlendMode::Shaded;
|
blendmode = TriBlendMode::Stencil;
|
||||||
}
|
}
|
||||||
else if (thing->RenderStyle == LegacyRenderStyles[STYLE_Shaded])
|
else if (thing->RenderStyle == LegacyRenderStyles[STYLE_Shaded])
|
||||||
{
|
{
|
||||||
|
@ -215,6 +215,11 @@ void RenderPolySprite::Render(const TriMatrix &worldToClip, AActor *thing, subse
|
||||||
blendmode = args.translation ? TriBlendMode::TranslateAdd : TriBlendMode::Add;
|
blendmode = args.translation ? TriBlendMode::TranslateAdd : TriBlendMode::Add;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (blendmode == TriBlendMode::Shaded)
|
||||||
|
{
|
||||||
|
args.SetTexture(tex, thing->Translation, true);
|
||||||
|
}
|
||||||
|
|
||||||
if (!r_swtruecolor)
|
if (!r_swtruecolor)
|
||||||
{
|
{
|
||||||
uint32_t r = (args.uniforms.color >> 16) & 0xff;
|
uint32_t r = (args.uniforms.color >> 16) & 0xff;
|
||||||
|
|
|
@ -67,7 +67,7 @@ public:
|
||||||
translation = nullptr;
|
translation = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetTexture(FTexture *texture, uint32_t translationID)
|
void SetTexture(FTexture *texture, uint32_t translationID, bool forcePal = false)
|
||||||
{
|
{
|
||||||
if (translationID != 0xffffffff && translationID != 0)
|
if (translationID != 0xffffffff && translationID != 0)
|
||||||
{
|
{
|
||||||
|
@ -85,8 +85,17 @@ public:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SetTexture(texture);
|
if (forcePal)
|
||||||
|
{
|
||||||
|
textureWidth = texture->GetWidth();
|
||||||
|
textureHeight = texture->GetHeight();
|
||||||
|
texturePixels = texture->GetPixels();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetTexture(texture);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetColormap(FSWColormap *base_colormap)
|
void SetColormap(FSWColormap *base_colormap)
|
||||||
|
|
Loading…
Reference in a new issue