diff --git a/src/polyrenderer/drawers/poly_draw_args.h b/src/polyrenderer/drawers/poly_draw_args.h index 87cd6a191..c19bb6492 100644 --- a/src/polyrenderer/drawers/poly_draw_args.h +++ b/src/polyrenderer/drawers/poly_draw_args.h @@ -128,7 +128,7 @@ private: uint8_t mStencilWriteValue = 0; const uint8_t *mColormaps = nullptr; float mClipPlane[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; - TriBlendMode mBlendMode = TriBlendMode::Copy; + TriBlendMode mBlendMode = TriBlendMode::FillOpaque; uint32_t mLight = 0; uint32_t mSubsectorDepth = 0; uint32_t mColor = 0; diff --git a/src/polyrenderer/drawers/poly_drawer32_sse2.h b/src/polyrenderer/drawers/poly_drawer32_sse2.h index a3568b6c1..39a88c47e 100644 --- a/src/polyrenderer/drawers/poly_drawer32_sse2.h +++ b/src/polyrenderer/drawers/poly_drawer32_sse2.h @@ -53,7 +53,7 @@ public: Loop(args, thread); } } - else // no linear filtering for translated, shaded, fill or skycap + else // no linear filtering for translated, shaded, stencil, fill or skycap { if (is_simple_shade) { @@ -453,7 +453,7 @@ private: using namespace TriScreenDrawerModes; uint32_t texel; - if (SamplerT::Mode == (int)Samplers::Shaded || SamplerT::Mode == (int)Samplers::Fill) + if (SamplerT::Mode == (int)Samplers::Shaded || SamplerT::Mode == (int)Samplers::Stencil || SamplerT::Mode == (int)Samplers::Fill) { return color; } @@ -542,6 +542,14 @@ private: sampleshadeout += sampleshadeout >> 7; // 255 -> 256 return sampleshadeout; } + else if (SamplerT::Mode == (int)Samplers::Stencil) + { + uint32_t texelX = ((((uint32_t)u << 8) >> 16) * texWidth) >> 16; + uint32_t texelY = ((((uint32_t)v << 8) >> 16) * texHeight) >> 16; + unsigned int sampleshadeout = APART(texPixels[texelX * texHeight + texelY]); + sampleshadeout += sampleshadeout >> 7; // 255 -> 256 + return sampleshadeout; + } else { return 0; @@ -621,6 +629,8 @@ private: } else if (BlendT::Mode == (int)BlendModes::AddClampShaded) { + ifgshade0 = (ifgshade0 * srcalpha + 128) >> 8; + ifgshade1 = (ifgshade1 * srcalpha + 128) >> 8; __m128i alpha = _mm_set_epi16(ifgshade1, ifgshade1, ifgshade1, ifgshade1, ifgshade0, ifgshade0, ifgshade0, ifgshade0); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, alpha), 8); diff --git a/src/polyrenderer/drawers/poly_drawer8.h b/src/polyrenderer/drawers/poly_drawer8.h index 2ae40e524..6b02c52c3 100644 --- a/src/polyrenderer/drawers/poly_drawer8.h +++ b/src/polyrenderer/drawers/poly_drawer8.h @@ -272,7 +272,7 @@ private: using namespace TriScreenDrawerModes; uint8_t texel; - if (SamplerT::Mode == (int)Samplers::Shaded || SamplerT::Mode == (int)Samplers::Fill) + if (SamplerT::Mode == (int)Samplers::Shaded || SamplerT::Mode == (int)Samplers::Stencil || SamplerT::Mode == (int)Samplers::Fill) { return color; } @@ -301,13 +301,14 @@ private: if (a == 256) return texel; + uint32_t capcolor = GPalette.BaseColors[color].d; uint32_t texelrgb = GPalette.BaseColors[texel].d; uint32_t r = RPART(texelrgb); uint32_t g = GPART(texelrgb); uint32_t b = BPART(texelrgb); - uint32_t capcolor_red = RPART(color); - uint32_t capcolor_green = GPART(color); - uint32_t capcolor_blue = BPART(color); + uint32_t capcolor_red = RPART(capcolor); + uint32_t capcolor_green = GPART(capcolor); + uint32_t capcolor_blue = BPART(capcolor); r = (r * a + capcolor_red * inv_a + 127) >> 8; g = (g * a + capcolor_green * inv_a + 127) >> 8; b = (b * a + capcolor_blue * inv_a + 127) >> 8; @@ -331,6 +332,12 @@ private: sampleshadeout += sampleshadeout >> 7; // 255 -> 256 return sampleshadeout; } + else if (SamplerT::Mode == (int)Samplers::Stencil) + { + uint32_t texelX = ((((uint32_t)u << 8) >> 16) * texWidth) >> 16; + uint32_t texelY = ((((uint32_t)v << 8) >> 16) * texHeight) >> 16; + return texPixels[texelX * texHeight + texelY] != 0 ? 256 : 0; + } else { return 0; @@ -372,6 +379,7 @@ private: } else if (BlendT::Mode == (int)BlendModes::Shaded) { + fgshade = (fgshade * srcalpha + 128) >> 8; uint32_t alpha = fgshade; uint32_t inv_alpha = 256 - fgshade; int32_t fg_r = GPalette.BaseColors[shadedfg].r; @@ -390,6 +398,7 @@ private: } else if (BlendT::Mode == (int)BlendModes::AddClampShaded) { + fgshade = (fgshade * srcalpha + 128) >> 8; uint32_t alpha = fgshade; int32_t fg_r = GPalette.BaseColors[shadedfg].r; int32_t fg_g = GPalette.BaseColors[shadedfg].g; @@ -417,21 +426,21 @@ private: if (BlendT::Mode == (int)BlendModes::AddClamp) { - fg_r = MIN((fg_r * srcalpha + bg_r * destalpha + 127) >> 8, 255); - fg_g = MIN((fg_g * srcalpha + bg_g * destalpha + 127) >> 8, 255); - fg_b = MIN((fg_b * srcalpha + bg_b * destalpha + 127) >> 8, 255); + fg_r = MIN(int32_t(fg_r * srcalpha + bg_r * destalpha + 127) >> 8, 255); + fg_g = MIN(int32_t(fg_g * srcalpha + bg_g * destalpha + 127) >> 8, 255); + fg_b = MIN(int32_t(fg_b * srcalpha + bg_b * destalpha + 127) >> 8, 255); } else if (BlendT::Mode == (int)BlendModes::SubClamp) { - fg_r = MAX((fg_r * srcalpha - bg_r * destalpha + 127) >> 8, 0); - fg_g = MAX((fg_g * srcalpha - bg_g * destalpha + 127) >> 8, 0); - fg_b = MAX((fg_b * srcalpha - bg_b * destalpha + 127) >> 8, 0); + fg_r = MAX(int32_t(fg_r * srcalpha - bg_r * destalpha + 127) >> 8, 0); + fg_g = MAX(int32_t(fg_g * srcalpha - bg_g * destalpha + 127) >> 8, 0); + fg_b = MAX(int32_t(fg_b * srcalpha - bg_b * destalpha + 127) >> 8, 0); } else if (BlendT::Mode == (int)BlendModes::RevSubClamp) { - fg_r = MAX((bg_r * srcalpha - fg_r * destalpha + 127) >> 8, 0); - fg_g = MAX((bg_g * srcalpha - fg_g * destalpha + 127) >> 8, 0); - fg_b = MAX((bg_b * srcalpha - fg_b * destalpha + 127) >> 8, 0); + fg_r = MAX(int32_t(bg_r * srcalpha - fg_r * destalpha + 127) >> 8, 0); + fg_g = MAX(int32_t(bg_g * srcalpha - fg_g * destalpha + 127) >> 8, 0); + fg_b = MAX(int32_t(bg_b * srcalpha - fg_b * destalpha + 127) >> 8, 0); } shadedfg = RGB256k.All[((fg_r >> 2) << 12) | ((fg_g >> 2) << 6) | (fg_b >> 2)]; diff --git a/src/polyrenderer/drawers/poly_triangle.cpp b/src/polyrenderer/drawers/poly_triangle.cpp index d07102f1e..28dd2da1c 100644 --- a/src/polyrenderer/drawers/poly_triangle.cpp +++ b/src/polyrenderer/drawers/poly_triangle.cpp @@ -99,10 +99,8 @@ void PolyTriangleDrawer::draw_arrays(const PolyDrawArgs &drawargs, WorkerThreadD { int bmode = (int)drawargs.BlendMode(); - if (drawargs.WriteColor() && drawargs.TexturePixels()) - drawfuncs[num_drawfuncs++] = dest_bgra ? ScreenTriangle::TriDraw32[bmode] : ScreenTriangle::TriDraw8[bmode]; - else if (drawargs.WriteColor()) - drawfuncs[num_drawfuncs++] = dest_bgra ? ScreenTriangle::TriFill32[bmode] : ScreenTriangle::TriFill8[bmode]; + if (drawargs.WriteColor()) + drawfuncs[num_drawfuncs++] = dest_bgra ? ScreenTriangle::TriDrawers32[bmode] : ScreenTriangle::TriDrawers8[bmode]; } if (drawargs.WriteStencil()) diff --git a/src/polyrenderer/drawers/screen_triangle.cpp b/src/polyrenderer/drawers/screen_triangle.cpp index ab0928d0e..d1fe49513 100644 --- a/src/polyrenderer/drawers/screen_triangle.cpp +++ b/src/polyrenderer/drawers/screen_triangle.cpp @@ -922,87 +922,62 @@ void ScreenTriangle::SubsectorWrite(const TriDrawTriangleArgs *args, WorkerThrea } } -std::vector ScreenTriangle::TriDraw8 = +std::vector ScreenTriangle::TriDrawers8 = { - &TriScreenDrawer8::Execute, // "Copy", "opaque", false - &TriScreenDrawer8::Execute, // "AlphaBlend", "masked", false - &TriScreenDrawer8::Execute, // "AddSolid", "translucent", false - &TriScreenDrawer8::Execute, // "Add", "add", false - &TriScreenDrawer8::Execute, // "Sub", "sub", false - &TriScreenDrawer8::Execute, // "RevSub", "revsub", false - &TriScreenDrawer8::Execute, // "Stencil", "stencil", false - &TriScreenDrawer8::Execute, // "Shaded", "shaded", false - &TriScreenDrawer8::Execute, // "TranslateCopy", "opaque", true - &TriScreenDrawer8::Execute, // "TranslateAlphaBlend", "masked", true - &TriScreenDrawer8::Execute, // "TranslateAdd", "add", true - &TriScreenDrawer8::Execute, // "TranslateSub", "sub", true - &TriScreenDrawer8::Execute, // "TranslateRevSub", "revsub", true - &TriScreenDrawer8::Execute, // "AddSrcColorOneMinusSrcColor", "addsrccolor", false - &TriScreenDrawer8::Execute // "Skycap", "skycap", false -}; - -std::vector ScreenTriangle::TriFill8 = -{ - &TriScreenDrawer8::Execute, // "Copy", "opaque", false - &TriScreenDrawer8::Execute, // "AlphaBlend", "masked", false - &TriScreenDrawer8::Execute, // "AddSolid", "translucent", false - &TriScreenDrawer8::Execute, // "Add", "add", false - &TriScreenDrawer8::Execute, // "Sub", "sub", false - &TriScreenDrawer8::Execute, // "RevSub", "revsub", false - &TriScreenDrawer8::Execute, // "Stencil", "stencil", false - &TriScreenDrawer8::Execute, // "Shaded", "shaded", false - &TriScreenDrawer8::Execute, // "TranslateCopy", "opaque", true - &TriScreenDrawer8::Execute, // "TranslateAlphaBlend", "masked", true - &TriScreenDrawer8::Execute, // "TranslateAdd", "add", true - &TriScreenDrawer8::Execute, // "TranslateSub", "sub", true - &TriScreenDrawer8::Execute, // "TranslateRevSub", "revsub", true - &TriScreenDrawer8::Execute, // "AddSrcColorOneMinusSrcColor", "addsrccolor", false - &TriScreenDrawer8::Execute // "Skycap", "skycap", false + &TriScreenDrawer8::Execute, // TextureOpaque + &TriScreenDrawer8::Execute, // TextureMasked + &TriScreenDrawer8::Execute, // TextureAdd + &TriScreenDrawer8::Execute, // TextureSub + &TriScreenDrawer8::Execute, // TextureRevSub + &TriScreenDrawer8::Execute, // TextureAddSrcColor + &TriScreenDrawer8::Execute, // TranslatedOpaque + &TriScreenDrawer8::Execute, // TranslatedMasked + &TriScreenDrawer8::Execute, // TranslatedAdd + &TriScreenDrawer8::Execute, // TranslatedSub + &TriScreenDrawer8::Execute, // TranslatedRevSub + &TriScreenDrawer8::Execute, // TranslatedAddSrcColor + &TriScreenDrawer8::Execute, // Shaded + &TriScreenDrawer8::Execute, // AddShaded + &TriScreenDrawer8::Execute, // Stencil + &TriScreenDrawer8::Execute, // AddStencil + &TriScreenDrawer8::Execute, // FillOpaque + &TriScreenDrawer8::Execute, // FillAdd + &TriScreenDrawer8::Execute, // FillSub + &TriScreenDrawer8::Execute, // FillRevSub + &TriScreenDrawer8::Execute, // FillAddSrcColor + &TriScreenDrawer8::Execute // Skycap }; #ifdef NO_SSE -std::vector ScreenTriangle::TriDraw32; -std::vector ScreenTriangle::TriFill32; +std::vector ScreenTriangle::TriDrawers32; #else -std::vector ScreenTriangle::TriDraw32 = +std::vector ScreenTriangle::TriDrawers32 = { - &TriScreenDrawer32::Execute, // "Copy", "opaque", false - &TriScreenDrawer32::Execute, // "AlphaBlend", "masked", false - &TriScreenDrawer32::Execute, // "AddSolid", "translucent", false - &TriScreenDrawer32::Execute, // "Add", "add", false - &TriScreenDrawer32::Execute, // "Sub", "sub", false - &TriScreenDrawer32::Execute, // "RevSub", "revsub", false - &TriScreenDrawer32::Execute, // "Stencil", "stencil", false - &TriScreenDrawer32::Execute, // "Shaded", "shaded", false - &TriScreenDrawer32::Execute, // "TranslateCopy", "opaque", true - &TriScreenDrawer32::Execute, // "TranslateAlphaBlend", "masked", true - &TriScreenDrawer32::Execute, // "TranslateAdd", "add", true - &TriScreenDrawer32::Execute, // "TranslateSub", "sub", true - &TriScreenDrawer32::Execute, // "TranslateRevSub", "revsub", true - &TriScreenDrawer32::Execute, // "AddSrcColorOneMinusSrcColor", "addsrccolor", false - &TriScreenDrawer32::Execute // "Skycap", "skycap", false -}; - -std::vector ScreenTriangle::TriFill32 = -{ - &TriScreenDrawer32::Execute, // "Copy", "opaque", false - &TriScreenDrawer32::Execute, // "AlphaBlend", "masked", false - &TriScreenDrawer32::Execute, // "AddSolid", "translucent", false - &TriScreenDrawer32::Execute, // "Add", "add", false - &TriScreenDrawer32::Execute, // "Sub", "sub", false - &TriScreenDrawer32::Execute, // "RevSub", "revsub", false - &TriScreenDrawer32::Execute, // "Stencil", "stencil", false - &TriScreenDrawer32::Execute, // "Shaded", "shaded", false - &TriScreenDrawer32::Execute, // "TranslateCopy", "opaque", true - &TriScreenDrawer32::Execute, // "TranslateAlphaBlend", "masked", true - &TriScreenDrawer32::Execute, // "TranslateAdd", "add", true - &TriScreenDrawer32::Execute, // "TranslateSub", "sub", true - &TriScreenDrawer32::Execute, // "TranslateRevSub", "revsub", true - &TriScreenDrawer32::Execute, // "AddSrcColorOneMinusSrcColor", "addsrccolor", false - &TriScreenDrawer32::Execute // "Skycap", "skycap", false + &TriScreenDrawer32::Execute, // TextureOpaque + &TriScreenDrawer32::Execute, // TextureMasked + &TriScreenDrawer32::Execute, // TextureAdd + &TriScreenDrawer32::Execute, // TextureSub + &TriScreenDrawer32::Execute, // TextureRevSub + &TriScreenDrawer32::Execute, // TextureAddSrcColor + &TriScreenDrawer32::Execute, // TranslatedOpaque + &TriScreenDrawer32::Execute, // TranslatedMasked + &TriScreenDrawer32::Execute, // TranslatedAdd + &TriScreenDrawer32::Execute, // TranslatedSub + &TriScreenDrawer32::Execute, // TranslatedRevSub + &TriScreenDrawer32::Execute, // TranslatedAddSrcColor + &TriScreenDrawer32::Execute, // Shaded + &TriScreenDrawer32::Execute, // AddShaded + &TriScreenDrawer32::Execute, // Stencil + &TriScreenDrawer32::Execute, // AddStencil + &TriScreenDrawer32::Execute, // FillOpaque + &TriScreenDrawer32::Execute, // FillAdd + &TriScreenDrawer32::Execute, // FillSub + &TriScreenDrawer32::Execute, // FillRevSub + &TriScreenDrawer32::Execute, // FillAddSrcColor + &TriScreenDrawer32::Execute // Skycap }; #endif diff --git a/src/polyrenderer/drawers/screen_triangle.h b/src/polyrenderer/drawers/screen_triangle.h index 81d7cdb68..513d6e760 100644 --- a/src/polyrenderer/drawers/screen_triangle.h +++ b/src/polyrenderer/drawers/screen_triangle.h @@ -88,25 +88,30 @@ struct TriDrawTriangleArgs enum class TriBlendMode { - Copy, // blend_copy(shade(fg)) - AlphaBlend, // blend_alpha_blend(shade(fg), bg) - AddSolid, // blend_add(shade(fg), bg, srcalpha, 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)) - RevSub, // blend_revsub(shade(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))) - TranslateAlphaBlend, // blend_alpha_blend(shade(translate(fg)), bg) - TranslateAdd, // blend_add(shade(translate(fg)), bg, srcalpha, calc_blend_bgalpha(fg, destalpha)) - TranslateSub, // blend_sub(shade(translate(fg)), bg, srcalpha, calc_blend_bgalpha(fg, destalpha)) - TranslateRevSub,// blend_revsub(shade(translate(fg)), bg, srcalpha, calc_blend_bgalpha(fg, destalpha)) - AddSrcColorOneMinusSrcColor, // glBlendMode(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR) used by GZDoom's fullbright additive sprites - Skycap // Fade to sky color when the V texture coordinate go beyond the [-1, 1] range + TextureOpaque, + TextureMasked, + TextureAdd, + TextureSub, + TextureRevSub, + TextureAddSrcColor, + TranslatedOpaque, + TranslatedMasked, + TranslatedAdd, + TranslatedSub, + TranslatedRevSub, + TranslatedAddSrcColor, + Shaded, + AddShaded, + Stencil, + AddStencil, + FillOpaque, + FillAdd, + FillSub, + FillRevSub, + FillAddSrcColor, + Skycap }; -inline int NumTriBlendModes() { return (int)TriBlendMode::Skycap + 1; } - class ScreenTriangle { public: @@ -115,10 +120,8 @@ public: static void StencilWrite(const TriDrawTriangleArgs *args, WorkerThreadData *thread); static void SubsectorWrite(const TriDrawTriangleArgs *args, WorkerThreadData *thread); - static std::vector TriDraw8; - static std::vector TriDraw32; - static std::vector TriFill8; - static std::vector TriFill32; + static std::vector TriDrawers8; + static std::vector TriDrawers32; }; struct ScreenTriangleStepVariables @@ -147,10 +150,11 @@ namespace TriScreenDrawerModes struct SimpleShade { static const int Mode = (int)ShadeMode::Simple; }; struct AdvancedShade { static const int Mode = (int)ShadeMode::Advanced; }; - enum class Samplers { Texture, Fill, Shaded, Translated, Skycap }; + enum class Samplers { Texture, Fill, Shaded, Stencil, Translated, Skycap }; struct TextureSampler { static const int Mode = (int)Samplers::Texture; }; struct FillSampler { static const int Mode = (int)Samplers::Fill; }; struct ShadedSampler { static const int Mode = (int)Samplers::Shaded; }; + struct StencilSampler { static const int Mode = (int)Samplers::Stencil; }; struct TranslatedSampler { static const int Mode = (int)Samplers::Translated; }; struct SkycapSampler { static const int Mode = (int)Samplers::Skycap; }; } diff --git a/src/polyrenderer/scene/poly_plane.cpp b/src/polyrenderer/scene/poly_plane.cpp index d41328d57..a15e74af4 100644 --- a/src/polyrenderer/scene/poly_plane.cpp +++ b/src/polyrenderer/scene/poly_plane.cpp @@ -133,7 +133,7 @@ void RenderPolyPlane::Render3DFloor(const TriMatrix &worldToClip, const PolyClip args.SetLight(GetColorTable(sub->sector->Colormap), lightlevel, PolyRenderer::Instance()->Light.WallGlobVis(foggy), false); args.SetSubsectorDepth(subsectorDepth); args.SetTransform(&worldToClip); - args.SetStyle(TriBlendMode::Copy); + args.SetStyle(TriBlendMode::TextureOpaque); args.SetFaceCullCCW(true); args.SetStencilTestValue(stencilValue); args.SetWriteStencil(true, stencilValue + 1); @@ -312,7 +312,7 @@ void RenderPolyPlane::Render(const TriMatrix &worldToClip, const PolyClipPlane & if (!isSky) { args.SetTexture(tex); - args.SetStyle(TriBlendMode::Copy); + args.SetStyle(TriBlendMode::TextureOpaque); args.DrawArray(vertices, sub->numlines, PolyDrawMode::TriangleFan); } else diff --git a/src/polyrenderer/scene/poly_scene.cpp b/src/polyrenderer/scene/poly_scene.cpp index 3aeda994c..a655ca845 100644 --- a/src/polyrenderer/scene/poly_scene.cpp +++ b/src/polyrenderer/scene/poly_scene.cpp @@ -253,7 +253,7 @@ void RenderPolyScene::RenderPortals(int portalDepth) args.SetLight(&NormalLight, 255, PolyRenderer::Instance()->Light.WallGlobVis(foggy), true); args.SetColor(0, 0); args.SetClipPlane(PortalPlane); - args.SetStyle(TriBlendMode::Copy); + args.SetStyle(TriBlendMode::FillOpaque); for (auto &portal : SectorPortals) { diff --git a/src/polyrenderer/scene/poly_sky.cpp b/src/polyrenderer/scene/poly_sky.cpp index 374163f96..9d27d45cb 100644 --- a/src/polyrenderer/scene/poly_sky.cpp +++ b/src/polyrenderer/scene/poly_sky.cpp @@ -70,18 +70,20 @@ void PolySkyDome::Render(const TriMatrix &worldToClip) uint32_t topcapcolor = frontskytex->GetSkyCapColor(false); uint32_t bottomcapcolor = frontskytex->GetSkyCapColor(true); + uint8_t topcapindex = RGB256k.All[((RPART(topcapcolor) >> 2) << 12) | ((GPART(topcapcolor) >> 2) << 6) | (BPART(topcapcolor) >> 2)]; + uint8_t bottomcapindex = RGB256k.All[((RPART(bottomcapcolor) >> 2) << 12) | ((GPART(bottomcapcolor) >> 2) << 6) | (BPART(bottomcapcolor) >> 2)]; for (int i = 1; i <= mRows; i++) { - RenderRow(args, i, topcapcolor); - RenderRow(args, rc + i, bottomcapcolor); + RenderRow(args, i, topcapcolor, topcapindex); + RenderRow(args, rc + i, bottomcapcolor, bottomcapindex); } } -void PolySkyDome::RenderRow(PolyDrawArgs &args, int row, uint32_t capcolor) +void PolySkyDome::RenderRow(PolyDrawArgs &args, int row, uint32_t capcolor, uint8_t capcolorindex) { args.SetFaceCullCCW(false); - args.SetColor(capcolor, 0); + args.SetColor(capcolor, capcolorindex); args.SetStyle(TriBlendMode::Skycap); args.DrawArray(&mVertices[mPrimStart[row]], mPrimStart[row + 1] - mPrimStart[row], PolyDrawMode::TriangleStrip); } @@ -93,7 +95,7 @@ void PolySkyDome::RenderCapColorRow(PolyDrawArgs &args, FTexture *skytex, int ro args.SetFaceCullCCW(bottomCap); args.SetColor(solid, palsolid); - args.SetStyle(TriBlendMode::Copy); + args.SetStyle(TriBlendMode::FillOpaque); args.DrawArray(&mVertices[mPrimStart[row]], mPrimStart[row + 1] - mPrimStart[row], PolyDrawMode::TriangleFan); } diff --git a/src/polyrenderer/scene/poly_sky.h b/src/polyrenderer/scene/poly_sky.h index 1a8cd8ef2..87d6cabce 100644 --- a/src/polyrenderer/scene/poly_sky.h +++ b/src/polyrenderer/scene/poly_sky.h @@ -38,7 +38,7 @@ private: void SkyVertex(int r, int c, bool yflip); void CreateSkyHemisphere(bool zflip); void CreateDome(); - void RenderRow(PolyDrawArgs &args, int row, uint32_t capcolor); + void RenderRow(PolyDrawArgs &args, int row, uint32_t capcolor, uint8_t capcolorindex); void RenderCapColorRow(PolyDrawArgs &args, FTexture *skytex, int row, bool bottomCap); TriVertex SetVertexXYZ(float xx, float yy, float zz, float uu = 0, float vv = 0); diff --git a/src/polyrenderer/scene/poly_sprite.cpp b/src/polyrenderer/scene/poly_sprite.cpp index 2a98af721..5d0587432 100644 --- a/src/polyrenderer/scene/poly_sprite.cpp +++ b/src/polyrenderer/scene/poly_sprite.cpp @@ -150,33 +150,33 @@ void RenderPolySprite::Render(const TriMatrix &worldToClip, const PolyClipPlane if (thing->RenderStyle == LegacyRenderStyles[STYLE_Normal] || (r_drawfuzz == 0 && thing->RenderStyle == LegacyRenderStyles[STYLE_OptFuzzy])) { - args.SetStyle(args.Translation() ? TriBlendMode::TranslateAdd : TriBlendMode::Add, 1.0, 0.0); + args.SetStyle(args.Translation() ? TriBlendMode::TranslatedAdd : TriBlendMode::TextureAdd, 1.0, 0.0); } else if (thing->RenderStyle == LegacyRenderStyles[STYLE_Add] && fullbrightSprite && thing->Alpha == 1.0 && !args.Translation()) { - args.SetStyle(TriBlendMode::AddSrcColorOneMinusSrcColor, 1.0, 1.0); + args.SetStyle(TriBlendMode::TextureAddSrcColor, 1.0, 1.0); } else if (thing->RenderStyle == LegacyRenderStyles[STYLE_Add]) { - args.SetStyle(args.Translation() ? TriBlendMode::TranslateAdd : TriBlendMode::Add, thing->Alpha, 1.0); + args.SetStyle(args.Translation() ? TriBlendMode::TranslatedAdd : TriBlendMode::TextureAdd, thing->Alpha, 1.0); } else if (thing->RenderStyle == LegacyRenderStyles[STYLE_Subtract]) { - args.SetStyle(args.Translation() ? TriBlendMode::TranslateRevSub : TriBlendMode::RevSub, thing->Alpha, 1.0); + args.SetStyle(args.Translation() ? TriBlendMode::TranslatedRevSub : TriBlendMode::TextureRevSub, thing->Alpha, 1.0); } else if (thing->RenderStyle == LegacyRenderStyles[STYLE_SoulTrans]) { - args.SetStyle(args.Translation() ? TriBlendMode::TranslateAdd : TriBlendMode::Add, transsouls, 1.0 - transsouls); + args.SetStyle(args.Translation() ? TriBlendMode::TranslatedAdd : TriBlendMode::TextureAdd, transsouls, 1.0 - transsouls); } else if (thing->RenderStyle == LegacyRenderStyles[STYLE_Fuzzy] || (r_drawfuzz == 2 && thing->RenderStyle == LegacyRenderStyles[STYLE_OptFuzzy])) { // NYI - Fuzzy - for now, just a copy of "Shadow" - args.SetStyle(args.Translation() ? TriBlendMode::TranslateAdd : TriBlendMode::Add, 0.0, 160 / 255.0); + args.SetStyle(args.Translation() ? TriBlendMode::TranslatedAdd : TriBlendMode::TextureAdd, 0.0, 160 / 255.0); } else if (thing->RenderStyle == LegacyRenderStyles[STYLE_Shadow] || (r_drawfuzz == 1 && thing->RenderStyle == LegacyRenderStyles[STYLE_OptFuzzy])) { - args.SetStyle(args.Translation() ? TriBlendMode::TranslateAdd : TriBlendMode::Add, 0.0, 160 / 255.0); + args.SetStyle(args.Translation() ? TriBlendMode::TranslatedAdd : TriBlendMode::TextureAdd, 0.0, 160 / 255.0); } else if (thing->RenderStyle == LegacyRenderStyles[STYLE_TranslucentStencil]) { @@ -186,23 +186,23 @@ void RenderPolySprite::Render(const TriMatrix &worldToClip, const PolyClipPlane else if (thing->RenderStyle == LegacyRenderStyles[STYLE_AddStencil]) { args.SetColor(0xff000000 | thing->fillcolor, thing->fillcolor >> 24); - args.SetStyle(TriBlendMode::Stencil, thing->Alpha, 1.0 - thing->Alpha); + args.SetStyle(TriBlendMode::AddStencil, thing->Alpha, 1.0); } else if (thing->RenderStyle == LegacyRenderStyles[STYLE_Shaded]) { - args.SetColor(0, 0); + args.SetColor(0xff000000 | thing->fillcolor, thing->fillcolor >> 24); args.SetStyle(TriBlendMode::Shaded, thing->Alpha, 1.0 - thing->Alpha); args.SetTexture(tex, thing->Translation, true); } else if (thing->RenderStyle == LegacyRenderStyles[STYLE_AddShaded]) { - args.SetColor(0, 0); - args.SetStyle(TriBlendMode::Shaded, thing->Alpha, 1.0 - thing->Alpha); + args.SetColor(0xff000000 | thing->fillcolor, thing->fillcolor >> 24); + args.SetStyle(TriBlendMode::AddShaded, thing->Alpha, 1.0); args.SetTexture(tex, thing->Translation, true); } else { - args.SetStyle(args.Translation() ? TriBlendMode::TranslateAdd : TriBlendMode::Add, thing->Alpha, 1.0 - thing->Alpha); + args.SetStyle(args.Translation() ? TriBlendMode::TranslatedAdd : TriBlendMode::TextureAdd, thing->Alpha, 1.0 - thing->Alpha); } args.SetSubsectorDepthTest(true); diff --git a/src/polyrenderer/scene/poly_wall.cpp b/src/polyrenderer/scene/poly_wall.cpp index 263487f70..a85dcdc57 100644 --- a/src/polyrenderer/scene/poly_wall.cpp +++ b/src/polyrenderer/scene/poly_wall.cpp @@ -272,12 +272,15 @@ void RenderPolyWall::Render(const TriMatrix &worldToClip, const PolyClipPlane &c } else if (!Masked) { - args.SetStyle(TriBlendMode::Copy); + args.SetStyle(TriBlendMode::TextureOpaque); args.DrawArray(vertices, 4, PolyDrawMode::TriangleFan); } else { - args.SetStyle((Line->flags & ML_ADDTRANS) ? TriBlendMode::Add : TriBlendMode::AlphaBlend, Line->alpha, 1.0); + bool addtrans = !!(Line->flags & ML_ADDTRANS); + double srcalpha = MIN(Line->alpha, 1.0); + double destalpha = addtrans ? 1.0 : 1.0 - srcalpha; + args.SetStyle(TriBlendMode::TextureAdd, srcalpha, destalpha); args.SetSubsectorDepthTest(true); args.SetWriteSubsectorDepth(true); args.SetWriteStencil(false); diff --git a/src/polyrenderer/scene/poly_wallsprite.cpp b/src/polyrenderer/scene/poly_wallsprite.cpp index 8108849b9..a7a1420e5 100644 --- a/src/polyrenderer/scene/poly_wallsprite.cpp +++ b/src/polyrenderer/scene/poly_wallsprite.cpp @@ -109,6 +109,6 @@ void RenderPolyWallSprite::Render(const TriMatrix &worldToClip, const PolyClipPl args.SetSubsectorDepthTest(true); args.SetWriteSubsectorDepth(false); args.SetWriteStencil(false); - args.SetStyle(TriBlendMode::AlphaBlend); + args.SetStyle(TriBlendMode::TextureMasked); args.DrawArray(vertices, 4, PolyDrawMode::TriangleFan); }