From d4ac123d199422daa328ef68f2de6b46017695da Mon Sep 17 00:00:00 2001 From: NepDisk Date: Wed, 29 Apr 2026 13:53:15 -0400 Subject: [PATCH] Fix directional model lightning --- src/command.c | 8 ++++++++ src/d_netcmd.c | 8 ++++---- src/doomdef.h | 2 +- src/hardware/hw_batching.c | 4 +++- src/hardware/hw_main.c | 12 +++++++++++- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/command.c b/src/command.c index 73b7de6be..63bf8ed7c 100644 --- a/src/command.c +++ b/src/command.c @@ -2525,6 +2525,14 @@ static boolean CV_FilterVarByVersion(consvar_t *v, const char *valstr) return false; } + if (GETMAJOREXECVERSION(cv_execversion.value) == 12 && GETMINOREXECVERSION(cv_execversion.value) < 2) // 12.1 = BK Indev 25-04-26 + { + if (fasticmp(v->name, "gr_modellighting")) // This needs to be on for directional lighting to look right on models. + return false; + if (fasticmp(v->name, "gr_palettedepth")) // 24 bit looks best. + return false; + } + return true; } diff --git a/src/d_netcmd.c b/src/d_netcmd.c index f73ca5855..f50b0e4cc 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -398,10 +398,10 @@ consvar_t cv_dummyrestatrandom[MAXSPLITSCREENPLAYERS] = { // Toggle for automatic voice preferences on voice change consvar_t cv_autovoxpref[MAXSPLITSCREENPLAYERS] = { - CVAR_INIT ("voicepref_auto", "On", CV_SAVE|CV_NOINIT, CV_OnOff, NULL), - CVAR_INIT ("voicepref_auto2", "On", CV_SAVE|CV_NOINIT, CV_OnOff, NULL), - CVAR_INIT ("voicepref_auto3", "On", CV_SAVE|CV_NOINIT, CV_OnOff, NULL), - CVAR_INIT ("voicepref_auto4", "On", CV_SAVE|CV_NOINIT, CV_OnOff, NULL) + CVAR_INIT ("voicepref_auto", "On", CV_SAVE, CV_OnOff, NULL), + CVAR_INIT ("voicepref_auto2", "On", CV_SAVE, CV_OnOff, NULL), + CVAR_INIT ("voicepref_auto3", "On", CV_SAVE, CV_OnOff, NULL), + CVAR_INIT ("voicepref_auto4", "On", CV_SAVE, CV_OnOff, NULL) }; consvar_t cv_skipmapcheck = CVAR_INIT ("skipmapcheck", "Off", CV_SAVE, CV_OnOff, NULL); diff --git a/src/doomdef.h b/src/doomdef.h index 97d89e277..d49664d13 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -141,7 +141,7 @@ extern char logfilename[1024]; // to an increment in MODVERSION. This might never happen in practice. // If MODVERSION increases, set MINOREXECVERSION to 0. #define MAJOREXECVERSION MODVERSION -#define MINOREXECVERSION 1 +#define MINOREXECVERSION 2 // (It would have been nice to use VERSION and SUBVERSION but those are zero'd out for DEVELOP builds) // Macros diff --git a/src/hardware/hw_batching.c b/src/hardware/hw_batching.c index 4960b7be6..1819b8c17 100644 --- a/src/hardware/hw_batching.c +++ b/src/hardware/hw_batching.c @@ -283,6 +283,7 @@ static int compareDrawCalls(const void *p1, const void *p2) if (diff != 0) return diff; diff = poly1->surf.LightInfo.directional - poly2->surf.LightInfo.directional; + if (diff != 0) return diff; return diff; } @@ -400,7 +401,8 @@ static unsigned int HWR_MarkStateChanges(DrawCallInfo *current, DrawCallInfo *ne currentSI->FadeColor.rgba != nextSI->FadeColor.rgba || currentSI->LightInfo.light_level != nextSI->LightInfo.light_level || currentSI->LightInfo.fade_start != nextSI->LightInfo.fade_start || - currentSI->LightInfo.fade_end != nextSI->LightInfo.fade_end) + currentSI->LightInfo.fade_end != nextSI->LightInfo.fade_end || + currentSI->LightInfo.directional != nextSI->LightInfo.directional) { stateChanges |= SURFACEINFO_CHANGED; } diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 36b7d2b2f..4a1df33a3 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -729,8 +729,18 @@ void HWR_RenderPlayerView(void) ClearColor.alpha = 1.0f; if (cv_glshaders.value) + { GL_SetShaderInfo(HWD_SHADERINFO_LEVELTIME, (INT32)leveltime); // The water surface shader needs the leveltime. + const angle_t light_angle = maplighting.angle - viewangle + ANGLE_90; // I fucking hate OGL's coordinate system + GL_SetShaderInfo(HWD_SHADERINFO_LIGHT_X, FINECOSINE(light_angle >> ANGLETOFINESHIFT)); + GL_SetShaderInfo(HWD_SHADERINFO_LIGHT_Y, 0); + GL_SetShaderInfo(HWD_SHADERINFO_LIGHT_Z, -FINESINE(light_angle >> ANGLETOFINESHIFT)); + + GL_SetShaderInfo(HWD_SHADERINFO_LIGHT_CONTRAST, maplighting.contrast); + GL_SetShaderInfo(HWD_SHADERINFO_LIGHT_BACKLIGHT, maplighting.backlight); + } + if (viewssnum == 0) // Only do it if it's the first screen being rendered GL_ClearBuffer(true, true, true, &ClearColor); // Clear the Color Buffer, stops HOMs. Also seems to fix the skybox issue on Intel GPUs. @@ -886,7 +896,7 @@ consvar_t cv_glmodels = CVAR_INIT ("gr_models", "Off", CV_SAVE, CV_OnOff, NULL); #ifdef BAD_MODEL_OPTIONS consvar_t cv_glmodelinterpolation = CVAR_INIT ("gr_modelinterpolation", "Sometimes", CV_SAVE, glmodelinterpolation_cons_t, NULL); -consvar_t cv_glmodellighting = CVAR_INIT ("gr_modellighting", "Off", CV_SAVE, CV_OnOff, NULL); +consvar_t cv_glmodellighting = CVAR_INIT ("gr_modellighting", "On", CV_SAVE, CV_OnOff, NULL); #endif consvar_t cv_glshearing = CVAR_INIT ("gr_shearing", "Off", CV_SAVE, glshearing_cons_t, NULL);