From 114fda1ed5bf6445b25ed668d3a7c326f79327d8 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 19 Nov 2016 13:32:57 +0100 Subject: [PATCH] Added missing TranslateAlphaBlend and created a helper function for specifying the translation --- .../fixedfunction/drawtrianglecodegen.cpp | 4 ++++ src/r_compiler/llvmdrawers.h | 1 + src/r_poly_sprite.cpp | 9 +++++-- src/r_poly_triangle.h | 24 +++++++++++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/r_compiler/fixedfunction/drawtrianglecodegen.cpp b/src/r_compiler/fixedfunction/drawtrianglecodegen.cpp index 21995bb63..1ad98a8fb 100644 --- a/src/r_compiler/fixedfunction/drawtrianglecodegen.cpp +++ b/src/r_compiler/fixedfunction/drawtrianglecodegen.cpp @@ -514,6 +514,10 @@ void DrawTriangleCodegen::ProcessPixel(SSAUBytePtr buffer, SSAIntPtr subsectorbu fg = TranslateSample(uvoffset); output = blend_copy(shade_bgra_simple(fg, currentlight)); break; + case TriBlendMode::TranslateAlphaBlend: + fg = TranslateSample(uvoffset); + output = blend_alpha_blend(shade_bgra_simple(fg, currentlight), bg); break; + break; case TriBlendMode::TranslateAdd: fg = TranslateSample(uvoffset); output = blend_add(shade_bgra_simple(fg, currentlight), bg, srcalpha, calc_blend_bgalpha(fg, destalpha)); diff --git a/src/r_compiler/llvmdrawers.h b/src/r_compiler/llvmdrawers.h index 3b1396283..e42153743 100644 --- a/src/r_compiler/llvmdrawers.h +++ b/src/r_compiler/llvmdrawers.h @@ -282,6 +282,7 @@ enum class TriBlendMode RevSub, // blend_revsub(shade(fg), bg, srcalpha, calc_blend_bgalpha(fg, destalpha)) Shaded, // blend_add(color, bg, fg.a, 1 - fg.a) 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)) diff --git a/src/r_poly_sprite.cpp b/src/r_poly_sprite.cpp index 43bdf40af..ff102366a 100644 --- a/src/r_poly_sprite.cpp +++ b/src/r_poly_sprite.cpp @@ -135,8 +135,13 @@ void RenderPolySprite::Render(const TriMatrix &worldToClip, AActor *thing, subse args.ccw = true; args.stenciltestvalue = 0; args.stencilwritevalue = 1; - args.SetTexture(tex); - PolyTriangleDrawer::draw(args, TriDrawVariant::DrawSubsector, TriBlendMode::AlphaBlend); + args.translation = nullptr; + args.SetTexture(tex, thing->Translation); + + if (args.translation) + PolyTriangleDrawer::draw(args, TriDrawVariant::DrawSubsector, TriBlendMode::TranslateAlphaBlend); + else + PolyTriangleDrawer::draw(args, TriDrawVariant::DrawSubsector, TriBlendMode::AlphaBlend); } bool RenderPolySprite::IsThingCulled(AActor *thing) diff --git a/src/r_poly_triangle.h b/src/r_poly_triangle.h index cc8558985..ad00d1a67 100644 --- a/src/r_poly_triangle.h +++ b/src/r_poly_triangle.h @@ -25,6 +25,7 @@ #define __R_POLY_TRIANGLE__ #include "r_triangle.h" +#include "r_data/r_translate.h" struct TriDrawTriangleArgs; @@ -51,6 +52,29 @@ public: texturePixels = (const uint8_t *)texture->GetPixelsBgra(); else texturePixels = texture->GetPixels(); + translation = nullptr; + } + + void SetTexture(FTexture *texture, uint32_t translationID) + { + if (translationID != -1 && translationID != 0) + { + FRemapTable *table = TranslationToTable(translationID); + if (table != nullptr && !table->Inactive) + { + if (r_swtruecolor) + translation = (uint8_t*)table->Palette; + else + translation = table->Remap; + + textureWidth = texture->GetWidth(); + textureHeight = texture->GetHeight(); + texturePixels = texture->GetPixels(); + return; + } + } + + SetTexture(texture); } };