Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

additive translucency for fullbright sprites #1968

Open
fabiangreffrath opened this issue Oct 30, 2024 · 6 comments · May be fixed by #1974
Open

additive translucency for fullbright sprites #1968

fabiangreffrath opened this issue Oct 30, 2024 · 6 comments · May be fixed by #1974

Comments

@fabiangreffrath
Copy link
Owner

Someone asked for this in the DW forums. Crispy has this for the truecolor rederer, no idea how well this works with a paletted renderer and a LUT.

@rfomin
Copy link
Collaborator

rfomin commented Oct 30, 2024

@fabiangreffrath
Copy link
Owner Author

Cool. I think we already have the necessary code "borrowed" into Woof anyway.

@fabiangreffrath
Copy link
Owner Author

Hm, not sure if we should got with this approach, though. Additive translucency is pretty unambiguous, i.e. there are no varying levels of foreground translucency. Instead of converting pixel colors to RGB, reduce their bit depth and pass them into a LUT, we could just as well create a LUT for the palette indices.

This proof-of-concept patch replaces the current main_tranmap (run with -tranmap parameter). We should of course create an additional one and use that for fullbright sprites only.

diff --git a/src/r_data.c b/src/r_data.c
index f8dd7282..c5504e51 100644
--- a/src/r_data.c
+++ b/src/r_data.c
@@ -31,6 +31,7 @@
 #include "doomstat.h"
 #include "i_printf.h"
 #include "i_system.h"
+#include "i_video.h"
 #include "info.h"
 #include "m_argv.h" // M_CheckParm()
 #include "m_fixed.h"
@@ -921,6 +922,8 @@ int tran_filter_pct = 66;       // filter percent
 
 #define TSC 12        /* number of fixed point digits in filter percent */
 
+enum {r, g, b};
+
 void R_InitTranMap(int progress)
 {
   int lump = W_CheckNumForName("TRANMAP");
@@ -959,6 +962,24 @@ void R_InitTranMap(int progress)
           fread(main_tranmap, 256, 256, cachefp) != 256 ||  // killough 4/11/98
           force_rebuild)
         {
+        byte *tp = main_tranmap;
+
+        for (int i = 0; i < 256; i++)
+        {
+            for (int j = 0; j < 256; j++)
+            {
+                byte *bg = playpal + 3*i;
+                byte *fg = playpal + 3*j;
+                byte blend[3];
+
+                blend[r] = MIN(fg[r] + bg[r], 255);
+                blend[g] = MIN(fg[g] + bg[g], 255);
+                blend[b] = MIN(fg[b] + bg[b], 255);
+
+                *tp++ = I_GetNearestColor(playpal, blend[r], blend[g], blend[b]);
+            }
+        }
+/*
           long pal[3][256], tot[256], pal_w1[3][256];
           long w1 = ((unsigned long) tran_filter_pct<<TSC)/100;
           long w2 = (1l<<TSC)-w1;
@@ -1021,10 +1042,11 @@ void R_InitTranMap(int progress)
                     while (--color >= 0);
                   }
               }
+          }
+*/
             // [FG] finish progress line
             if (progress)
               I_PutChar(VB_INFO, '\n');
-          }
           if (cachefp && !force_rebuild) // write out the cached translucency map
             {
               cache.pct = tran_filter_pct;

It still looks a bit weird, though:

woof0000

@rfomin
Copy link
Collaborator

rfomin commented Oct 31, 2024

It still looks a bit weird, though:

Yes, it dosen't look right.
Eternity r_tlstyle 1 (Boom)
image

Eternity r_tlstyle 2 (Additive)
image

@fabiangreffrath
Copy link
Owner Author

Yes, it dosen't look right.

Should we offer it anyway? 🤷

@fabiangreffrath
Copy link
Owner Author

Probably a bit better (i.e. less orange/pink) if we take preference from the red and green channels:

diff --git a/src/g_game.c b/src/g_game.c
index 8f619bea..b8ee5af7 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -687,7 +687,7 @@ static void AdjustWeaponSelection(int *newweapon)
 
 static boolean FilterDeathUseAction(void)
 {
-    if (players[consoleplayer].playerstate & PST_DEAD)
+    if (gamestate == GS_LEVEL && (players[consoleplayer].playerstate & PST_DEAD))
     {
         switch (death_use_action)
         {
diff --git a/src/r_data.c b/src/r_data.c
index f8dd7282..0385b15d 100644
--- a/src/r_data.c
+++ b/src/r_data.c
@@ -31,6 +31,7 @@
 #include "doomstat.h"
 #include "i_printf.h"
 #include "i_system.h"
+#include "i_video.h"
 #include "info.h"
 #include "m_argv.h" // M_CheckParm()
 #include "m_fixed.h"
@@ -921,6 +922,8 @@ int tran_filter_pct = 66;       // filter percent
 
 #define TSC 12        /* number of fixed point digits in filter percent */
 
+enum {r, g, b};
+
 void R_InitTranMap(int progress)
 {
   int lump = W_CheckNumForName("TRANMAP");
@@ -959,6 +962,25 @@ void R_InitTranMap(int progress)
           fread(main_tranmap, 256, 256, cachefp) != 256 ||  // killough 4/11/98
           force_rebuild)
         {
+        byte *tp = main_tranmap;
+
+        for (int i = 0; i < 256; i++)
+        {
+            for (int j = 0; j < 256; j++)
+            {
+                byte *bg = playpal + 3*i;
+                byte *fg = playpal + 3*j;
+                byte blend[3];
+
+                int btmp = fg[b] * 1.666 < (fg[r] + fg[g]) ? 100 : 150;
+                blend[r] = MIN(100 * (fg[r] + bg[r]) / btmp, 255);
+                blend[g] = MIN(100 * (fg[g] + bg[g]) / btmp, 255);
+                blend[b] = MIN(100 * (fg[b] + bg[b]) / 100,  255);
+
+                *tp++ = I_GetNearestColor(playpal, blend[r], blend[g], blend[b]);
+            }
+        }
+/*
           long pal[3][256], tot[256], pal_w1[3][256];
           long w1 = ((unsigned long) tran_filter_pct<<TSC)/100;
           long w2 = (1l<<TSC)-w1;
@@ -1021,10 +1043,11 @@ void R_InitTranMap(int progress)
                     while (--color >= 0);
                   }
               }
+          }
+*/
             // [FG] finish progress line
             if (progress)
               I_PutChar(VB_INFO, '\n');
-          }
           if (cachefp && !force_rebuild) // write out the cached translucency map
             {
               cache.pct = tran_filter_pct;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants