From d48b08856e43ccadd779c54f3da863c697fd6051 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Thu, 31 Aug 2023 10:42:43 +0200 Subject: [PATCH 01/42] Support for Animated Votingscreens i hate the interpolation i hate it no idea honestly if those play correctly atm but atleast they dont freak out with uncapped https://gitlab.com/blondedradio/srb-2-k-cep/-/commit/776a547087cdef46b2bdbfc3ddc9d4d963bbea4b --- src/y_inter.c | 123 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 115 insertions(+), 8 deletions(-) diff --git a/src/y_inter.c b/src/y_inter.c index 3fb2d3aa3..16a5dae72 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -116,6 +116,18 @@ static INT32 intertic; static INT32 endtic = -1; static INT32 sorttic = -1; +patch_t *animVoteFramesPatches = NULL; +// VEXTRN - Vote (V) Extra (EXT) Race (R) Normal (N - Normal sized patch) +// VEXTBN - Vote (V) Extra (EXT) Battle (B) Normal (N - Normal sized patch) +// VEXTBW - Vote (V) Extra (EXT) Battle (B) Normal (W - Wide patch used in software) +// VEXTRW - Vote (V) Extra (EXT) Race (R) Normal (W - Wide patch used in software) +char animPrefix[] = "INTSC"; +char animWidePrefix[] = "INTSW"; + +INT32 currentAnimFrame = 0; +static INT32 foundAnimVoteFrames = 0; +static INT32 foundAnimVoteWideFrames = 0; + intertype_t intertype = int_none; @@ -325,6 +337,44 @@ static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32)) } } +// +// Y_AnimatedVoteScreenCheck +// +// Check if the lumps exist (checking for VEXTR(N|W)xx for race and VEXTRB(N|W)xx for battle) +void Y_AnimatedVoteScreenCheck(void) +{ + char tmpPrefix[] = "INTS"; + if(G_BattleGametype()) { + strcpy(animPrefix, "BTLSC"); + strcpy(animWidePrefix, "BTLSW"); + + strcpy(tmpPrefix, "BTLS"); + } + boolean stopSearching = false; + + foundAnimVoteFrames = 0; + foundAnimVoteWideFrames = 0; + currentAnimFrame = 0; + + INT32 i = 1; + while(!stopSearching){ + boolean normalLumpExists = W_LumpExists(va("%sC%d", tmpPrefix, i)); + boolean wideLumpExists = W_LumpExists(va("%sW%d", tmpPrefix, i)); + + if(normalLumpExists || wideLumpExists){ + if(normalLumpExists){ + foundAnimVoteFrames++; + } + if(wideLumpExists){ + foundAnimVoteWideFrames++; + } + } else { // If we don't find at least frame 1 (e.g VEXTRN1), let's just stop looking + stopSearching = true; + } + i++; + } +} + // // Y_IntermissionDrawer // @@ -978,6 +1028,41 @@ static void Y_UnloadData(void) // SRB2Kart: Voting! +// Y_DrawAnimatedVoteScreenPatch +// +// Draw animated patch based on frame counter on vote screen +// +void Y_DrawAnimatedVoteScreenPatch(boolean widePatch){ + char tempAnimPrefix[7]; + (widePatch) ? strcpy(tempAnimPrefix, animWidePrefix) : strcpy(tempAnimPrefix, animPrefix); + INT32 tempFoundAnimVoteFrames = (widePatch) ? foundAnimVoteWideFrames : foundAnimVoteFrames; + INT32 flags = V_SNAPTOBOTTOM | V_SNAPTOTOP; + UINT8 patchframe = (votetic / 4) % 16; + + // Just in case someone provides LESS widescreen frames than normal frames or vice versa, reset the frame counter to 0 + if(widePatch) { + if(currentAnimFrame > foundAnimVoteWideFrames-1){ + currentAnimFrame = 0; + } + } else { + if(currentAnimFrame > foundAnimVoteFrames-1){ + currentAnimFrame = 0; + } + } + + /*patch_t *currPatch = W_CachePatchName(va("%s%d", tempAnimPrefix, currentAnimFrame+1), PU_CACHE); + V_DrawScaledPatch(((vid.width/2) / vid.dupx) - (SHORT(currPatch->width)/2), // Keep the width/height adjustments, for screens that are less wide than 320(?) + (vid.height / vid.dupy) - SHORT(currPatch->height), + V_SNAPTOTOP|V_SNAPTOLEFT, currPatch); + if(votetic % 3 == 0 && !paused){*/ + + { + currentAnimFrame = (currentAnimFrame+1 > tempFoundAnimVoteFrames-1) ? 0 : currentAnimFrame + 1; // jeez no fucking idea how to make this shit not go nuts with interpolation + patch_t *background = W_CachePatchName(va("%s%d", tempAnimPrefix, patchframe + 1), PU_CACHE); + V_DrawScaledPatch(160 - (background->width / 2), (200 - (background->height)), flags, background); + } +} + // // Y_VoteDrawer // @@ -1006,14 +1091,34 @@ void Y_VoteDrawer(void) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - if (widebgpatch && rendermode == render_soft && vid.width / vid.dupx > 320) - V_DrawScaledPatch(((vid.width/2) / vid.dupx) - (SHORT(widebgpatch->width)/2), - (vid.height / vid.dupy) - SHORT(widebgpatch->height), - V_SNAPTOTOP|V_SNAPTOLEFT, widebgpatch); - else - V_DrawScaledPatch(((vid.width/2) / vid.dupx) - (SHORT(bgpatch->width)/2), // Keep the width/height adjustments, for screens that are less wide than 320(?) - (vid.height / vid.dupy) - SHORT(bgpatch->height), - V_SNAPTOTOP|V_SNAPTOLEFT, bgpatch); + if (widebgpatch && rendermode == render_soft && vid.width / vid.dupx > 320) { + + if(foundAnimVoteWideFrames == 0){ + V_DrawScaledPatch(((vid.width/2) / vid.dupx) - (SHORT(widebgpatch->width)/2), + (vid.height / vid.dupy) - SHORT(widebgpatch->height), + V_SNAPTOTOP|V_SNAPTOLEFT, widebgpatch); + } else { + // patch_t *currPatch = W_CachePatchName(va("%s%d", animPrefix, currentAnimFrame+1), PU_CACHE); + // V_DrawScaledPatch(((vid.width/2) / vid.dupx) - (SHORT(currPatch->width)/2), // Keep the width/height adjustments, for screens that are less wide than 320(?) + // (vid.height / vid.dupy) - SHORT(currPatch->height), + // V_SNAPTOTOP|V_SNAPTOLEFT, currPatch); + // if(votetic % 4 == 0 && !paused){ + // currentAnimFrame = (currentAnimFrame+1 > foundAnimVoteFrames-1) ? 0 : currentAnimFrame + 1; + // } + Y_DrawAnimatedVoteScreenPatch(true); + } + } else { + if(foundAnimVoteFrames == 0) { + V_DrawScaledPatch(((vid.width/2) / vid.dupx) - (SHORT(bgpatch->width)/2), // Keep the width/height adjustments, for screens that are less wide than 320(?) + (vid.height / vid.dupy) - SHORT(bgpatch->height), + V_SNAPTOTOP|V_SNAPTOLEFT, bgpatch); + } else { + Y_DrawAnimatedVoteScreenPatch(false); + } + + + } + for (i = 0; i < 4; i++) // First, we need to figure out the height of this thing... { @@ -1487,6 +1592,8 @@ void Y_StartVote(void) I_Error("voteendtic is dirty"); #endif + Y_AnimatedVoteScreenCheck(); + widebgpatch = W_CachePatchName(((prefgametype == GT_MATCH) ? "BATTLSCW" : "INTERSCW"), PU_STATIC); bgpatch = W_CachePatchName(((prefgametype == GT_MATCH) ? "BATTLSCR" : "INTERSCR"), PU_STATIC); cursor = W_CachePatchName("M_CURSOR", PU_STATIC); -- 2.54.0 From 2c1201ff34f28d9c4fd9ee585f4fc5ba1e60e9d4 Mon Sep 17 00:00:00 2001 From: Indev Date: Fri, 1 Sep 2023 12:45:23 +0300 Subject: [PATCH 02/42] Add mo.rollsum and player.sliproll fields. Rendering and frame interpolation code was used, so they are NOT synch safe! --- src/lua_mobjlib.c | 31 ++++++++++++++++++++++++++ src/lua_playerlib.c | 16 ++++++++++++++ src/r_defs.h | 1 + src/r_main.c | 54 +++++++++++++++++++++++++++++++++++++++++++++ src/r_main.h | 1 + 5 files changed, 103 insertions(+) diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 91c2158e8..22cb0f00a 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -16,6 +16,7 @@ #ifdef HAVE_BLUA #include "fastcmp.h" #include "r_things.h" +#include "r_main.h" #include "p_local.h" #include "g_game.h" #include "p_setup.h" @@ -65,6 +66,8 @@ int mobj_mobjnum_unimplemented(lua_State *L); int mobj_scale_setter(lua_State *L); int mobj_destscale_setter(lua_State *L); int mobj_standingslope_noset(lua_State *L); +int mobj_rollsum_getter(lua_State *L); +int mobj_rollsum_noset(lua_State *L); static const char *const array_opt[] ={"iterate",NULL}; @@ -78,6 +81,8 @@ static const udata_field_t mobj_fields[] = { FIELD(mobj_t, angle, udatalib_getter_angle, mobj_angle_setter), FIELD(mobj_t, rollangle, udatalib_getter_angle, udatalib_setter_angle), FIELD(mobj_t, sloperoll, udatalib_getter_angle, mobj_sloperoll_noop), + // Macro fails here + { "rollsum", 0, mobj_rollsum_getter, mobj_rollsum_noset }, FIELD(mobj_t, sprite, udatalib_getter_spritenum, udatalib_setter_spritenum), FIELD(mobj_t, frame, udatalib_getter_uint32, udatalib_setter_uint32), FIELD(mobj_t, anim_duration, udatalib_getter_uint16, udatalib_setter_uint16), @@ -174,13 +179,21 @@ int mobj_ ## field ## _noset(lua_State *L) \ return luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " should not be set directly.", #field); \ } +#define NOSET_USE(field, use) \ +int mobj_ ## field ## _noset(lua_State *L) \ +{ \ + return luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " should not be set directly. Use " LUA_QL(use) " instead.", #field); \ +} + NOSET(snext) NOSET(bnext) NOSET(info) NOSET(player) NOSET(standingslope) +NOSET_USE(rollsum, "rollangle") #undef NOSET +#undef NOSET_USE // Unimplemented fields (why would you need to set them like that explicitly? // No idea, i'm keeping it for synch reasons) @@ -539,6 +552,24 @@ int mobj_destscale_setter(lua_State *L) return 0; } +// WARNING: Not synch safe! +// Don't use this field in game logic code! +int mobj_rollsum_getter(lua_State *L) +{ + mobj_t *mo = GETMO(); + + angle_t rollsum = mo->rollangle + cv_sloperoll.value ? mo->sloperoll : 0; + + if (mo->player) + { + rollsum += R_PlayerSliptideAngle(mo->player); + } + + lua_pushangle(L, rollsum); + + return 1; +} + static int mobj_get(lua_State *L) { mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index c687921ec..8ce7840f3 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -13,6 +13,7 @@ #include "doomdef.h" #ifdef HAVE_BLUA #include "fastcmp.h" +#include "r_main.h" #include "p_mobj.h" #include "d_player.h" #include "g_game.h" @@ -44,6 +45,10 @@ int player_splitscreenindex_noset(lua_State *L); int player_ping_getter(lua_State *L); int player_ping_noset(lua_State *L); +// Non synch safe! +int player_sliproll_getter(lua_State *L); +int player_sliproll_noset(lua_State *L); + #define FIELD(type, field_name, getter, setter) { #field_name, offsetof(type, field_name), getter, setter } static const udata_field_t player_fields[] = { // Player doesn't actually have field "name" so macro fails. Need to declare field manually. @@ -150,6 +155,7 @@ static const udata_field_t player_fields[] = { FIELD(player_t, fovadd, udatalib_getter_fixed, udatalib_setter_fixed), // Mmm yeah thats definitely synch safe #endif // Same as player.name + { "sliproll", 0, player_sliproll_getter, player_sliproll_noset }, { "ping", 0, player_ping_getter, player_ping_noset }, // Hmm originally setter doesn't exist so data is written as unreachable custom field... { NULL }, }; @@ -207,6 +213,7 @@ NOSET(kartstuff) NOSET(bot) NOSET(splitscreenindex) NOSET(ping) +NOSET(sliproll) #undef NOSET @@ -331,6 +338,15 @@ int player_ping_getter(lua_State *L) return 1; } +int player_sliproll_getter(lua_State *L) +{ + player_t *plr = GETPLAYER(); + + lua_pushangle(L, R_PlayerSliptideAngle(plr)); + + return 1; +} + static int lib_iteratePlayers(lua_State *L) { INT32 i = -1; diff --git a/src/r_defs.h b/src/r_defs.h index 559e3646b..26a11a6c0 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -19,6 +19,7 @@ // We rely on the thinker data struct to handle sound origins in sectors. #include "d_think.h" + // SECTORS do store MObjs anyway. #include "p_mobj.h" diff --git a/src/r_main.c b/src/r_main.c index dc914e79a..c381c9860 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -439,6 +439,60 @@ fixed_t R_PointToDist2(fixed_t px2, fixed_t py2, fixed_t px1, fixed_t py1) return FixedHypot(px1 - px2, py1 - py2); } +angle_t R_PlayerSliptideAngle(player_t *player) +{ + mobj_t *mo = player->mo; + + if (!cv_sliptideroll.value || !mo || P_MobjWasRemoved(mo)) return 0; + + size_t rot = mo->frame&FF_FRAMEMASK; + boolean papersprite = (mo->frame & FF_PAPERSPRITE); + + spritedef_t *sprdef; + spriteframe_t *sprframe; + angle_t ang = 0; + + interpmobjstate_t interp = {0}; + + // Yes. + if (R_UsingFrameInterpolation() && !paused) + { + R_InterpolateMobjState(mo, rendertimefrac, &interp); + } + else + { + R_InterpolateMobjState(mo, FRACUNIT, &interp); + } + + if (mo->skin && mo->sprite == SPR_PLAY) + { + sprdef = &((skin_t *)mo->skin)->spritedef; + + if (rot >= sprdef->numframes) + sprdef = &sprites[mo->sprite]; + } + else + { + sprdef = &sprites[mo->sprite]; + } + + if (rot >= sprdef->numframes) + { + sprdef = &sprites[states[S_UNKNOWN].sprite]; + rot = states[S_UNKNOWN].frame&FF_FRAMEMASK; + } + + sprframe = &sprdef->spriteframes[rot]; + + // No sprite frame? I guess it is possible + if (!sprframe) return 0; + + if (sprframe->rotate != SRF_SINGLE || papersprite) + ang = R_PointToAngle(interp.x, interp.y) - interp.angle; + + return FixedMul(FINECOSINE((ang) >> ANGLETOFINESHIFT), mo->player->sliproll*(mo->player->sliptidemem)); +} + // Little extra utility. Works in the same way as R_PointToAngle2 fixed_t R_PointToDist(fixed_t x, fixed_t y) { diff --git a/src/r_main.h b/src/r_main.h index 70adf1bb5..d6c966857 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -73,6 +73,7 @@ angle_t R_PointToAngle2(fixed_t px2, fixed_t py2, fixed_t px1, fixed_t py1); angle_t R_PointToAngleEx(INT32 x2, INT32 y2, INT32 x1, INT32 y1); fixed_t R_PointToDist(fixed_t x, fixed_t y); fixed_t R_PointToDist2(fixed_t px2, fixed_t py2, fixed_t px1, fixed_t py1); +angle_t R_PlayerSliptideAngle(player_t *player); fixed_t R_ScaleFromGlobalAngle(angle_t visangle); subsector_t *R_PointInSubsector(fixed_t x, fixed_t y); -- 2.54.0 From ca9277366cdb9eeff329d5e72a259e9c42be8bfb Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Fri, 1 Sep 2023 19:43:24 +0200 Subject: [PATCH 03/42] anim screen stuff --- src/y_inter.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/y_inter.c b/src/y_inter.c index 16a5dae72..41c96c9ce 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -171,6 +171,7 @@ typedef struct static y_votelvlinfo levelinfo[5]; static y_voteclient voteclient; static INT32 votetic; +static INT32 lastvotetic; static INT32 voteendtic = -1; static patch_t *cursor = NULL; static patch_t *cursor1 = NULL; @@ -1037,7 +1038,6 @@ void Y_DrawAnimatedVoteScreenPatch(boolean widePatch){ (widePatch) ? strcpy(tempAnimPrefix, animWidePrefix) : strcpy(tempAnimPrefix, animPrefix); INT32 tempFoundAnimVoteFrames = (widePatch) ? foundAnimVoteWideFrames : foundAnimVoteFrames; INT32 flags = V_SNAPTOBOTTOM | V_SNAPTOTOP; - UINT8 patchframe = (votetic / 4) % 16; // Just in case someone provides LESS widescreen frames than normal frames or vice versa, reset the frame counter to 0 if(widePatch) { @@ -1057,10 +1057,12 @@ void Y_DrawAnimatedVoteScreenPatch(boolean widePatch){ if(votetic % 3 == 0 && !paused){*/ { - currentAnimFrame = (currentAnimFrame+1 > tempFoundAnimVoteFrames-1) ? 0 : currentAnimFrame + 1; // jeez no fucking idea how to make this shit not go nuts with interpolation - patch_t *background = W_CachePatchName(va("%s%d", tempAnimPrefix, patchframe + 1), PU_CACHE); + patch_t *background = W_CachePatchName(va("%s%d", tempAnimPrefix, currentAnimFrame + 1), PU_CACHE); V_DrawScaledPatch(160 - (background->width / 2), (200 - (background->height)), flags, background); } + if (lastvotetic != votetic && lastvotetic % 2 == 0) { + currentAnimFrame = (currentAnimFrame+1 > tempFoundAnimVoteFrames-1) ? 0 : currentAnimFrame + 1; // jeez no fucking idea how to make this shit not go nuts with interpolation + } } // @@ -1336,6 +1338,8 @@ void Y_VoteDrawer(void) V_DrawCenteredString(BASEVIDWIDTH/2, 188, hilicol, va("Vote ends in %d", tickdown)); } + + lastvotetic = votetic; #ifdef HAVE_BLUA if (renderisnewtic) -- 2.54.0 From 90cc5a6cb0cf0f210d2a8c3518dbe73c429b29ff Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Mon, 4 Sep 2023 15:30:21 +0200 Subject: [PATCH 04/42] Fix a possible crash in R_RenderMaskedSegRange https://git.do.srb2.org/STJr/SRB2/-/commit/55b4458001b2ffe76774ff07a11b56ebf1f70de9 --- src/r_segs.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/r_segs.c b/src/r_segs.c index 594024b75..53f12ecc6 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -1769,6 +1769,9 @@ void R_StoreWallRange(INT32 start, INT32 stop) while (need > maxopenings); openings = Z_Realloc(openings, maxopenings * sizeof (*openings), PU_STATIC, NULL); lastopening = openings + pos; + + if (oldopenings == NULL) + return; // borrowed fix from *cough* zdoom *cough* // [RH] We also need to adjust the openings pointers that -- 2.54.0 From 7da590df94863e0d18451f194923849e49d384ab Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Mon, 4 Sep 2023 15:30:42 +0200 Subject: [PATCH 05/42] Fix sprite scale column iteration crash https://git.do.srb2.org/STJr/SRB2/-/merge_requests/2130 --- src/r_things.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/r_things.c b/src/r_things.c index 26dad2f0b..b1c4c3851 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -851,6 +851,15 @@ static void R_DrawVisSprite(vissprite_t *vis) if (overflow_test < 0) overflow_test = -overflow_test; if ((UINT64)overflow_test&0xFFFFFFFF80000000ULL) return; // ditto } + + // TODO This check should not be necessary. But Papersprites near to the camera will sometimes create invalid values + // for the vissprite's startfrac. This happens because they are not depth culled like other sprites. + // Someone who is more familiar with papersprites pls check and try to fix <3 + if (vis->startfrac < 0 || vis->startfrac > (patch->width << FRACBITS)) + { + // never draw vissprites with startfrac out of patch range + return; + } colfunc = basecolfunc; // hack: this isn't resetting properly somewhere. dc_colormap = vis->colormap; -- 2.54.0 From 98dfe528d8b46662c57ed910544d5308345058f8 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Mon, 4 Sep 2023 16:37:11 +0200 Subject: [PATCH 06/42] remove this --- src/r_things.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/r_things.h b/src/r_things.h index ab4688f91..7e38dbf47 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -152,8 +152,6 @@ typedef struct vissprite_s extracolormap_t *extra_colormap; // global colormaps - //fixed_t xscale; - // Precalculated top and bottom screen coords for the sprite. fixed_t thingheight; // The actual height of the thing (for 3D floors) sector_t *sector; // The sector containing the thing. -- 2.54.0 From 7f05d27f42a437e28f293829e849c5fbdfc7dfb6 Mon Sep 17 00:00:00 2001 From: Indev Date: Tue, 5 Sep 2023 12:47:49 +0300 Subject: [PATCH 07/42] Allow lua to change vote background via hud.setVoteBackground --- src/lua_hudlib.c | 36 ++++++++++++++++++++++++++++++++++++ src/y_inter.c | 23 +++++++++++++++++------ src/y_inter.h | 1 + 3 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index 470fad9b7..bd3fb19c8 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -15,6 +15,7 @@ #include "r_defs.h" #include "r_local.h" #include "st_stuff.h" // hudinfo[] +#include "y_inter.h" #include "g_game.h" #include "i_video.h" // rendermode #include "p_local.h" // camera_t @@ -966,11 +967,46 @@ static int lib_hudadd(lua_State *L) return 0; } +static int lib_hudsetvotebackground(lua_State *L) +{ + if (lua_isnoneornil(L, 1)) + { + if (luaVoteScreen) + { + free(luaVoteScreen); + } + + luaVoteScreen = NULL; + + return 0; + } + + const char *prefix = luaL_checkstring(L, 1); + + if (strlen(prefix) != 4) + { + return luaL_argerror(L, 1, "prefix should 4 characters wide"); + } + + if (!luaVoteScreen) + { + luaVoteScreen = (char*)malloc(5); + luaVoteScreen[4] = 0; + } + + strncpy(luaVoteScreen, prefix, 4); + + strupr(luaVoteScreen); + + return 0; +} + static luaL_Reg lib_hud[] = { {"enable", lib_hudenable}, {"disable", lib_huddisable}, {"enabled", lib_hudenabled}, {"add", lib_hudadd}, + {"setVoteBackground", lib_hudsetvotebackground}, {NULL, NULL} }; diff --git a/src/y_inter.c b/src/y_inter.c index 41c96c9ce..bda60dde2 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -123,6 +123,7 @@ patch_t *animVoteFramesPatches = NULL; // VEXTRW - Vote (V) Extra (EXT) Race (R) Normal (W - Wide patch used in software) char animPrefix[] = "INTSC"; char animWidePrefix[] = "INTSW"; +char *luaVoteScreen = NULL; INT32 currentAnimFrame = 0; static INT32 foundAnimVoteFrames = 0; @@ -345,14 +346,24 @@ static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32)) void Y_AnimatedVoteScreenCheck(void) { char tmpPrefix[] = "INTS"; - if(G_BattleGametype()) { - strcpy(animPrefix, "BTLSC"); - strcpy(animWidePrefix, "BTLSW"); - - strcpy(tmpPrefix, "BTLS"); - } boolean stopSearching = false; + if (luaVoteScreen) + { + strncpy(tmpPrefix, luaVoteScreen, 4); + } + else + { + if(G_BattleGametype()) { + strcpy(tmpPrefix, "BTLS"); + } + } + + strncpy(animPrefix, tmpPrefix, 4); + animPrefix[4] = 'C'; + strncpy(animWidePrefix, tmpPrefix, 4); + animWidePrefix[4] = 'W'; + foundAnimVoteFrames = 0; foundAnimVoteWideFrames = 0; currentAnimFrame = 0; diff --git a/src/y_inter.h b/src/y_inter.h index 6162dc282..ee320d474 100644 --- a/src/y_inter.h +++ b/src/y_inter.h @@ -10,6 +10,7 @@ /// \brief Tally screens, or "Intermissions" as they were formally called in Doom extern boolean usebuffer; +extern char *luaVoteScreen; void Y_IntermissionDrawer(void); void Y_Ticker(void); -- 2.54.0 From 52c11d14443e7eb021c41bf88330d6ff9ddb9a06 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 6 Sep 2023 15:12:18 +0200 Subject: [PATCH 08/42] paletteshader stuff from hannu https://git.do.srb2.org/Hannu_Hanhi/SRB2/-/commit/2530e8b2938eb3ecb6f56b6cdc9916f387a72c6a this thing tanks my framerate to hell --- src/hardware/hw_defs.h | 2 + src/hardware/hw_main.c | 14 ++++++- src/hardware/hw_main.h | 1 + src/hardware/r_opengl/r_opengl.c | 63 ++++++++++++++++++++++++++++++++ 4 files changed, 79 insertions(+), 1 deletion(-) diff --git a/src/hardware/hw_defs.h b/src/hardware/hw_defs.h index 294e4e791..d8f9dc5e8 100644 --- a/src/hardware/hw_defs.h +++ b/src/hardware/hw_defs.h @@ -231,6 +231,8 @@ typedef struct FSurfaceInfo FSurfaceInfo; enum hwdsetspecialstate { HWD_SET_SHADERS, + + HWD_SET_PALETTE_SHADER_ENABLED, HWD_SET_TEXTUREFILTERMODE, HWD_SET_TEXTUREANISOTROPICMODE, diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 834f617bf..eba58a985 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -64,6 +64,7 @@ static void CV_filtermode_ONChange(void); static void CV_anisotropic_ONChange(void); static void CV_screentextures_ONChange(void); static void CV_useCustomShaders_ONChange(void); +static void CV_grpaletteshader_OnChange(void); static CV_PossibleValue_t grfiltermode_cons_t[]= {{HWD_SET_TEXTUREFILTER_POINTSAMPLED, "Nearest"}, {HWD_SET_TEXTUREFILTER_BILINEAR, "Bilinear"}, {HWD_SET_TEXTUREFILTER_TRILINEAR, "Trilinear"}, @@ -115,7 +116,10 @@ static INT32 current_bsp_culling_distance = 0; consvar_t cv_grscreentextures = {"gr_screentextures", "On", CV_CALL, CV_OnOff, CV_screentextures_ONChange, 0, NULL, NULL, 0, 0, NULL}; - consvar_t cv_grusecustomshaders = {"gr_usecustomshaders", "Yes", CV_CALL|CV_SAVE, CV_OnOff, CV_useCustomShaders_ONChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_grusecustomshaders = {"gr_usecustomshaders", "Yes", CV_CALL|CV_SAVE, CV_OnOff, CV_useCustomShaders_ONChange, 0, NULL, NULL, 0, 0, NULL}; + +consvar_t cv_grpaletteshader = {"gr_paletteshader", "Off", CV_CALL|CV_SAVE, CV_OnOff, CV_grpaletteshader_OnChange, 0, NULL, NULL, 0, 0, NULL}; + static void CV_filtermode_ONChange(void) { @@ -127,6 +131,13 @@ static void CV_anisotropic_ONChange(void) HWD.pfnSetSpecialState(HWD_SET_TEXTUREANISOTROPICMODE, cv_granisotropicmode.value); } +static void CV_grpaletteshader_OnChange(void) +{ + if (rendermode == render_opengl) + HWD.pfnSetSpecialState(HWD_SET_PALETTE_SHADER_ENABLED, cv_grpaletteshader.value); +} + + static void CV_screentextures_ONChange(void) { HWD.pfnSetSpecialState(HWD_SET_SCREEN_TEXTURES, cv_grscreentextures.value); @@ -5942,6 +5953,7 @@ void HWR_AddCommands(void) CV_RegisterVar(&cv_granisotropicmode); CV_RegisterVar(&cv_grcorrecttricks); CV_RegisterVar(&cv_grsolvetjoin); + CV_RegisterVar(&cv_grpaletteshader); CV_RegisterVar(&cv_grbatching); CV_RegisterVar(&cv_grscreentextures); diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h index 51a362c9e..48d37357c 100644 --- a/src/hardware/hw_main.h +++ b/src/hardware/hw_main.h @@ -179,6 +179,7 @@ extern consvar_t cv_grfallbackplayermodel; extern consvar_t cv_grbatching; extern consvar_t cv_grrenderdistance; extern consvar_t cv_grusecustomshaders; +extern consvar_t cv_grpaletteshader; extern consvar_t cv_grportals; extern consvar_t cv_nostencil; extern consvar_t cv_secbright; diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index d1690e9ee..e0df3399f 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -26,6 +26,8 @@ #include "r_opengl.h" #include "r_vbo.h" +#include "../../v_video.h" // pLocalPalette + #include "../../p_tick.h" // for leveltime (NOTE: THIS IS BAD, FIGURE OUT HOW TO PROPERLY IMPLEMENT gl_leveltime) #include "../../i_system.h" // for I_GetPreciseTime (batching time measurements) @@ -511,6 +513,7 @@ typedef void (APIENTRY *PFNglLinkProgram) (GLuint); typedef void (APIENTRY *PFNglGetProgramiv) (GLuint, GLenum, GLint*); typedef void (APIENTRY *PFNglUseProgram) (GLuint); typedef void (APIENTRY *PFNglUniform1i) (GLint, GLint); +typedef void (APIENTRY *PFNglUniform1iv) (GLint, GLsizei, const GLint*); typedef void (APIENTRY *PFNglUniform1f) (GLint, GLfloat); typedef void (APIENTRY *PFNglUniform2f) (GLint, GLfloat, GLfloat); typedef void (APIENTRY *PFNglUniform3f) (GLint, GLfloat, GLfloat, GLfloat); @@ -532,6 +535,7 @@ static PFNglLinkProgram pglLinkProgram; static PFNglGetProgramiv pglGetProgramiv; static PFNglUseProgram pglUseProgram; static PFNglUniform1i pglUniform1i; +static PFNglUniform1iv pglUniform1iv; static PFNglUniform1f pglUniform1f; static PFNglUniform2f pglUniform2f; static PFNglUniform3f pglUniform3f; @@ -561,6 +565,9 @@ static GLint gl_portal_stencil_level = 0; static INT32 gl_portal_mode = HWD_PORTAL_NORMAL; +static GLint gl_palette[768]; +static INT32 gl_use_palette_shader = 0; + // 13062019 typedef enum { @@ -574,6 +581,8 @@ typedef enum // misc. (custom shaders) gluniform_leveltime, + + gluniform_palette, gluniform_max, } gluniform_t; @@ -708,6 +717,26 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; GLSL_SOFTWARE_FADE_EQUATION \ "gl_FragColor = final_color;\n" \ "}\0" + +// +// Palette color quantization shader test. +// + +// Could test putting this to GLSL_SOFTWARE_FRAGMENT_SHADER and seeing what happens to performance. + +#define GLSL_PALETTE_FRAGMENT_SHADER \ + "uniform sampler2D tex;\n" \ + "uniform int palette[768];\n" \ + "void main(void) {\n" \ + "vec3 texel = texture2D(tex, gl_TexCoord[0].st);\n" \ + "vec3 best = vec3(200.0);\n" \ + "for (int i = 0; i < 256; i++) {\n" \ + "vec3 pal_color = vec3(palette[i*3] / 255.0, palette[i*3+1] / 255.0, palette[i*3+2] / 255.0);\n" \ + "best = mix(pal_color, best, step(length(best-texel), length(pal_color-texel)));\n" \ + "}\n" \ + "gl_FragColor = vec4(best[0], best[1], best[2] ,1.0);\n" \ + "}\0" + // // GLSL generic fragment shader @@ -747,6 +776,9 @@ static const char *fragment_shaders[] = { "void main(void) {\n" "gl_FragColor = texture2D(tex, gl_TexCoord[0].st);\n" "}\0", + + // Palette fragment shader + GLSL_PALETTE_FRAGMENT_SHADER, NULL, }; @@ -793,6 +825,9 @@ static const char *vertex_shaders[] = { // Sky vertex shader GLSL_DEFAULT_VERTEX_SHADER, + //Palette vertex shader + GLSL_DEFAULT_VERTEX_SHADER, + NULL, }; @@ -826,6 +861,7 @@ void SetupGLFunc4(void) pglGetProgramiv = GetGLFunc("glGetProgramiv"); pglUseProgram = GetGLFunc("glUseProgram"); pglUniform1i = GetGLFunc("glUniform1i"); + pglUniform1iv = GetGLFunc("glUniform1iv"); pglUniform1f = GetGLFunc("glUniform1f"); pglUniform2f = GetGLFunc("glUniform2f"); pglUniform3f = GetGLFunc("glUniform3f"); @@ -949,6 +985,8 @@ EXPORT boolean HWRAPI(LoadShaders) (void) // misc. (custom shaders) shader->uniforms[gluniform_leveltime] = GETUNI("leveltime"); + + shader->uniforms[gluniform_palette] = GETUNI("palette"); #undef GETUNI } @@ -1022,6 +1060,17 @@ EXPORT void HWRAPI(KillShaders) (void) // unused......................... } +static void InitPalette(void) +{ + int i; + for (i = 0; i < 256; i++) + { + gl_palette[i*3] = pLocalPalette[i].s.red; + gl_palette[i*3+1] = pLocalPalette[i].s.green; + gl_palette[i*3+2] = pLocalPalette[i].s.blue; + } +} + // -----------------+ // SetNoTexture : Disable texture // -----------------+ @@ -1312,6 +1361,8 @@ EXPORT void HWRAPI(ClearBuffer) (FBOOLEAN ColorMask, pglClear(ClearMask); pglEnableClientState(GL_VERTEX_ARRAY); // We always use this one pglEnableClientState(GL_TEXTURE_COORD_ARRAY); // And mostly this one, too + + InitPalette(); // just gonna put this here for now, could try doing it on gl init } @@ -2692,6 +2743,10 @@ EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value) break; } break; + + case HWD_SET_PALETTE_SHADER_ENABLED: + gl_use_palette_shader = Value; + break; case HWD_SET_TEXTUREFILTERMODE: switch (Value) @@ -3760,6 +3815,12 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) clearColour.alpha = 1; ClearBuffer(true, false, false, &clearColour); pglBindTexture(GL_TEXTURE_2D, finalScreenTexture); + + if (gl_use_palette_shader) + { + pglUseProgram(gl_shaderprograms[8].program); // palette shader + pglUniform1iv(gl_shaderprograms[8].uniforms[gluniform_palette], 768, gl_palette); + } pglColor4ubv(white); pglTexCoordPointer(2, GL_FLOAT, 0, fix); @@ -3768,6 +3829,8 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) pglDrawArrays(GL_TRIANGLE_FAN, 0, 4); tex_downloaded = finalScreenTexture; + if (gl_use_palette_shader) + pglUseProgram(0); } #endif //HWRENDER -- 2.54.0 From 2ed4a7b548b26ea0929f4fb8e835aa2e2c0f4b3a Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 6 Sep 2023 15:19:39 +0200 Subject: [PATCH 09/42] Palette Lookup Texture https://git.do.srb2.org/Hannu_Hanhi/SRB2/-/commit/9562a95d0adb9384b5db26145ed03cb5d3e5a893 https://git.do.srb2.org/Hannu_Hanhi/SRB2/-/commit/d8a329b89dad75a57e076d88b8d5d1fdb5f959bc --- src/hardware/r_opengl/r_opengl.c | 65 ++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 8 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index e0df3399f..dc715b32b 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -27,6 +27,7 @@ #include "r_vbo.h" #include "../../v_video.h" // pLocalPalette +#include "../../r_data.h" // NearestColor #include "../../p_tick.h" // for leveltime (NOTE: THIS IS BAD, FIGURE OUT HOW TO PROPERLY IMPLEMENT gl_leveltime) #include "../../i_system.h" // for I_GetPreciseTime (batching time measurements) @@ -237,6 +238,7 @@ FUNCPRINTF void GL_DBG_Printf(const char *format, ...) #define pglTexEnvi glTexEnvi #define pglTexParameteri glTexParameteri #define pglTexImage2D glTexImage2D +#define pglTexImage3D glTexImage3D /* Fog */ #define pglFogf glFogf @@ -357,6 +359,8 @@ typedef void (APIENTRY * PFNglTexParameteri) (GLenum target, GLenum pname, GLint static PFNglTexParameteri pglTexParameteri; typedef void (APIENTRY * PFNglTexImage2D) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); static PFNglTexImage2D pglTexImage2D; +typedef void (APIENTRY * PFNglTexImage3D) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +static PFNglTexImage3D pglTexImage3D; /* Fog */ typedef void (APIENTRY * PFNglFogf) (GLenum pname, GLfloat param); @@ -478,6 +482,7 @@ boolean SetupGLfunc(void) GETOPENGLFUNC(pglTexEnvi, glTexEnvi) GETOPENGLFUNC(pglTexParameteri, glTexParameteri) GETOPENGLFUNC(pglTexImage2D, glTexImage2D) + GETOPENGLFUNC(pglTexImage3D, glTexImage3D) GETOPENGLFUNC(pglFogf, glFogf) GETOPENGLFUNC(pglFogfv, glFogfv) @@ -567,6 +572,7 @@ static INT32 gl_portal_mode = HWD_PORTAL_NORMAL; static GLint gl_palette[768]; static INT32 gl_use_palette_shader = 0; +static boolean gl_palette_initialized = false; // 13062019 typedef enum @@ -583,6 +589,7 @@ typedef enum gluniform_leveltime, gluniform_palette, + gluniform_color_lookup, gluniform_max, } gluniform_t; @@ -726,15 +733,17 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; #define GLSL_PALETTE_FRAGMENT_SHADER \ "uniform sampler2D tex;\n" \ + "uniform sampler3D lookup_tex;\n" \ "uniform int palette[768];\n" \ "void main(void) {\n" \ "vec3 texel = texture2D(tex, gl_TexCoord[0].st);\n" \ - "vec3 best = vec3(200.0);\n" \ - "for (int i = 0; i < 256; i++) {\n" \ - "vec3 pal_color = vec3(palette[i*3] / 255.0, palette[i*3+1] / 255.0, palette[i*3+2] / 255.0);\n" \ - "best = mix(pal_color, best, step(length(best-texel), length(pal_color-texel)));\n" \ - "}\n" \ - "gl_FragColor = vec4(best[0], best[1], best[2] ,1.0);\n" \ + "float pal_idx = texture3D(lookup_tex, texel)[0];\n" \ + "gl_FragColor = vec4(pal_idx, pal_idx, 0.5, 1.0);\n" \ + "//if (pal_idx == 0) {\n" \ + "//gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" \ + "//} else {\n" \ + "//gl_FragColor = vec4(float(palette[pal_idx*3])/255.0, float(palette[pal_idx*3+1])/255.0, float(palette[pal_idx*3+2])/255.0, 1.0);\n" \ + "//}\n" \ "}\0" @@ -872,6 +881,8 @@ void SetupGLFunc4(void) pglGetUniformLocation = GetGLFunc("glGetUniformLocation"); #endif + pglTexImage3D = GetGLFunc("glTexImage3D"); // how about here then... + // GLU pgluBuild2DMipmaps = GetGLFunc("gluBuild2DMipmaps"); } @@ -987,6 +998,7 @@ EXPORT boolean HWRAPI(LoadShaders) (void) shader->uniforms[gluniform_leveltime] = GETUNI("leveltime"); shader->uniforms[gluniform_palette] = GETUNI("palette"); + shader->uniforms[gluniform_color_lookup] = GETUNI("lookup_tex"); #undef GETUNI } @@ -1060,15 +1072,46 @@ EXPORT void HWRAPI(KillShaders) (void) // unused......................... } +GLuint palette_tex_num; + static void InitPalette(void) { - int i; + int i, r, g, b; + // init the palette for (i = 0; i < 256; i++) { gl_palette[i*3] = pLocalPalette[i].s.red; gl_palette[i*3+1] = pLocalPalette[i].s.green; gl_palette[i*3+2] = pLocalPalette[i].s.blue; } + // init the palette conversion lookup texture + GLubyte *pal_lookup_tex = malloc(256*256*256*sizeof(GLubyte)); + // smallest separation between all the colors in the srb2 palette is 6, so + // possibly a 64x64x64 lookup texture might be enough for 100% correct colors + // (min separation for 64^3 size is 4) + if (!pal_lookup_tex) + I_Error("Failed to allocate memory for generating palette lookup texture."); + + for (b = 0; b < 256; b++) + { + for (g = 0; g < 256; g++) + { + for (r = 0; r < 256; r++) + { + pal_lookup_tex[b*65536+g*256+r] = NearestColor(r, b, g); + } + } + } + pglGenTextures(1, &palette_tex_num); + pglBindTexture(GL_TEXTURE_3D, palette_tex_num); + pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + if (!pglTexImage3D) + I_Error("pglTexImage3D is NULL!"); + pglTexImage3D(GL_TEXTURE_3D, 0, GL_R8, 256, 256, 256, 0, GL_RED, GL_UNSIGNED_BYTE, pal_lookup_tex); // test: put gl_red instead of gl_red_integer + free(pal_lookup_tex); + pglUniform1i(gl_shaderprograms[8].uniforms[gluniform_color_lookup], 1); // bind sampler to second texture unit + gl_palette_initialized = true; } // -----------------+ @@ -1362,7 +1405,8 @@ EXPORT void HWRAPI(ClearBuffer) (FBOOLEAN ColorMask, pglEnableClientState(GL_VERTEX_ARRAY); // We always use this one pglEnableClientState(GL_TEXTURE_COORD_ARRAY); // And mostly this one, too - InitPalette(); // just gonna put this here for now, could try doing it on gl init + if (!gl_palette_initialized) + InitPalette(); // just gonna put this here for now } @@ -3820,6 +3864,8 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) { pglUseProgram(gl_shaderprograms[8].program); // palette shader pglUniform1iv(gl_shaderprograms[8].uniforms[gluniform_palette], 768, gl_palette); + pglActiveTexture(GL_TEXTURE1); + pglBindTexture(GL_TEXTURE_2D, palette_tex_num); } pglColor4ubv(white); @@ -3830,7 +3876,10 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) tex_downloaded = finalScreenTexture; if (gl_use_palette_shader) + { pglUseProgram(0); + pglActiveTexture(GL_TEXTURE0); + } } #endif //HWRENDER -- 2.54.0 From 9732e74bf3e445f6916479d4e9c8cbdebf42ebbc Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Wed, 6 Sep 2023 15:24:31 +0200 Subject: [PATCH 10/42] more work https://git.do.srb2.org/Hannu_Hanhi/SRB2/-/commit/140dba15b86ad7e206c50c8336103bee89e6b032 --- src/hardware/r_opengl/r_opengl.c | 52 +++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index dc715b32b..c75bba88b 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -482,7 +482,6 @@ boolean SetupGLfunc(void) GETOPENGLFUNC(pglTexEnvi, glTexEnvi) GETOPENGLFUNC(pglTexParameteri, glTexParameteri) GETOPENGLFUNC(pglTexImage2D, glTexImage2D) - GETOPENGLFUNC(pglTexImage3D, glTexImage3D) GETOPENGLFUNC(pglFogf, glFogf) GETOPENGLFUNC(pglFogfv, glFogfv) @@ -737,13 +736,21 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "uniform int palette[768];\n" \ "void main(void) {\n" \ "vec3 texel = texture2D(tex, gl_TexCoord[0].st);\n" \ - "float pal_idx = texture3D(lookup_tex, texel)[0];\n" \ - "gl_FragColor = vec4(pal_idx, pal_idx, 0.5, 1.0);\n" \ - "//if (pal_idx == 0) {\n" \ - "//gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" \ - "//} else {\n" \ - "//gl_FragColor = vec4(float(palette[pal_idx*3])/255.0, float(palette[pal_idx*3+1])/255.0, float(palette[pal_idx*3+2])/255.0, 1.0);\n" \ - "//}\n" \ + "int pal_idx = texture3D(lookup_tex, (63.0/64.0) * texel + 1.0 / 128.0)[0] * 255;\n" \ + "gl_FragColor = vec4(float(palette[pal_idx*3])/255.0, float(palette[pal_idx*3+1])/255.0, float(palette[pal_idx*3+2])/255.0, 1.0);\n" \ + "}\0" + +#define GLSL_PALETTE_FRAGMENT_SHADER_OLD \ + "uniform sampler2D tex;\n" \ + "uniform int palette[768];\n" \ + "void main(void) {\n" \ + "vec3 texel = texture2D(tex, gl_TexCoord[0].st);\n" \ + "vec3 best = vec3(200.0);\n" \ + "for (int i = 0; i < 256; i++) {\n" \ + "vec3 pal_color = vec3(palette[i*3] / 255.0, palette[i*3+1] / 255.0, palette[i*3+2] / 255.0);\n" \ + "best = mix(pal_color, best, step(length(best-texel), length(pal_color-texel)));\n" \ + "}\n" \ + "gl_FragColor = vec4(best[0], best[1], best[2] ,1.0);\n" \ "}\0" @@ -1073,6 +1080,14 @@ EXPORT void HWRAPI(KillShaders) (void) } GLuint palette_tex_num; +// length of one side of lookup texture +// smallest separation between all the colors in the srb2 palette is 6, so +// possibly a 64x64x64 lookup texture might be enough for 100% correct colors +// (min separation for 64^3 size is 4) +#define LUT_SIZE 64 +#define STEP_SIZE (256/LUT_SIZE) +// the +2 in the NearestColor call also needs to be adjusted if LUT_SIZE is changed! +// the hardcoded values in the shader also need to be adjusted if LUT_SIZE is changed! static void InitPalette(void) { @@ -1085,20 +1100,17 @@ static void InitPalette(void) gl_palette[i*3+2] = pLocalPalette[i].s.blue; } // init the palette conversion lookup texture - GLubyte *pal_lookup_tex = malloc(256*256*256*sizeof(GLubyte)); - // smallest separation between all the colors in the srb2 palette is 6, so - // possibly a 64x64x64 lookup texture might be enough for 100% correct colors - // (min separation for 64^3 size is 4) + GLubyte *pal_lookup_tex = malloc(LUT_SIZE*LUT_SIZE*LUT_SIZE*sizeof(GLubyte)); if (!pal_lookup_tex) I_Error("Failed to allocate memory for generating palette lookup texture."); - for (b = 0; b < 256; b++) + for (b = 0; b < LUT_SIZE; b++) { - for (g = 0; g < 256; g++) + for (g = 0; g < LUT_SIZE; g++) { - for (r = 0; r < 256; r++) + for (r = 0; r < LUT_SIZE; r++) { - pal_lookup_tex[b*65536+g*256+r] = NearestColor(r, b, g); + pal_lookup_tex[b*LUT_SIZE*LUT_SIZE+g*LUT_SIZE+r] = NearestColor(r*STEP_SIZE+2, g*STEP_SIZE+2, b*STEP_SIZE+2); } } } @@ -1108,9 +1120,12 @@ static void InitPalette(void) pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); if (!pglTexImage3D) I_Error("pglTexImage3D is NULL!"); - pglTexImage3D(GL_TEXTURE_3D, 0, GL_R8, 256, 256, 256, 0, GL_RED, GL_UNSIGNED_BYTE, pal_lookup_tex); // test: put gl_red instead of gl_red_integer + pglTexImage3D(GL_TEXTURE_3D, 0, GL_R8, LUT_SIZE, LUT_SIZE, LUT_SIZE, 0, GL_RED, GL_UNSIGNED_BYTE, pal_lookup_tex); // test: put gl_red instead of gl_red_integer free(pal_lookup_tex); + pglUseProgram(gl_shaderprograms[8].program); pglUniform1i(gl_shaderprograms[8].uniforms[gluniform_color_lookup], 1); // bind sampler to second texture unit + pglUseProgram(0); + pglBindTexture(GL_TEXTURE_3D, 0); gl_palette_initialized = true; } @@ -3865,7 +3880,7 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) pglUseProgram(gl_shaderprograms[8].program); // palette shader pglUniform1iv(gl_shaderprograms[8].uniforms[gluniform_palette], 768, gl_palette); pglActiveTexture(GL_TEXTURE1); - pglBindTexture(GL_TEXTURE_2D, palette_tex_num); + pglBindTexture(GL_TEXTURE_3D, palette_tex_num); } pglColor4ubv(white); @@ -3878,6 +3893,7 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) if (gl_use_palette_shader) { pglUseProgram(0); + pglBindTexture(GL_TEXTURE_3D, 0); pglActiveTexture(GL_TEXTURE0); } } -- 2.54.0 From 01cd8f5a0f44216cdc532ca2664c37ab6b35675a Mon Sep 17 00:00:00 2001 From: lug420 Date: Wed, 6 Sep 2023 18:02:04 +0200 Subject: [PATCH 11/42] 4fps this thing runs like crap 4fps --- src/hardware/hw_defs.h | 1 - src/hardware/hw_main.c | 23 +++++---- src/hardware/r_opengl/r_opengl.c | 83 ++++++++++++++++++++++---------- 3 files changed, 68 insertions(+), 39 deletions(-) diff --git a/src/hardware/hw_defs.h b/src/hardware/hw_defs.h index d8f9dc5e8..1f6dd0f1c 100644 --- a/src/hardware/hw_defs.h +++ b/src/hardware/hw_defs.h @@ -231,7 +231,6 @@ typedef struct FSurfaceInfo FSurfaceInfo; enum hwdsetspecialstate { HWD_SET_SHADERS, - HWD_SET_PALETTE_SHADER_ENABLED, HWD_SET_TEXTUREFILTERMODE, diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index eba58a985..57df52185 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -86,6 +86,9 @@ consvar_t cv_grsolvetjoin = {"gr_solvetjoin", "On", 0, CV_OnOff, NULL, 0, NULL, consvar_t cv_grbatching = {"gr_batching", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_grpaletteshader = {"gr_paletteshader", "Off", CV_CALL, CV_OnOff, + CV_grpaletteshader_OnChange, 0, NULL, NULL, 0, 0, NULL}; + static CV_PossibleValue_t grrenderdistance_cons_t[] = { {0, "Max"}, {1, "1024"}, {2, "2048"}, {3, "4096"}, {4, "6144"}, {5, "8192"}, {6, "12288"}, {7, "16384"}, {0, NULL}}; @@ -116,10 +119,7 @@ static INT32 current_bsp_culling_distance = 0; consvar_t cv_grscreentextures = {"gr_screentextures", "On", CV_CALL, CV_OnOff, CV_screentextures_ONChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_grusecustomshaders = {"gr_usecustomshaders", "Yes", CV_CALL|CV_SAVE, CV_OnOff, CV_useCustomShaders_ONChange, 0, NULL, NULL, 0, 0, NULL}; - -consvar_t cv_grpaletteshader = {"gr_paletteshader", "Off", CV_CALL|CV_SAVE, CV_OnOff, CV_grpaletteshader_OnChange, 0, NULL, NULL, 0, 0, NULL}; - + consvar_t cv_grusecustomshaders = {"gr_usecustomshaders", "Yes", CV_CALL|CV_SAVE, CV_OnOff, CV_useCustomShaders_ONChange, 0, NULL, NULL, 0, 0, NULL}; static void CV_filtermode_ONChange(void) { @@ -131,13 +131,6 @@ static void CV_anisotropic_ONChange(void) HWD.pfnSetSpecialState(HWD_SET_TEXTUREANISOTROPICMODE, cv_granisotropicmode.value); } -static void CV_grpaletteshader_OnChange(void) -{ - if (rendermode == render_opengl) - HWD.pfnSetSpecialState(HWD_SET_PALETTE_SHADER_ENABLED, cv_grpaletteshader.value); -} - - static void CV_screentextures_ONChange(void) { HWD.pfnSetSpecialState(HWD_SET_SCREEN_TEXTURES, cv_grscreentextures.value); @@ -149,6 +142,12 @@ static void CV_useCustomShaders_ONChange(void) HWD.pfnInitCustomShaders(); } +static void CV_grpaletteshader_OnChange(void) +{ + if (rendermode == render_opengl) + HWD.pfnSetSpecialState(HWD_SET_PALETTE_SHADER_ENABLED, cv_grpaletteshader.value); +} + // ========================================================================== // Globals // ========================================================================== @@ -5953,9 +5952,9 @@ void HWR_AddCommands(void) CV_RegisterVar(&cv_granisotropicmode); CV_RegisterVar(&cv_grcorrecttricks); CV_RegisterVar(&cv_grsolvetjoin); - CV_RegisterVar(&cv_grpaletteshader); CV_RegisterVar(&cv_grbatching); + CV_RegisterVar(&cv_grpaletteshader); CV_RegisterVar(&cv_grscreentextures); CV_RegisterVar(&cv_grrenderdistance); CV_RegisterVar(&cv_grportals); diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index c75bba88b..32954be24 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -47,12 +47,13 @@ struct GLRGBAFloat GLfloat alpha; }; typedef struct GLRGBAFloat GLRGBAFloat; -static const GLubyte white[4] = { 255, 255, 255, 255 }; // ========================================================================== // CONSTANTS // ========================================================================== +static const GLubyte white[4] = { 255, 255, 255, 255 }; + // With OpenGL 1.1+, the first texture should be 1 #define NOTEXTURE_NUM 0 @@ -76,7 +77,9 @@ static FBITFIELD CurrentPolyFlags; static FTextureInfo* gr_cachetail = NULL; static FTextureInfo* gr_cachehead = NULL; -RGBA_t myPaletteData[256]; +static RGBA_t screenPalette[256] = {0}; +static GLuint palette_tex_num = 0; // 3D texture containing RGB -> palette index lookup table +RGBA_t myPaletteData[256]; // the palette for converting textures to RGBA GLint screen_width = 0; // used by Draw2DLine() GLint screen_height = 0; GLbyte screen_depth = 0; @@ -359,6 +362,8 @@ typedef void (APIENTRY * PFNglTexParameteri) (GLenum target, GLenum pname, GLint static PFNglTexParameteri pglTexParameteri; typedef void (APIENTRY * PFNglTexImage2D) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); static PFNglTexImage2D pglTexImage2D; + +/* 1.2 functions for 3D textures */ typedef void (APIENTRY * PFNglTexImage3D) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); static PFNglTexImage3D pglTexImage3D; @@ -419,6 +424,9 @@ static PFNglColorPointer pglColorPointer; #ifndef GL_TEXTURE1 #define GL_TEXTURE1 0x84C1 #endif +#ifndef GL_TEXTURE2 +#define GL_TEXTURE2 0x84C2 +#endif boolean SetupGLfunc(void) { @@ -616,6 +624,7 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "float lightz = clamp(z / 16.0, 0.0, 127.0);\n" \ "float startmap = (15.0 - lightnum) * 4.0;\n" \ "float scale = 160.0 / (lightz + 1.0);\n" \ + "float cap = (155.0 - light) * 0.26;\n" \ "return startmap - scale * 0.5;\n" \ "}\n" @@ -723,7 +732,7 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; GLSL_SOFTWARE_FADE_EQUATION \ "gl_FragColor = final_color;\n" \ "}\0" - + // // Palette color quantization shader test. // @@ -735,16 +744,16 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "uniform sampler3D lookup_tex;\n" \ "uniform int palette[768];\n" \ "void main(void) {\n" \ - "vec3 texel = texture2D(tex, gl_TexCoord[0].st);\n" \ - "int pal_idx = texture3D(lookup_tex, (63.0/64.0) * texel + 1.0 / 128.0)[0] * 255;\n" \ + "vec3 texel = vec3(texture2D(tex, gl_TexCoord[0].st));\n" \ + "int pal_idx = int(texture3D(lookup_tex, vec3((63.0/64.0) * texel + 1.0 / 128.0))[0] * 255.0);\n" \ "gl_FragColor = vec4(float(palette[pal_idx*3])/255.0, float(palette[pal_idx*3+1])/255.0, float(palette[pal_idx*3+2])/255.0, 1.0);\n" \ "}\0" - + #define GLSL_PALETTE_FRAGMENT_SHADER_OLD \ "uniform sampler2D tex;\n" \ "uniform int palette[768];\n" \ "void main(void) {\n" \ - "vec3 texel = texture2D(tex, gl_TexCoord[0].st);\n" \ + "vec3 texel = vec3(texture2D(tex, gl_TexCoord[0].st));\n" \ "vec3 best = vec3(200.0);\n" \ "for (int i = 0; i < 256; i++) {\n" \ "vec3 pal_color = vec3(palette[i*3] / 255.0, palette[i*3+1] / 255.0, palette[i*3+2] / 255.0);\n" \ @@ -792,10 +801,10 @@ static const char *fragment_shaders[] = { "void main(void) {\n" "gl_FragColor = texture2D(tex, gl_TexCoord[0].st);\n" "}\0", - + // Palette fragment shader GLSL_PALETTE_FRAGMENT_SHADER, - + NULL, }; @@ -840,8 +849,8 @@ static const char *vertex_shaders[] = { // Sky vertex shader GLSL_DEFAULT_VERTEX_SHADER, - - //Palette vertex shader + + // Palette vertex shader GLSL_DEFAULT_VERTEX_SHADER, NULL, @@ -851,6 +860,9 @@ static const char *vertex_shaders[] = { void SetupGLFunc4(void) { + /* 1.2 funcs */ + pglTexImage3D = GetGLFunc("glTexImage3D"); + /* 1.3 funcs */ pglActiveTexture = GetGLFunc("glActiveTexture"); pglMultiTexCoord2f = GetGLFunc("glMultiTexCoord2f"); pglClientActiveTexture = GetGLFunc("glClientActiveTexture"); @@ -888,8 +900,6 @@ void SetupGLFunc4(void) pglGetUniformLocation = GetGLFunc("glGetUniformLocation"); #endif - pglTexImage3D = GetGLFunc("glTexImage3D"); // how about here then... - // GLU pgluBuild2DMipmaps = GetGLFunc("gluBuild2DMipmaps"); } @@ -1079,7 +1089,6 @@ EXPORT void HWRAPI(KillShaders) (void) // unused......................... } -GLuint palette_tex_num; // length of one side of lookup texture // smallest separation between all the colors in the srb2 palette is 6, so // possibly a 64x64x64 lookup texture might be enough for 100% correct colors @@ -1089,20 +1098,28 @@ GLuint palette_tex_num; // the +2 in the NearestColor call also needs to be adjusted if LUT_SIZE is changed! // the hardcoded values in the shader also need to be adjusted if LUT_SIZE is changed! -static void InitPalette(void) +static void InitPalette(RGBA_t *palette) { int i, r, g, b; // init the palette for (i = 0; i < 256; i++) { - gl_palette[i*3] = pLocalPalette[i].s.red; - gl_palette[i*3+1] = pLocalPalette[i].s.green; - gl_palette[i*3+2] = pLocalPalette[i].s.blue; + // crush to 16-bit rgb565, like software currently does + float fred = (float)(pLocalPalette[i].s.red >> 3); + float fgreen = (float)(pLocalPalette[i].s.green >> 2); + float fblue = (float)(pLocalPalette[i].s.blue >> 3); + // restore to rgb888 + gl_palette[i*3] = (GLint)(fred / 31.0f * 255.0f); + gl_palette[i*3+1] = (GLint)(fgreen / 63.0f * 255.0f); + gl_palette[i*3+2] = (GLint)(fblue / 31.0f * 255.0f); + + // 24-bit option + /*gl_palette[i*3] = pMasterPalette[i].s.red; + gl_palette[i*3+1] = pMasterPalette[i].s.green; + gl_palette[i*3+2] = pMasterPalette[i].s.blue;*/ } // init the palette conversion lookup texture GLubyte *pal_lookup_tex = malloc(LUT_SIZE*LUT_SIZE*LUT_SIZE*sizeof(GLubyte)); - if (!pal_lookup_tex) - I_Error("Failed to allocate memory for generating palette lookup texture."); for (b = 0; b < LUT_SIZE; b++) { @@ -1110,25 +1127,39 @@ static void InitPalette(void) { for (r = 0; r < LUT_SIZE; r++) { - pal_lookup_tex[b*LUT_SIZE*LUT_SIZE+g*LUT_SIZE+r] = NearestColor(r*STEP_SIZE+2, g*STEP_SIZE+2, b*STEP_SIZE+2); + pal_lookup_tex[b*LUT_SIZE*LUT_SIZE+g*LUT_SIZE+r] = NearestColor(r*STEP_SIZE+0, g*STEP_SIZE+0, b*STEP_SIZE+0); } } } pglGenTextures(1, &palette_tex_num); + pglActiveTexture(GL_TEXTURE1); pglBindTexture(GL_TEXTURE_3D, palette_tex_num); pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - if (!pglTexImage3D) - I_Error("pglTexImage3D is NULL!"); pglTexImage3D(GL_TEXTURE_3D, 0, GL_R8, LUT_SIZE, LUT_SIZE, LUT_SIZE, 0, GL_RED, GL_UNSIGNED_BYTE, pal_lookup_tex); // test: put gl_red instead of gl_red_integer + pglActiveTexture(GL_TEXTURE0); free(pal_lookup_tex); pglUseProgram(gl_shaderprograms[8].program); pglUniform1i(gl_shaderprograms[8].uniforms[gluniform_color_lookup], 1); // bind sampler to second texture unit + + // bind the palette to the fancy shader here + pglUseProgram(gl_shaderprograms[9].program); + pglUniform1iv(gl_shaderprograms[9].uniforms[gluniform_palette], 768, gl_palette); + // bind the palette to the fancy shader here + pglUseProgram(gl_shaderprograms[10].program); + pglUniform1iv(gl_shaderprograms[10].uniforms[gluniform_palette], 768, gl_palette); pglUseProgram(0); pglBindTexture(GL_TEXTURE_3D, 0); + + // bind 3d lookup to unit 1, maybe it can stay there + pglActiveTexture(GL_TEXTURE1); + pglBindTexture(GL_TEXTURE_3D, palette_tex_num); + pglActiveTexture(GL_TEXTURE0); gl_palette_initialized = true; } + + // -----------------+ // SetNoTexture : Disable texture // -----------------+ @@ -1420,8 +1451,7 @@ EXPORT void HWRAPI(ClearBuffer) (FBOOLEAN ColorMask, pglEnableClientState(GL_VERTEX_ARRAY); // We always use this one pglEnableClientState(GL_TEXTURE_COORD_ARRAY); // And mostly this one, too - if (!gl_palette_initialized) - InitPalette(); // just gonna put this here for now + InitPalette(); // just gonna put this here for now, could try doing it on gl init } @@ -1643,6 +1673,7 @@ EXPORT void HWRAPI(SetTexture) (FTextureInfo *pTexInfo) w = pTexInfo->width; h = pTexInfo->height; + #ifdef USE_PALETTED_TEXTURE if (glColorTableEXT && @@ -2802,7 +2833,7 @@ EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value) break; } break; - + case HWD_SET_PALETTE_SHADER_ENABLED: gl_use_palette_shader = Value; break; -- 2.54.0 From b53cc6fd2bb75d8a7bc15e3277c39990bc189851 Mon Sep 17 00:00:00 2001 From: lug420 Date: Wed, 6 Sep 2023 18:29:26 +0200 Subject: [PATCH 12/42] fuck it palette renderer "lite" remove the goddamn lookup textures, this atleast runs okish and looks not that bad --- src/hardware/hw_main.c | 6 +- src/hardware/r_opengl/r_opengl.c | 104 +++---------------------------- 2 files changed, 11 insertions(+), 99 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 57df52185..b1563bebe 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -85,9 +85,7 @@ consvar_t cv_grcorrecttricks = {"gr_correcttricks", "Off", 0, CV_OnOff, NULL, 0, consvar_t cv_grsolvetjoin = {"gr_solvetjoin", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_grbatching = {"gr_batching", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; - -consvar_t cv_grpaletteshader = {"gr_paletteshader", "Off", CV_CALL, CV_OnOff, - CV_grpaletteshader_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_grpaletteshader = {"gr_paletteshader", "Off", CV_CALL|CV_SAVE, CV_OnOff, CV_grpaletteshader_OnChange, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t grrenderdistance_cons_t[] = { {0, "Max"}, {1, "1024"}, {2, "2048"}, {3, "4096"}, {4, "6144"}, {5, "8192"}, @@ -5954,7 +5952,6 @@ void HWR_AddCommands(void) CV_RegisterVar(&cv_grsolvetjoin); CV_RegisterVar(&cv_grbatching); - CV_RegisterVar(&cv_grpaletteshader); CV_RegisterVar(&cv_grscreentextures); CV_RegisterVar(&cv_grrenderdistance); CV_RegisterVar(&cv_grportals); @@ -5962,6 +5959,7 @@ void HWR_AddCommands(void) CV_RegisterVar(&cv_portalline); CV_RegisterVar(&cv_portalonly); CV_RegisterVar(&cv_secbright); + CV_RegisterVar(&cv_grpaletteshader); } // -------------------------------------------------------------------------- diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 32954be24..8de9b0974 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -27,7 +27,6 @@ #include "r_vbo.h" #include "../../v_video.h" // pLocalPalette -#include "../../r_data.h" // NearestColor #include "../../p_tick.h" // for leveltime (NOTE: THIS IS BAD, FIGURE OUT HOW TO PROPERLY IMPLEMENT gl_leveltime) #include "../../i_system.h" // for I_GetPreciseTime (batching time measurements) @@ -47,13 +46,12 @@ struct GLRGBAFloat GLfloat alpha; }; typedef struct GLRGBAFloat GLRGBAFloat; +static const GLubyte white[4] = { 255, 255, 255, 255 }; // ========================================================================== // CONSTANTS // ========================================================================== -static const GLubyte white[4] = { 255, 255, 255, 255 }; - // With OpenGL 1.1+, the first texture should be 1 #define NOTEXTURE_NUM 0 @@ -77,9 +75,7 @@ static FBITFIELD CurrentPolyFlags; static FTextureInfo* gr_cachetail = NULL; static FTextureInfo* gr_cachehead = NULL; -static RGBA_t screenPalette[256] = {0}; -static GLuint palette_tex_num = 0; // 3D texture containing RGB -> palette index lookup table -RGBA_t myPaletteData[256]; // the palette for converting textures to RGBA +RGBA_t myPaletteData[256]; GLint screen_width = 0; // used by Draw2DLine() GLint screen_height = 0; GLbyte screen_depth = 0; @@ -241,7 +237,6 @@ FUNCPRINTF void GL_DBG_Printf(const char *format, ...) #define pglTexEnvi glTexEnvi #define pglTexParameteri glTexParameteri #define pglTexImage2D glTexImage2D -#define pglTexImage3D glTexImage3D /* Fog */ #define pglFogf glFogf @@ -363,10 +358,6 @@ static PFNglTexParameteri pglTexParameteri; typedef void (APIENTRY * PFNglTexImage2D) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); static PFNglTexImage2D pglTexImage2D; -/* 1.2 functions for 3D textures */ -typedef void (APIENTRY * PFNglTexImage3D) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -static PFNglTexImage3D pglTexImage3D; - /* Fog */ typedef void (APIENTRY * PFNglFogf) (GLenum pname, GLfloat param); static PFNglFogf pglFogf; @@ -424,9 +415,6 @@ static PFNglColorPointer pglColorPointer; #ifndef GL_TEXTURE1 #define GL_TEXTURE1 0x84C1 #endif -#ifndef GL_TEXTURE2 -#define GL_TEXTURE2 0x84C2 -#endif boolean SetupGLfunc(void) { @@ -571,16 +559,15 @@ static boolean gl_shaderprogramchanged = true; static boolean gl_batching = false;// are we currently collecting batches? +static GLint gl_palette[768]; +static INT32 gl_use_palette_shader = 0; + static INT32 gl_enable_screen_textures = 1; static GLint gl_portal_stencil_level = 0; static INT32 gl_portal_mode = HWD_PORTAL_NORMAL; -static GLint gl_palette[768]; -static INT32 gl_use_palette_shader = 0; -static boolean gl_palette_initialized = false; - // 13062019 typedef enum { @@ -596,7 +583,6 @@ typedef enum gluniform_leveltime, gluniform_palette, - gluniform_color_lookup, gluniform_max, } gluniform_t; @@ -624,7 +610,6 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "float lightz = clamp(z / 16.0, 0.0, 127.0);\n" \ "float startmap = (15.0 - lightnum) * 4.0;\n" \ "float scale = 160.0 / (lightz + 1.0);\n" \ - "float cap = (155.0 - light) * 0.26;\n" \ "return startmap - scale * 0.5;\n" \ "}\n" @@ -732,7 +717,7 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; GLSL_SOFTWARE_FADE_EQUATION \ "gl_FragColor = final_color;\n" \ "}\0" - + // // Palette color quantization shader test. // @@ -740,16 +725,6 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; // Could test putting this to GLSL_SOFTWARE_FRAGMENT_SHADER and seeing what happens to performance. #define GLSL_PALETTE_FRAGMENT_SHADER \ - "uniform sampler2D tex;\n" \ - "uniform sampler3D lookup_tex;\n" \ - "uniform int palette[768];\n" \ - "void main(void) {\n" \ - "vec3 texel = vec3(texture2D(tex, gl_TexCoord[0].st));\n" \ - "int pal_idx = int(texture3D(lookup_tex, vec3((63.0/64.0) * texel + 1.0 / 128.0))[0] * 255.0);\n" \ - "gl_FragColor = vec4(float(palette[pal_idx*3])/255.0, float(palette[pal_idx*3+1])/255.0, float(palette[pal_idx*3+2])/255.0, 1.0);\n" \ - "}\0" - -#define GLSL_PALETTE_FRAGMENT_SHADER_OLD \ "uniform sampler2D tex;\n" \ "uniform int palette[768];\n" \ "void main(void) {\n" \ @@ -762,7 +737,6 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "gl_FragColor = vec4(best[0], best[1], best[2] ,1.0);\n" \ "}\0" - // // GLSL generic fragment shader // @@ -801,10 +775,10 @@ static const char *fragment_shaders[] = { "void main(void) {\n" "gl_FragColor = texture2D(tex, gl_TexCoord[0].st);\n" "}\0", - + // Palette fragment shader GLSL_PALETTE_FRAGMENT_SHADER, - + NULL, }; @@ -860,9 +834,6 @@ static const char *vertex_shaders[] = { void SetupGLFunc4(void) { - /* 1.2 funcs */ - pglTexImage3D = GetGLFunc("glTexImage3D"); - /* 1.3 funcs */ pglActiveTexture = GetGLFunc("glActiveTexture"); pglMultiTexCoord2f = GetGLFunc("glMultiTexCoord2f"); pglClientActiveTexture = GetGLFunc("glClientActiveTexture"); @@ -1015,7 +986,6 @@ EXPORT boolean HWRAPI(LoadShaders) (void) shader->uniforms[gluniform_leveltime] = GETUNI("leveltime"); shader->uniforms[gluniform_palette] = GETUNI("palette"); - shader->uniforms[gluniform_color_lookup] = GETUNI("lookup_tex"); #undef GETUNI } @@ -1089,16 +1059,7 @@ EXPORT void HWRAPI(KillShaders) (void) // unused......................... } -// length of one side of lookup texture -// smallest separation between all the colors in the srb2 palette is 6, so -// possibly a 64x64x64 lookup texture might be enough for 100% correct colors -// (min separation for 64^3 size is 4) -#define LUT_SIZE 64 -#define STEP_SIZE (256/LUT_SIZE) -// the +2 in the NearestColor call also needs to be adjusted if LUT_SIZE is changed! -// the hardcoded values in the shader also need to be adjusted if LUT_SIZE is changed! - -static void InitPalette(RGBA_t *palette) +static void InitPalette(void) { int i, r, g, b; // init the palette @@ -1118,48 +1079,8 @@ static void InitPalette(RGBA_t *palette) gl_palette[i*3+1] = pMasterPalette[i].s.green; gl_palette[i*3+2] = pMasterPalette[i].s.blue;*/ } - // init the palette conversion lookup texture - GLubyte *pal_lookup_tex = malloc(LUT_SIZE*LUT_SIZE*LUT_SIZE*sizeof(GLubyte)); - - for (b = 0; b < LUT_SIZE; b++) - { - for (g = 0; g < LUT_SIZE; g++) - { - for (r = 0; r < LUT_SIZE; r++) - { - pal_lookup_tex[b*LUT_SIZE*LUT_SIZE+g*LUT_SIZE+r] = NearestColor(r*STEP_SIZE+0, g*STEP_SIZE+0, b*STEP_SIZE+0); - } - } - } - pglGenTextures(1, &palette_tex_num); - pglActiveTexture(GL_TEXTURE1); - pglBindTexture(GL_TEXTURE_3D, palette_tex_num); - pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - pglTexImage3D(GL_TEXTURE_3D, 0, GL_R8, LUT_SIZE, LUT_SIZE, LUT_SIZE, 0, GL_RED, GL_UNSIGNED_BYTE, pal_lookup_tex); // test: put gl_red instead of gl_red_integer - pglActiveTexture(GL_TEXTURE0); - free(pal_lookup_tex); - pglUseProgram(gl_shaderprograms[8].program); - pglUniform1i(gl_shaderprograms[8].uniforms[gluniform_color_lookup], 1); // bind sampler to second texture unit - - // bind the palette to the fancy shader here - pglUseProgram(gl_shaderprograms[9].program); - pglUniform1iv(gl_shaderprograms[9].uniforms[gluniform_palette], 768, gl_palette); - // bind the palette to the fancy shader here - pglUseProgram(gl_shaderprograms[10].program); - pglUniform1iv(gl_shaderprograms[10].uniforms[gluniform_palette], 768, gl_palette); - pglUseProgram(0); - pglBindTexture(GL_TEXTURE_3D, 0); - - // bind 3d lookup to unit 1, maybe it can stay there - pglActiveTexture(GL_TEXTURE1); - pglBindTexture(GL_TEXTURE_3D, palette_tex_num); - pglActiveTexture(GL_TEXTURE0); - gl_palette_initialized = true; } - - // -----------------+ // SetNoTexture : Disable texture // -----------------+ @@ -1673,7 +1594,6 @@ EXPORT void HWRAPI(SetTexture) (FTextureInfo *pTexInfo) w = pTexInfo->width; h = pTexInfo->height; - #ifdef USE_PALETTED_TEXTURE if (glColorTableEXT && @@ -3910,8 +3830,6 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) { pglUseProgram(gl_shaderprograms[8].program); // palette shader pglUniform1iv(gl_shaderprograms[8].uniforms[gluniform_palette], 768, gl_palette); - pglActiveTexture(GL_TEXTURE1); - pglBindTexture(GL_TEXTURE_3D, palette_tex_num); } pglColor4ubv(white); @@ -3922,11 +3840,7 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) tex_downloaded = finalScreenTexture; if (gl_use_palette_shader) - { pglUseProgram(0); - pglBindTexture(GL_TEXTURE_3D, 0); - pglActiveTexture(GL_TEXTURE0); - } } #endif //HWRENDER -- 2.54.0 From b7671804731041b68d063fd135872ae657ce2704 Mon Sep 17 00:00:00 2001 From: lug420 Date: Thu, 7 Sep 2023 14:38:10 +0200 Subject: [PATCH 13/42] readd the lookup texture, adjust its size it runs a bit better like this, but also is a bit darker def needs adjustments --- src/hardware/hw_main.c | 22 ++++++--- src/hardware/r_opengl/r_opengl.c | 77 +++++++++++++++++++++++++++----- src/r_data.h | 2 - 3 files changed, 83 insertions(+), 18 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index b1563bebe..69e801c7e 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -60,6 +60,9 @@ struct hwdriver_s hwdriver; // Commands and console variables // ========================================================================== +// keep the state here instead of in the cv var, so it always matches the state in r_opengl.c +int gr_use_palette_shader = 0; + static void CV_filtermode_ONChange(void); static void CV_anisotropic_ONChange(void); static void CV_screentextures_ONChange(void); @@ -144,6 +147,7 @@ static void CV_grpaletteshader_OnChange(void) { if (rendermode == render_opengl) HWD.pfnSetSpecialState(HWD_SET_PALETTE_SHADER_ENABLED, cv_grpaletteshader.value); + gr_use_palette_shader = cv_grpaletteshader.value; } // ========================================================================== @@ -877,7 +881,7 @@ void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, FSurfa INT32 solid, i; lightlist_t * list = sector->lightlist; const UINT8 alpha = Surf->PolyColor.s.alpha; - FUINT lightnum = HWR_CalcWallLight(sector->lightlevel, v1x, v1y, v2x, v2y); + FUINT lightnum = sector->lightlevel;//HWR_CalcWallLight(sector->lightlevel, v1x, v1y, v2x, v2y); extracolormap_t *colormap = NULL; realtop = top = wallVerts[3].y; @@ -912,13 +916,15 @@ void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, FSurfa { if (pfloor && (pfloor->flags & FF_FOG)) { - lightnum = HWR_CalcWallLight(pfloor->master->frontsector->lightlevel, v1x, v1y, v2x, v2y); colormap = pfloor->master->frontsector->extra_colormap; + lightnum = pfloor->master->frontsector->lightlevel; + lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, v1x, v1y, v2x, v2y); } else { - lightnum = HWR_CalcWallLight(*list[i].lightlevel, v1x, v1y, v2x, v2y); colormap = list[i].extra_colormap; + lightnum = *list[i].lightlevel; + lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, v1x, v1y, v2x, v2y); } } @@ -1305,8 +1311,9 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom cliphigh = (float)(texturehpeg + (gr_curline->flength*FRACUNIT)); } - lightnum = HWR_CalcWallLight(gr_frontsector->lightlevel, vs.x, vs.y, ve.x, ve.y); colormap = gr_frontsector->extra_colormap; + lightnum = gr_frontsector->lightlevel; + lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, vs.x, vs.y, ve.x, ve.y); if (gr_frontsector) Surf.PolyColor.s.alpha = 255; @@ -2127,8 +2134,10 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom blendmode = PF_Fog|PF_NoTexture; - lightnum = HWR_CalcWallLight(rover->master->frontsector->lightlevel, vs.x, vs.y, ve.x, ve.y); colormap = rover->master->frontsector->extra_colormap; + lightnum = rover->master->frontsector->lightlevel; + lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, vs.x, vs.y, ve.x, ve.y); + Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel, rover->master->frontsector->extra_colormap); @@ -2250,8 +2259,9 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom blendmode = PF_Fog|PF_NoTexture; - lightnum = HWR_CalcWallLight(rover->master->frontsector->lightlevel, vs.x, vs.y, ve.x, ve.y); colormap = rover->master->frontsector->extra_colormap; + lightnum = rover->master->frontsector->lightlevel; + lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, vs.x, vs.y, ve.x, ve.y); Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel, rover->master->frontsector->extra_colormap); diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 8de9b0974..69df4729e 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -27,6 +27,7 @@ #include "r_vbo.h" #include "../../v_video.h" // pLocalPalette +#include "../../r_data.h" // NearestColor #include "../../p_tick.h" // for leveltime (NOTE: THIS IS BAD, FIGURE OUT HOW TO PROPERLY IMPLEMENT gl_leveltime) #include "../../i_system.h" // for I_GetPreciseTime (batching time measurements) @@ -72,8 +73,8 @@ static GLuint tex_downloaded = 0; static GLfloat fov = 90.0f; static FBITFIELD CurrentPolyFlags; -static FTextureInfo* gr_cachetail = NULL; -static FTextureInfo* gr_cachehead = NULL; +static FTextureInfo *gr_cachetail = NULL; +static FTextureInfo *gr_cachehead = NULL; RGBA_t myPaletteData[256]; GLint screen_width = 0; // used by Draw2DLine() @@ -237,6 +238,7 @@ FUNCPRINTF void GL_DBG_Printf(const char *format, ...) #define pglTexEnvi glTexEnvi #define pglTexParameteri glTexParameteri #define pglTexImage2D glTexImage2D +#define pglTexImage3D glTexImage3D /* Fog */ #define pglFogf glFogf @@ -357,6 +359,8 @@ typedef void (APIENTRY * PFNglTexParameteri) (GLenum target, GLenum pname, GLint static PFNglTexParameteri pglTexParameteri; typedef void (APIENTRY * PFNglTexImage2D) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); static PFNglTexImage2D pglTexImage2D; +typedef void (APIENTRY * PFNglTexImage3D) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +static PFNglTexImage3D pglTexImage3D; /* Fog */ typedef void (APIENTRY * PFNglFogf) (GLenum pname, GLfloat param); @@ -561,6 +565,7 @@ static boolean gl_batching = false;// are we currently collecting batches? static GLint gl_palette[768]; static INT32 gl_use_palette_shader = 0; +static boolean gl_palette_initialized = false; static INT32 gl_enable_screen_textures = 1; @@ -583,6 +588,7 @@ typedef enum gluniform_leveltime, gluniform_palette, + gluniform_color_lookup, gluniform_max, } gluniform_t; @@ -726,9 +732,19 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; #define GLSL_PALETTE_FRAGMENT_SHADER \ "uniform sampler2D tex;\n" \ + "uniform sampler3D lookup_tex;\n" \ "uniform int palette[768];\n" \ "void main(void) {\n" \ "vec3 texel = vec3(texture2D(tex, gl_TexCoord[0].st));\n" \ + "int pal_idx = int(texture3D(lookup_tex, vec3((63.0/64.0) * texel + 1.0 / 128.0))[0] * 255.0);\n" \ + "gl_FragColor = vec4(float(palette[pal_idx*3])/255.0, float(palette[pal_idx*3+1])/255.0, float(palette[pal_idx*3+2])/255.0, 1.0);\n" \ + "}\0" + +#define GLSL_PALETTE_FRAGMENT_SHADER_OLD \ + "uniform sampler2D tex;\n" \ + "uniform int palette[768];\n" \ + "void main(void) {\n" \ + "vec3 texel = vec3(texture2D(tex, gl_TexCoord[0].st));\n" \" \ "vec3 best = vec3(200.0);\n" \ "for (int i = 0; i < 256; i++) {\n" \ "vec3 pal_color = vec3(palette[i*3] / 255.0, palette[i*3+1] / 255.0, palette[i*3+2] / 255.0);\n" \ @@ -871,6 +887,8 @@ void SetupGLFunc4(void) pglGetUniformLocation = GetGLFunc("glGetUniformLocation"); #endif + pglTexImage3D = GetGLFunc("glTexImage3D"); // how about here then... + // GLU pgluBuild2DMipmaps = GetGLFunc("gluBuild2DMipmaps"); } @@ -986,6 +1004,7 @@ EXPORT boolean HWRAPI(LoadShaders) (void) shader->uniforms[gluniform_leveltime] = GETUNI("leveltime"); shader->uniforms[gluniform_palette] = GETUNI("palette"); + shader->uniforms[gluniform_color_lookup] = GETUNI("lookup_tex"); #undef GETUNI } @@ -1049,7 +1068,6 @@ EXPORT void HWRAPI(UnSetShader) (void) gl_shadersenabled = false; gl_currentshaderprogram = 0; gl_shaderprogramchanged = true;// not sure if this is needed - if (!pglUseProgram) return; pglUseProgram(0); #endif } @@ -1059,8 +1077,18 @@ EXPORT void HWRAPI(KillShaders) (void) // unused......................... } +GLuint palette_tex_num; +// length of one side of lookup texture +// smallest separation between all the colors in the srb2 palette is 6, so +// possibly a 64x64x64 lookup texture might be enough for 100% correct colors +// (min separation for 64^3 size is 4) +#define LUT_SIZE 16 +#define STEP_SIZE (256/LUT_SIZE) +// the +2 in the NearestColor call also needs to be adjusted if LUT_SIZE is changed! +// the hardcoded values in the shader also need to be adjusted if LUT_SIZE is changed! + static void InitPalette(void) -{ +{ int i, r, g, b; // init the palette for (i = 0; i < 256; i++) @@ -1073,12 +1101,34 @@ static void InitPalette(void) gl_palette[i*3] = (GLint)(fred / 31.0f * 255.0f); gl_palette[i*3+1] = (GLint)(fgreen / 63.0f * 255.0f); gl_palette[i*3+2] = (GLint)(fblue / 31.0f * 255.0f); - - // 24-bit option - /*gl_palette[i*3] = pMasterPalette[i].s.red; - gl_palette[i*3+1] = pMasterPalette[i].s.green; - gl_palette[i*3+2] = pMasterPalette[i].s.blue;*/ } + + // init the palette conversion lookup texture + GLubyte *pal_lookup_tex = malloc(LUT_SIZE*LUT_SIZE*LUT_SIZE*sizeof(GLubyte)); + if (!pal_lookup_tex) + I_Error("Failed to allocate memory for generating palette lookup texture."); + + for (b = 0; b < LUT_SIZE; b++) + { + for (g = 0; g < LUT_SIZE; g++) + { + for (r = 0; r < LUT_SIZE; r++) + { + pal_lookup_tex[b*LUT_SIZE*LUT_SIZE+g*LUT_SIZE+r] = NearestColor(r*STEP_SIZE+0, g*STEP_SIZE+0, b*STEP_SIZE+0); + } + } + } + pglGenTextures(1, &palette_tex_num); + pglBindTexture(GL_TEXTURE_3D, palette_tex_num); + pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + pglTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE8, LUT_SIZE, LUT_SIZE, LUT_SIZE, 0, GL_RED, GL_UNSIGNED_BYTE, pal_lookup_tex); // test: put gl_red instead of gl_red_integer + free(pal_lookup_tex); + pglUseProgram(gl_shaderprograms[8].program); + pglUniform1i(gl_shaderprograms[8].uniforms[gluniform_color_lookup], 1); // bind sampler to second texture unit + pglUseProgram(0); + pglBindTexture(GL_TEXTURE_3D, 0); + gl_palette_initialized = true; } // -----------------+ @@ -1372,7 +1422,8 @@ EXPORT void HWRAPI(ClearBuffer) (FBOOLEAN ColorMask, pglEnableClientState(GL_VERTEX_ARRAY); // We always use this one pglEnableClientState(GL_TEXTURE_COORD_ARRAY); // And mostly this one, too - InitPalette(); // just gonna put this here for now, could try doing it on gl init + if (gl_use_palette_shader == 1) + InitPalette(); // just gonna put this here for now } @@ -3830,6 +3881,8 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) { pglUseProgram(gl_shaderprograms[8].program); // palette shader pglUniform1iv(gl_shaderprograms[8].uniforms[gluniform_palette], 768, gl_palette); + pglActiveTexture(GL_TEXTURE1); + pglBindTexture(GL_TEXTURE_3D, palette_tex_num); } pglColor4ubv(white); @@ -3840,7 +3893,11 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) tex_downloaded = finalScreenTexture; if (gl_use_palette_shader) + { pglUseProgram(0); + pglBindTexture(GL_TEXTURE_3D, 0); + pglActiveTexture(GL_TEXTURE0); + } } #endif //HWRENDER diff --git a/src/r_data.h b/src/r_data.h index f371d40d7..6a8806988 100644 --- a/src/r_data.h +++ b/src/r_data.h @@ -104,6 +104,4 @@ UINT8 NearestColor(UINT8 r, UINT8 g, UINT8 b); extern INT32 numtextures; -UINT8 NearestColor(UINT8 r, UINT8 g, UINT8 b); - #endif -- 2.54.0 From 9bdcfe9750cd4ca39fabd8e70ecc89d146b66b0a Mon Sep 17 00:00:00 2001 From: lug420 Date: Thu, 7 Sep 2023 15:59:10 +0200 Subject: [PATCH 14/42] adjust some stuff bleh looks alr, but def loose some color depth with it --- src/hardware/r_opengl/r_opengl.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 69df4729e..df245c664 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -737,7 +737,7 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "void main(void) {\n" \ "vec3 texel = vec3(texture2D(tex, gl_TexCoord[0].st));\n" \ "int pal_idx = int(texture3D(lookup_tex, vec3((63.0/64.0) * texel + 1.0 / 128.0))[0] * 255.0);\n" \ - "gl_FragColor = vec4(float(palette[pal_idx*3])/255.0, float(palette[pal_idx*3+1])/255.0, float(palette[pal_idx*3+2])/255.0, 1.0);\n" \ + "gl_FragColor = vec4(float(palette[pal_idx*3])/232.0, float(palette[pal_idx*3+1])/232.0, float(palette[pal_idx*3+2])/232.0, 1.0);\n" \ "}\0" #define GLSL_PALETTE_FRAGMENT_SHADER_OLD \ @@ -1114,7 +1114,7 @@ static void InitPalette(void) { for (r = 0; r < LUT_SIZE; r++) { - pal_lookup_tex[b*LUT_SIZE*LUT_SIZE+g*LUT_SIZE+r] = NearestColor(r*STEP_SIZE+0, g*STEP_SIZE+0, b*STEP_SIZE+0); + pal_lookup_tex[b*LUT_SIZE*LUT_SIZE+g*LUT_SIZE+r] = NearestColor(r*STEP_SIZE+2, g*STEP_SIZE+2, b*STEP_SIZE+2); } } } @@ -1122,12 +1122,12 @@ static void InitPalette(void) pglBindTexture(GL_TEXTURE_3D, palette_tex_num); pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - pglTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE8, LUT_SIZE, LUT_SIZE, LUT_SIZE, 0, GL_RED, GL_UNSIGNED_BYTE, pal_lookup_tex); // test: put gl_red instead of gl_red_integer - free(pal_lookup_tex); + pglTexImage3D(GL_TEXTURE_3D, 0, GL_R8, LUT_SIZE, LUT_SIZE, LUT_SIZE, 0, GL_RED, GL_UNSIGNED_BYTE, pal_lookup_tex); // test: put gl_red instead of gl_red_integer pglUseProgram(gl_shaderprograms[8].program); pglUniform1i(gl_shaderprograms[8].uniforms[gluniform_color_lookup], 1); // bind sampler to second texture unit pglUseProgram(0); pglBindTexture(GL_TEXTURE_3D, 0); + free(pal_lookup_tex); gl_palette_initialized = true; } -- 2.54.0 From cdedf1349cd4e797a8e8ffcac3a9032d3278e888 Mon Sep 17 00:00:00 2001 From: Indev Date: Fri, 8 Sep 2023 11:47:19 +0300 Subject: [PATCH 15/42] Attempt to fix non-ansii filenames on windows --- src/w_wad.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/w_wad.c b/src/w_wad.c index 31977bea8..6f16b3477 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -148,6 +148,38 @@ void W_Shutdown(void) static char filenamebuf[MAX_WADPATH]; +// This #if is copied from filesrch.c, so not sure if it is 100% suitable for +// this +#if defined (_WIN32) && !defined (_XBOX) +//#define WIN32_LEAN_AND_MEAN +#define RPC_NO_WINDOWS_H +#include + +// Windows can't open utf-8 path so it must be converted to utf-16 +FILE* fopen_utf8(const char* filename, const char* mode) +{ + static const int MY_PATH_MAX = 2048; + WCHAR nameW[MY_PATH_MAX] = { 0 }; + WCHAR modeW[16] = { 0 }; + // the following function converts the UTF-8 filename to UTF-16 (WCHAR) nameW + int len = MultiByteToWideChar(CP_UTF8, 0, filename, -1, nameW, MY_PATH_MAX); + if(len > 0 && MultiByteToWideChar(CP_UTF8, 0, mode, -1, modeW, 16) > 0) + { + // using _wfopen_s() shuts up MSVC's complaints + // about _wfopen() being unsafe.. + FILE* ret = NULL; + if(_wfopen_s(&ret, nameW, modeW) == 0) + return ret; + } + return NULL; +} + +#else + +#define fopen_utf8 fopen + +#endif + // W_OpenWadFile // Helper function for opening the WAD file. // Returns the FILE * handle for the file, or NULL if not found or could not be opened @@ -165,7 +197,7 @@ FILE *W_OpenWadFile(const char **filename, boolean useerrors) *filename = filenamebuf; // open wad file - if ((handle = fopen(*filename, "rb")) == NULL) + if ((handle = fopen_utf8(*filename, "rb")) == NULL) { // If we failed to load the file with the path as specified by // the user, strip the directories and search for the file. @@ -175,7 +207,7 @@ FILE *W_OpenWadFile(const char **filename, boolean useerrors) // in filenamebuf == *filename. if (findfile(filenamebuf, NULL, true)) { - if ((handle = fopen(*filename, "rb")) == NULL) + if ((handle = fopen_utf8(*filename, "rb")) == NULL) { if (useerrors) CONS_Alert(CONS_ERROR, M_GetText("Can't open %s\n"), *filename); -- 2.54.0 From 9cd0e6c38512e56ca2e0c4c34e886b7e5db49cca Mon Sep 17 00:00:00 2001 From: Indev Date: Fri, 8 Sep 2023 12:00:10 +0300 Subject: [PATCH 16/42] Why is this 'variable-sized' and can't be initialized like that??? --- src/w_wad.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/w_wad.c b/src/w_wad.c index 6f16b3477..f715c26cb 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -159,8 +159,10 @@ static char filenamebuf[MAX_WADPATH]; FILE* fopen_utf8(const char* filename, const char* mode) { static const int MY_PATH_MAX = 2048; - WCHAR nameW[MY_PATH_MAX] = { 0 }; - WCHAR modeW[16] = { 0 }; + WCHAR nameW[MY_PATH_MAX]; + memset(nameW, 0, sizeof(WCHAR)*MY_PATH_MAX); + WCHAR modeW[16]; + memset(modeW, 0, sizeof(WCHAR)*16); // the following function converts the UTF-8 filename to UTF-16 (WCHAR) nameW int len = MultiByteToWideChar(CP_UTF8, 0, filename, -1, nameW, MY_PATH_MAX); if(len > 0 && MultiByteToWideChar(CP_UTF8, 0, mode, -1, modeW, 16) > 0) -- 2.54.0 From 3aac16432aa20878775e00f08eebc0bd8d2d9893 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Sat, 9 Sep 2023 16:18:46 +0200 Subject: [PATCH 17/42] adjust things more try to mitigate performance loss and stutters readjust the look a bit cleanup stuff a bit this thing still pretty much runs badly --- src/hardware/r_opengl/r_opengl.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index df245c664..b7420717e 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -565,7 +565,6 @@ static boolean gl_batching = false;// are we currently collecting batches? static GLint gl_palette[768]; static INT32 gl_use_palette_shader = 0; -static boolean gl_palette_initialized = false; static INT32 gl_enable_screen_textures = 1; @@ -736,8 +735,8 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "uniform int palette[768];\n" \ "void main(void) {\n" \ "vec3 texel = vec3(texture2D(tex, gl_TexCoord[0].st));\n" \ - "int pal_idx = int(texture3D(lookup_tex, vec3((63.0/64.0) * texel + 1.0 / 128.0))[0] * 255.0);\n" \ - "gl_FragColor = vec4(float(palette[pal_idx*3])/232.0, float(palette[pal_idx*3+1])/232.0, float(palette[pal_idx*3+2])/232.0, 1.0);\n" \ + "int pal_idx = int(texture3D(lookup_tex, vec3((11.0/12.0) * texel + 1.0 / 24.0))[0] * 255.0);\n" \ + "gl_FragColor = vec4(float(palette[pal_idx*3])/250.0, float(palette[pal_idx*3+1])/250.0, float(palette[pal_idx*3+2])/250.0, 1.0);\n" \ "}\0" #define GLSL_PALETTE_FRAGMENT_SHADER_OLD \ @@ -850,6 +849,7 @@ static const char *vertex_shaders[] = { void SetupGLFunc4(void) { + pglTexImage3D = GetGLFunc("glTexImage3D"); pglActiveTexture = GetGLFunc("glActiveTexture"); pglMultiTexCoord2f = GetGLFunc("glMultiTexCoord2f"); pglClientActiveTexture = GetGLFunc("glClientActiveTexture"); @@ -887,8 +887,6 @@ void SetupGLFunc4(void) pglGetUniformLocation = GetGLFunc("glGetUniformLocation"); #endif - pglTexImage3D = GetGLFunc("glTexImage3D"); // how about here then... - // GLU pgluBuild2DMipmaps = GetGLFunc("gluBuild2DMipmaps"); } @@ -1082,7 +1080,7 @@ GLuint palette_tex_num; // smallest separation between all the colors in the srb2 palette is 6, so // possibly a 64x64x64 lookup texture might be enough for 100% correct colors // (min separation for 64^3 size is 4) -#define LUT_SIZE 16 +#define LUT_SIZE 12 #define STEP_SIZE (256/LUT_SIZE) // the +2 in the NearestColor call also needs to be adjusted if LUT_SIZE is changed! // the hardcoded values in the shader also need to be adjusted if LUT_SIZE is changed! @@ -1102,7 +1100,7 @@ static void InitPalette(void) gl_palette[i*3+1] = (GLint)(fgreen / 63.0f * 255.0f); gl_palette[i*3+2] = (GLint)(fblue / 31.0f * 255.0f); } - + // init the palette conversion lookup texture GLubyte *pal_lookup_tex = malloc(LUT_SIZE*LUT_SIZE*LUT_SIZE*sizeof(GLubyte)); if (!pal_lookup_tex) @@ -1114,21 +1112,21 @@ static void InitPalette(void) { for (r = 0; r < LUT_SIZE; r++) { - pal_lookup_tex[b*LUT_SIZE*LUT_SIZE+g*LUT_SIZE+r] = NearestColor(r*STEP_SIZE+2, g*STEP_SIZE+2, b*STEP_SIZE+2); + pal_lookup_tex[b*LUT_SIZE*LUT_SIZE+g*LUT_SIZE+r] = NearestColor(r*STEP_SIZE+3, g*STEP_SIZE+3, b*STEP_SIZE+3); } } } + pglGenTextures(1, &palette_tex_num); pglBindTexture(GL_TEXTURE_3D, palette_tex_num); pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - pglTexImage3D(GL_TEXTURE_3D, 0, GL_R8, LUT_SIZE, LUT_SIZE, LUT_SIZE, 0, GL_RED, GL_UNSIGNED_BYTE, pal_lookup_tex); // test: put gl_red instead of gl_red_integer + pglTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE8, LUT_SIZE, LUT_SIZE, LUT_SIZE, 0, GL_RED, GL_UNSIGNED_BYTE, pal_lookup_tex); // test: put gl_red instead of gl_red_integer pglUseProgram(gl_shaderprograms[8].program); pglUniform1i(gl_shaderprograms[8].uniforms[gluniform_color_lookup], 1); // bind sampler to second texture unit pglUseProgram(0); pglBindTexture(GL_TEXTURE_3D, 0); free(pal_lookup_tex); - gl_palette_initialized = true; } // -----------------+ -- 2.54.0 From a639c87a90992823928290f7da0d4b9396d05434 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Sun, 10 Sep 2023 16:43:42 +0200 Subject: [PATCH 18/42] rework this thing, use parts of the new palette renderer this atleast completely fixed the stutters and prob the memory leaks the thing had before its still super messy and idk --- src/hardware/r_opengl/r_opengl.c | 74 +++++++++++++++++++++++--------- 1 file changed, 54 insertions(+), 20 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index b7420717e..403547837 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -25,6 +25,7 @@ #include #include "r_opengl.h" #include "r_vbo.h" +#include "../../z_zone.h" #include "../../v_video.h" // pLocalPalette #include "../../r_data.h" // NearestColor @@ -75,8 +76,9 @@ static FBITFIELD CurrentPolyFlags; static FTextureInfo *gr_cachetail = NULL; static FTextureInfo *gr_cachehead = NULL; - -RGBA_t myPaletteData[256]; +static GLuint palette_tex_num = 0; // 1D texture containing the screen palette +static GLuint pal_lookup_tex = 0; // 3D texture containing RGB -> palette index lookup table +RGBA_t myPaletteData[256]; // the palette for converting textures to RGBA GLint screen_width = 0; // used by Draw2DLine() GLint screen_height = 0; GLbyte screen_depth = 0; @@ -357,6 +359,8 @@ typedef void (APIENTRY * PFNglTexEnvi) (GLenum target, GLenum pname, GLint param static PFNglTexEnvi pglTexEnvi; typedef void (APIENTRY * PFNglTexParameteri) (GLenum target, GLenum pname, GLint param); static PFNglTexParameteri pglTexParameteri; +typedef void (APIENTRY * PFNglTexImage1D) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +static PFNglTexImage1D pglTexImage1D; typedef void (APIENTRY * PFNglTexImage2D) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); static PFNglTexImage2D pglTexImage2D; typedef void (APIENTRY * PFNglTexImage3D) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); @@ -419,6 +423,9 @@ static PFNglColorPointer pglColorPointer; #ifndef GL_TEXTURE1 #define GL_TEXTURE1 0x84C1 #endif +#ifndef GL_TEXTURE2 +#define GL_TEXTURE2 0x84C2 +#endif boolean SetupGLfunc(void) { @@ -481,6 +488,7 @@ boolean SetupGLfunc(void) GETOPENGLFUNC(pglTexEnvi, glTexEnvi) GETOPENGLFUNC(pglTexParameteri, glTexParameteri) + GETOPENGLFUNC(pglTexImage1D, glTexImage1D) GETOPENGLFUNC(pglTexImage2D, glTexImage2D) GETOPENGLFUNC(pglFogf, glFogf) @@ -1005,6 +1013,20 @@ EXPORT boolean HWRAPI(LoadShaders) (void) shader->uniforms[gluniform_color_lookup] = GETUNI("lookup_tex"); #undef GETUNI + +// set permanent uniform values +#define UNIFORM_1(uniform, a, function) \ + if (uniform != -1) \ + function (uniform, a); + + pglUseProgram(shader->program); + + // texture unit numbers for the samplers used for palette rendering + UNIFORM_1(shader->uniforms[gluniform_palette], 2, pglUniform1i); + UNIFORM_1(shader->uniforms[gluniform_color_lookup], 1, pglUniform1i); + +#undef UNIFORM_1 + } #endif return true; @@ -1075,7 +1097,7 @@ EXPORT void HWRAPI(KillShaders) (void) // unused......................... } -GLuint palette_tex_num; + // length of one side of lookup texture // smallest separation between all the colors in the srb2 palette is 6, so // possibly a 64x64x64 lookup texture might be enough for 100% correct colors @@ -1101,32 +1123,39 @@ static void InitPalette(void) gl_palette[i*3+2] = (GLint)(fblue / 31.0f * 255.0f); } - // init the palette conversion lookup texture - GLubyte *pal_lookup_tex = malloc(LUT_SIZE*LUT_SIZE*LUT_SIZE*sizeof(GLubyte)); - if (!pal_lookup_tex) - I_Error("Failed to allocate memory for generating palette lookup texture."); - - for (b = 0; b < LUT_SIZE; b++) - { - for (g = 0; g < LUT_SIZE; g++) + // init the palette conversion lookup texture + UINT8 *pal_lookup_tex = Z_Malloc( + LUT_SIZE*LUT_SIZE*LUT_SIZE*sizeof(UINT8), + PU_STATIC, NULL); + + if (!pal_lookup_tex) + I_Error("Failed to allocate memory for generating palette lookup texture."); + + for (b = 0; b < LUT_SIZE; b++) { - for (r = 0; r < LUT_SIZE; r++) + for (g = 0; g < LUT_SIZE; g++) { - pal_lookup_tex[b*LUT_SIZE*LUT_SIZE+g*LUT_SIZE+r] = NearestColor(r*STEP_SIZE+3, g*STEP_SIZE+3, b*STEP_SIZE+3); + for (r = 0; r < LUT_SIZE; r++) + { + pal_lookup_tex[b*LUT_SIZE*LUT_SIZE+g*LUT_SIZE+r] = NearestColor(r*STEP_SIZE+3, g*STEP_SIZE+3, b*STEP_SIZE+3); + } } } - } - +#undef STEP_SIZE + Z_Free(pal_lookup_tex); + pglGenTextures(1, &palette_tex_num); + pglActiveTexture(GL_TEXTURE1); pglBindTexture(GL_TEXTURE_3D, palette_tex_num); pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - pglTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE8, LUT_SIZE, LUT_SIZE, LUT_SIZE, 0, GL_RED, GL_UNSIGNED_BYTE, pal_lookup_tex); // test: put gl_red instead of gl_red_integer + pglTexImage3D(GL_TEXTURE_3D, 0, GL_R8, LUT_SIZE, LUT_SIZE, LUT_SIZE, 0, GL_RED, GL_UNSIGNED_BYTE, pal_lookup_tex); + pglActiveTexture(GL_TEXTURE0); pglUseProgram(gl_shaderprograms[8].program); pglUniform1i(gl_shaderprograms[8].uniforms[gluniform_color_lookup], 1); // bind sampler to second texture unit pglUseProgram(0); pglBindTexture(GL_TEXTURE_3D, 0); - free(pal_lookup_tex); + } // -----------------+ @@ -3878,9 +3907,14 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) if (gl_use_palette_shader) { pglUseProgram(gl_shaderprograms[8].program); // palette shader - pglUniform1iv(gl_shaderprograms[8].uniforms[gluniform_palette], 768, gl_palette); + pglUniform1iv(gl_shaderprograms[8].uniforms[gluniform_palette], 768, gl_palette); + pglGenTextures(1, &palette_tex_num); pglActiveTexture(GL_TEXTURE1); - pglBindTexture(GL_TEXTURE_3D, palette_tex_num); + pglBindTexture(GL_TEXTURE_1D, palette_tex_num); + pglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + pglTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, gl_palette); + pglActiveTexture(GL_TEXTURE0); } pglColor4ubv(white); @@ -3893,7 +3927,7 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) if (gl_use_palette_shader) { pglUseProgram(0); - pglBindTexture(GL_TEXTURE_3D, 0); + pglBindTexture(GL_TEXTURE_1D, 0); pglActiveTexture(GL_TEXTURE0); } } -- 2.54.0 From 3ce4653bb5e9c090f1d49247e8d5e3fb07edcb5c Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Sun, 10 Sep 2023 16:57:38 +0200 Subject: [PATCH 19/42] smol adjustment --- src/hardware/r_opengl/r_opengl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 403547837..870cc6652 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -743,7 +743,7 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "uniform int palette[768];\n" \ "void main(void) {\n" \ "vec3 texel = vec3(texture2D(tex, gl_TexCoord[0].st));\n" \ - "int pal_idx = int(texture3D(lookup_tex, vec3((11.0/12.0) * texel + 1.0 / 24.0))[0] * 255.0);\n" \ + "int pal_idx = int(texture3D(lookup_tex, vec3((texel * 11.0 + 0.5) / 12.0))[0] * 255.0);\n" \ "gl_FragColor = vec4(float(palette[pal_idx*3])/250.0, float(palette[pal_idx*3+1])/250.0, float(palette[pal_idx*3+2])/250.0, 1.0);\n" \ "}\0" -- 2.54.0 From d3d40de996c9d45551c7e740e45348aec7ba2ae9 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Sun, 10 Sep 2023 18:59:31 +0200 Subject: [PATCH 20/42] unfuck this thing change lut size to full 64 holy fuck, goddamit, im so mad at this --- src/hardware/r_opengl/r_opengl.c | 41 +++++++++++--------------------- 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 870cc6652..a1c33bd9d 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -25,7 +25,6 @@ #include #include "r_opengl.h" #include "r_vbo.h" -#include "../../z_zone.h" #include "../../v_video.h" // pLocalPalette #include "../../r_data.h" // NearestColor @@ -359,8 +358,6 @@ typedef void (APIENTRY * PFNglTexEnvi) (GLenum target, GLenum pname, GLint param static PFNglTexEnvi pglTexEnvi; typedef void (APIENTRY * PFNglTexParameteri) (GLenum target, GLenum pname, GLint param); static PFNglTexParameteri pglTexParameteri; -typedef void (APIENTRY * PFNglTexImage1D) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -static PFNglTexImage1D pglTexImage1D; typedef void (APIENTRY * PFNglTexImage2D) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); static PFNglTexImage2D pglTexImage2D; typedef void (APIENTRY * PFNglTexImage3D) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); @@ -423,9 +420,6 @@ static PFNglColorPointer pglColorPointer; #ifndef GL_TEXTURE1 #define GL_TEXTURE1 0x84C1 #endif -#ifndef GL_TEXTURE2 -#define GL_TEXTURE2 0x84C2 -#endif boolean SetupGLfunc(void) { @@ -488,7 +482,6 @@ boolean SetupGLfunc(void) GETOPENGLFUNC(pglTexEnvi, glTexEnvi) GETOPENGLFUNC(pglTexParameteri, glTexParameteri) - GETOPENGLFUNC(pglTexImage1D, glTexImage1D) GETOPENGLFUNC(pglTexImage2D, glTexImage2D) GETOPENGLFUNC(pglFogf, glFogf) @@ -573,6 +566,7 @@ static boolean gl_batching = false;// are we currently collecting batches? static GLint gl_palette[768]; static INT32 gl_use_palette_shader = 0; +static boolean gl_palette_initialized = false; static INT32 gl_enable_screen_textures = 1; @@ -743,8 +737,8 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "uniform int palette[768];\n" \ "void main(void) {\n" \ "vec3 texel = vec3(texture2D(tex, gl_TexCoord[0].st));\n" \ - "int pal_idx = int(texture3D(lookup_tex, vec3((texel * 11.0 + 0.5) / 12.0))[0] * 255.0);\n" \ - "gl_FragColor = vec4(float(palette[pal_idx*3])/250.0, float(palette[pal_idx*3+1])/250.0, float(palette[pal_idx*3+2])/250.0, 1.0);\n" \ + "int pal_idx = int(texture3D(lookup_tex, vec3((texel * 63.0 + 0.5) / 64.0))[0] * 255.0);\n" \ + "gl_FragColor = vec4(float(palette[pal_idx*3])/255.0, float(palette[pal_idx*3+1])/255.0, float(palette[pal_idx*3+2])/255.0, 1.0);\n" \ "}\0" #define GLSL_PALETTE_FRAGMENT_SHADER_OLD \ @@ -1088,6 +1082,7 @@ EXPORT void HWRAPI(UnSetShader) (void) gl_shadersenabled = false; gl_currentshaderprogram = 0; gl_shaderprogramchanged = true;// not sure if this is needed + if (!pglUseProgram) return; pglUseProgram(0); #endif } @@ -1097,12 +1092,11 @@ EXPORT void HWRAPI(KillShaders) (void) // unused......................... } - // length of one side of lookup texture // smallest separation between all the colors in the srb2 palette is 6, so // possibly a 64x64x64 lookup texture might be enough for 100% correct colors // (min separation for 64^3 size is 4) -#define LUT_SIZE 12 +#define LUT_SIZE 64 #define STEP_SIZE (256/LUT_SIZE) // the +2 in the NearestColor call also needs to be adjusted if LUT_SIZE is changed! // the hardcoded values in the shader also need to be adjusted if LUT_SIZE is changed! @@ -1124,9 +1118,7 @@ static void InitPalette(void) } // init the palette conversion lookup texture - UINT8 *pal_lookup_tex = Z_Malloc( - LUT_SIZE*LUT_SIZE*LUT_SIZE*sizeof(UINT8), - PU_STATIC, NULL); + GLubyte *pal_lookup_tex = malloc(LUT_SIZE*LUT_SIZE*LUT_SIZE*sizeof(GLubyte)); if (!pal_lookup_tex) I_Error("Failed to allocate memory for generating palette lookup texture."); @@ -1137,25 +1129,24 @@ static void InitPalette(void) { for (r = 0; r < LUT_SIZE; r++) { - pal_lookup_tex[b*LUT_SIZE*LUT_SIZE+g*LUT_SIZE+r] = NearestColor(r*STEP_SIZE+3, g*STEP_SIZE+3, b*STEP_SIZE+3); + pal_lookup_tex[b*LUT_SIZE*LUT_SIZE+g*LUT_SIZE+r] = NearestColor(r*STEP_SIZE+0, g*STEP_SIZE+0, b*STEP_SIZE+0); } } } #undef STEP_SIZE - Z_Free(pal_lookup_tex); + pglGenTextures(1, &palette_tex_num); - pglActiveTexture(GL_TEXTURE1); pglBindTexture(GL_TEXTURE_3D, palette_tex_num); pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); pglTexImage3D(GL_TEXTURE_3D, 0, GL_R8, LUT_SIZE, LUT_SIZE, LUT_SIZE, 0, GL_RED, GL_UNSIGNED_BYTE, pal_lookup_tex); - pglActiveTexture(GL_TEXTURE0); + free(pal_lookup_tex); pglUseProgram(gl_shaderprograms[8].program); pglUniform1i(gl_shaderprograms[8].uniforms[gluniform_color_lookup], 1); // bind sampler to second texture unit pglUseProgram(0); pglBindTexture(GL_TEXTURE_3D, 0); - + gl_palette_initialized = true; } // -----------------+ @@ -1449,7 +1440,7 @@ EXPORT void HWRAPI(ClearBuffer) (FBOOLEAN ColorMask, pglEnableClientState(GL_VERTEX_ARRAY); // We always use this one pglEnableClientState(GL_TEXTURE_COORD_ARRAY); // And mostly this one, too - if (gl_use_palette_shader == 1) + if (!gl_palette_initialized) InitPalette(); // just gonna put this here for now } @@ -3908,13 +3899,8 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) { pglUseProgram(gl_shaderprograms[8].program); // palette shader pglUniform1iv(gl_shaderprograms[8].uniforms[gluniform_palette], 768, gl_palette); - pglGenTextures(1, &palette_tex_num); pglActiveTexture(GL_TEXTURE1); - pglBindTexture(GL_TEXTURE_1D, palette_tex_num); - pglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - pglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - pglTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, gl_palette); - pglActiveTexture(GL_TEXTURE0); + pglBindTexture(GL_TEXTURE_3D, palette_tex_num); } pglColor4ubv(white); @@ -3924,10 +3910,11 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) pglDrawArrays(GL_TRIANGLE_FAN, 0, 4); tex_downloaded = finalScreenTexture; + if (gl_use_palette_shader) { pglUseProgram(0); - pglBindTexture(GL_TEXTURE_1D, 0); + pglBindTexture(GL_TEXTURE_3D, 0); pglActiveTexture(GL_TEXTURE0); } } -- 2.54.0 From 362c21505ddb77d8656e0d9134cec4c66267e7d1 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Mon, 11 Sep 2023 01:04:43 +0200 Subject: [PATCH 21/42] smol fixup fixes the weird black/white screen on game start --- src/hardware/r_opengl/r_opengl.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index a1c33bd9d..bb3a019ac 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -585,11 +585,12 @@ typedef enum gluniform_fade_start, gluniform_fade_end, - // misc. (custom shaders) - gluniform_leveltime, - + // palette rendering gluniform_palette, gluniform_color_lookup, + + // misc. + gluniform_leveltime, gluniform_max, } gluniform_t; @@ -1000,11 +1001,12 @@ EXPORT boolean HWRAPI(LoadShaders) (void) shader->uniforms[gluniform_fade_start] = GETUNI("fade_start"); shader->uniforms[gluniform_fade_end] = GETUNI("fade_end"); - // misc. (custom shaders) - shader->uniforms[gluniform_leveltime] = GETUNI("leveltime"); - + // palette rendering shader->uniforms[gluniform_palette] = GETUNI("palette"); shader->uniforms[gluniform_color_lookup] = GETUNI("lookup_tex"); + + // misc. (custom shaders) + shader->uniforms[gluniform_leveltime] = GETUNI("leveltime"); #undef GETUNI @@ -1018,6 +1020,8 @@ EXPORT boolean HWRAPI(LoadShaders) (void) // texture unit numbers for the samplers used for palette rendering UNIFORM_1(shader->uniforms[gluniform_palette], 2, pglUniform1i); UNIFORM_1(shader->uniforms[gluniform_color_lookup], 1, pglUniform1i); + + pglUseProgram(0); #undef UNIFORM_1 -- 2.54.0 From 561af0e601008f5279519d547fbc03130e3fcae6 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Mon, 11 Sep 2023 02:14:22 +0200 Subject: [PATCH 22/42] smol adjustment --- src/hardware/r_opengl/r_opengl.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index bb3a019ac..82787faf6 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -736,9 +736,13 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "uniform sampler2D tex;\n" \ "uniform sampler3D lookup_tex;\n" \ "uniform int palette[768];\n" \ + "uniform float lighting;\n" \ + GLSL_DOOM_COLORMAP \ "void main(void) {\n" \ - "vec3 texel = vec3(texture2D(tex, gl_TexCoord[0].st));\n" \ - "int pal_idx = int(texture3D(lookup_tex, vec3((texel * 63.0 + 0.5) / 64.0))[0] * 255.0);\n" \ + "vec4 texel = texture2D(tex, gl_TexCoord[0].st);\n" \ + "float pal_idx = int(texture3D(lookup_tex, vec3((texel * 63.0 + 0.5) / 64.0))[0] * 255.0);\n" \ + "float z = gl_FragCoord.z / gl_FragCoord.w;\n" \ + "float light_y = clamp(floor(R_DoomColormap(lighting, z)), 0.0, 31.0);\n" \ "gl_FragColor = vec4(float(palette[pal_idx*3])/255.0, float(palette[pal_idx*3+1])/255.0, float(palette[pal_idx*3+2])/255.0, 1.0);\n" \ "}\0" -- 2.54.0 From f46b77ab7b9233b065e281c264de10a6f12f2060 Mon Sep 17 00:00:00 2001 From: hayaunderscore Date: Mon, 11 Sep 2023 13:59:15 +0800 Subject: [PATCH 23/42] fix shader compile error, fix custom level palettes --- src/hardware/r_opengl/r_opengl.c | 6 +++--- src/hardware/r_opengl/r_opengl.h | 4 ++++ src/v_video.c | 7 ++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 82787faf6..2b2dc1b1d 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -566,7 +566,7 @@ static boolean gl_batching = false;// are we currently collecting batches? static GLint gl_palette[768]; static INT32 gl_use_palette_shader = 0; -static boolean gl_palette_initialized = false; +boolean gl_palette_initialized = false; static INT32 gl_enable_screen_textures = 1; @@ -740,7 +740,7 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; GLSL_DOOM_COLORMAP \ "void main(void) {\n" \ "vec4 texel = texture2D(tex, gl_TexCoord[0].st);\n" \ - "float pal_idx = int(texture3D(lookup_tex, vec3((texel * 63.0 + 0.5) / 64.0))[0] * 255.0);\n" \ + "int pal_idx = int(texture3D(lookup_tex, vec3((texel * 63.0 + 0.5) / 64.0))[0] * 255.0);\n" \ "float z = gl_FragCoord.z / gl_FragCoord.w;\n" \ "float light_y = clamp(floor(R_DoomColormap(lighting, z)), 0.0, 31.0);\n" \ "gl_FragColor = vec4(float(palette[pal_idx*3])/255.0, float(palette[pal_idx*3+1])/255.0, float(palette[pal_idx*3+2])/255.0, 1.0);\n" \ @@ -1109,7 +1109,7 @@ EXPORT void HWRAPI(KillShaders) (void) // the +2 in the NearestColor call also needs to be adjusted if LUT_SIZE is changed! // the hardcoded values in the shader also need to be adjusted if LUT_SIZE is changed! -static void InitPalette(void) +void InitPalette(void) { int i, r, g, b; // init the palette diff --git a/src/hardware/r_opengl/r_opengl.h b/src/hardware/r_opengl/r_opengl.h index 6d11bf4e3..f4a3f3849 100644 --- a/src/hardware/r_opengl/r_opengl.h +++ b/src/hardware/r_opengl/r_opengl.h @@ -133,4 +133,8 @@ typedef enum GLF_NOTEXENV = 0x02, } oglflags_t; +// in order for custom playpals n shit to work properly +extern boolean gl_palette_initialized; +void InitPalette(void); + #endif diff --git a/src/v_video.c b/src/v_video.c index 602e89248..77295c41b 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -28,6 +28,7 @@ #ifdef HWRENDER #include "hardware/hw_main.h" +#include "hardware/r_opengl/r_opengl.h" #endif // Each screen is [vid.width*vid.height]; @@ -238,8 +239,12 @@ void V_SetPaletteLump(const char *pal) { LoadPalette(pal); #ifdef HWRENDER - if (rendermode != render_soft && rendermode != render_none) + if (rendermode != render_soft && rendermode != render_none) { + // reset our palette lookups n shit + gl_palette_initialized = false; + InitPalette(); HWR_SetPalette(pLocalPalette); + } #if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL) else #endif -- 2.54.0 From 16a7e69292ae7629b0f37d35b1f4b368ea5960ac Mon Sep 17 00:00:00 2001 From: Indev Date: Mon, 11 Sep 2023 13:01:29 +0300 Subject: [PATCH 24/42] Don't init discord rich presence untill discordrp is set to On Haven't tested this since i'm on linux and the feature looks like it is windows only --- src/discord.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/discord.c b/src/discord.c index 6926b4e1c..a845b6104 100644 --- a/src/discord.c +++ b/src/discord.c @@ -47,6 +47,8 @@ discordRequest_t *discordRequestList = NULL; static char self_ip[IP_SIZE]; +boolean drpc_init = false; + /*-------------------------------------------------- static char *DRPC_XORIPString(const char *input) @@ -315,6 +317,9 @@ void DRPC_RemoveRequest(discordRequest_t *removeRequest) --------------------------------------------------*/ void DRPC_Init(void) { + if (drpc_init || !cv_discordrp.value) return; + + drpc_init = true; DiscordEventHandlers handlers; memset(&handlers, 0, sizeof(handlers)); @@ -402,6 +407,10 @@ static void DRPC_EmptyRequests(void) --------------------------------------------------*/ void DRPC_UpdatePresence(void) { + if (!cv_discordrp.value) return; + + if (!drpc_init) DRPC_Init(); + char detailstr[48+1]; char mapimg[8+1]; -- 2.54.0 From 346433d248987d6f3ca4708150681a4bc38cbcd2 Mon Sep 17 00:00:00 2001 From: Indev Date: Mon, 11 Sep 2023 13:17:12 +0300 Subject: [PATCH 25/42] Shutdown DiscordRPC when discordrp cvar is set to Off --- src/discord.c | 32 ++++++++++++++++++++++++++++++-- src/discord.h | 7 +++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/discord.c b/src/discord.c index a845b6104..ea9bc66b9 100644 --- a/src/discord.c +++ b/src/discord.c @@ -37,7 +37,9 @@ // length of IP strings #define IP_SIZE 21 -consvar_t cv_discordrp = {"discordrp", "On", CV_SAVE|CV_CALL, CV_OnOff, DRPC_UpdatePresence, 0, NULL, NULL, 0, 0, NULL}; +static void Discordrp_OnChange(void); + +consvar_t cv_discordrp = {"discordrp", "On", CV_SAVE|CV_CALL, CV_OnOff, Discordrp_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_discordstreamer = {"discordstreamer", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_discordasks = {"discordasks", "Yes", CV_SAVE|CV_CALL, CV_YesNo, DRPC_UpdatePresence, 0, NULL, NULL, 0, 0, NULL}; @@ -330,10 +332,36 @@ void DRPC_Init(void) handlers.joinRequest = DRPC_HandleJoinRequest; Discord_Initialize(DISCORD_APPID, &handlers, 1, NULL); - I_AddExitFunc(Discord_Shutdown); + I_AddExitFunc(DRPC_Shutdown); DRPC_UpdatePresence(); } +void DRPC_Shutdown(void) +{ + if (!drpc_init) + { + CONS_Printf("DiscordRPC never started\n"); + return; + } + + CONS_Printf("Shutting down DiscordRPC\n"); + + Discord_Shutdown(); + drpc_init = false; +} + +static void Discordrp_OnChange(void) +{ + if (cv_discordrp.value) + { + DRPC_UpdatePresence(); + } + else + { + DRPC_Shutdown(); + } +} + /*-------------------------------------------------- static void DRPC_GotServerIP(UINT32 address) diff --git a/src/discord.h b/src/discord.h index a6bb1134a..131dc05f9 100644 --- a/src/discord.h +++ b/src/discord.h @@ -64,6 +64,13 @@ void DRPC_RemoveRequest(discordRequest_t *removeRequest); void DRPC_Init(void); +/*-------------------------------------------------- + void DRPC_Shutdown(void); + + Shutdown Discord Rich Presence if it was started at all. +--------------------------------------------------*/ +void DRPC_Shutdown(void); + /*-------------------------------------------------- void DRPC_UpdatePresence(void); -- 2.54.0 From 35cfdea9e71209e1987435a6c1284295035232e2 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Mon, 11 Sep 2023 15:55:59 +0200 Subject: [PATCH 26/42] allow opengl to also use widescreen backgrounds for votes thanks kk for locking this to software mode only despite this working without issues in opengl aswell --- src/y_inter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/y_inter.c b/src/y_inter.c index bda60dde2..c20ef30e3 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -1104,7 +1104,7 @@ void Y_VoteDrawer(void) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - if (widebgpatch && rendermode == render_soft && vid.width / vid.dupx > 320) { + if (widebgpatch && vid.width / vid.dupx > 320) { if(foundAnimVoteWideFrames == 0){ V_DrawScaledPatch(((vid.width/2) / vid.dupx) - (SHORT(widebgpatch->width)/2), -- 2.54.0 From f9f33aa53a3b8e72c8cc00c1073678a44d6b08c0 Mon Sep 17 00:00:00 2001 From: lug420 Date: Mon, 11 Sep 2023 18:13:59 +0200 Subject: [PATCH 27/42] add lighttabble shader this was way too much headache set up a basic condition atm, so lighttable generation turns off if the paletteshader is turned off this will break visually if the shader is turned on midrace atm will implement smth better --- src/hardware/hw_defs.h | 3 + src/hardware/hw_drv.h | 6 + src/hardware/hw_main.c | 75 ++++++-- src/hardware/hw_main.h | 2 + src/hardware/r_opengl/r_opengl.c | 297 +++++++++++++++++++++++++++---- src/r_data.c | 10 +- src/r_defs.h | 6 + src/sdl/hwsym_sdl.c | 3 + src/sdl/i_video.c | 3 + 9 files changed, 363 insertions(+), 42 deletions(-) diff --git a/src/hardware/hw_defs.h b/src/hardware/hw_defs.h index 1f6dd0f1c..e4ec10b44 100644 --- a/src/hardware/hw_defs.h +++ b/src/hardware/hw_defs.h @@ -224,6 +224,7 @@ struct FSurfaceInfo RGBA_t PolyColor; RGBA_t TintColor; RGBA_t FadeColor; + UINT32 LightTableId; FLightInfo LightInfo; // jimita 14032019 }; typedef struct FSurfaceInfo FSurfaceInfo; @@ -232,6 +233,8 @@ enum hwdsetspecialstate { HWD_SET_SHADERS, HWD_SET_PALETTE_SHADER_ENABLED, + HWD_SET_SVAR1, + HWD_SET_SVAR2, HWD_SET_TEXTUREFILTERMODE, HWD_SET_TEXTUREANISOTROPICMODE, diff --git a/src/hardware/hw_drv.h b/src/hardware/hw_drv.h index c7786670a..d78ec6667 100644 --- a/src/hardware/hw_drv.h +++ b/src/hardware/hw_drv.h @@ -79,6 +79,9 @@ EXPORT void HWRAPI(InitCustomShaders) (void); EXPORT void HWRAPI(StartBatching) (void); EXPORT void HWRAPI(RenderBatches) (precise_t *sSortTime, precise_t *sDrawTime, int *sNumPolys, int *sNumVerts, int *sNumCalls, int *sNumShaders, int *sNumTextures, int *sNumPolyFlags, int *sNumColors); +EXPORT UINT32 HWRAPI(AddLightTable) (UINT8 *lighttable); +EXPORT void HWRAPI(ClearLightTableCache) (void); + // ========================================================================== // HWR DRIVER OBJECT, FOR CLIENT PROGRAM // ========================================================================== @@ -125,6 +128,9 @@ struct hwdriver_s StartBatching pfnStartBatching; RenderBatches pfnRenderBatches; + + AddLightTable pfnAddLightTable; + ClearLightTableCache pfnClearLightTableCache; }; extern struct hwdriver_s hwdriver; diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 69e801c7e..c9024e472 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -69,6 +69,9 @@ static void CV_screentextures_ONChange(void); static void CV_useCustomShaders_ONChange(void); static void CV_grpaletteshader_OnChange(void); +static void CV_shadervar1_OnChange(void); +static void CV_shadervar2_OnChange(void); + static CV_PossibleValue_t grfiltermode_cons_t[]= {{HWD_SET_TEXTUREFILTER_POINTSAMPLED, "Nearest"}, {HWD_SET_TEXTUREFILTER_BILINEAR, "Bilinear"}, {HWD_SET_TEXTUREFILTER_TRILINEAR, "Trilinear"}, {HWD_SET_TEXTUREFILTER_MIXED1, "Linear_Nearest"}, @@ -90,6 +93,11 @@ consvar_t cv_grsolvetjoin = {"gr_solvetjoin", "On", 0, CV_OnOff, NULL, 0, NULL, consvar_t cv_grbatching = {"gr_batching", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_grpaletteshader = {"gr_paletteshader", "Off", CV_CALL|CV_SAVE, CV_OnOff, CV_grpaletteshader_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_shadervar1 = {"svar1", "1000", CV_CALL, CV_Unsigned, + CV_shadervar1_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_shadervar2 = {"svar2", "1000", CV_CALL, CV_Unsigned, + CV_shadervar2_OnChange, 0, NULL, NULL, 0, 0, NULL}; + static CV_PossibleValue_t grrenderdistance_cons_t[] = { {0, "Max"}, {1, "1024"}, {2, "2048"}, {3, "4096"}, {4, "6144"}, {5, "8192"}, {6, "12288"}, {7, "16384"}, {0, NULL}}; @@ -146,8 +154,22 @@ static void CV_useCustomShaders_ONChange(void) static void CV_grpaletteshader_OnChange(void) { if (rendermode == render_opengl) + { HWD.pfnSetSpecialState(HWD_SET_PALETTE_SHADER_ENABLED, cv_grpaletteshader.value); gr_use_palette_shader = cv_grpaletteshader.value; + } +} + +static void CV_shadervar1_OnChange(void) +{ + if (rendermode == render_opengl) + HWD.pfnSetSpecialState(HWD_SET_SVAR1, cv_shadervar1.value); +} + +static void CV_shadervar2_OnChange(void) +{ + if (rendermode == render_opengl) + HWD.pfnSetSpecialState(HWD_SET_SVAR2, cv_shadervar2.value); } // ========================================================================== @@ -412,6 +434,7 @@ static size_t gr_numportalcullsectors = 0; void HWR_Lighting(FSurfaceInfo *Surface, INT32 light_level, extracolormap_t *colormap) { RGBA_t poly_color, tint_color, fade_color; + boolean default_colormap = false; poly_color.rgba = 0xFFFFFFFF; tint_color.rgba = (colormap != NULL) ? (UINT32)colormap->rgba : GL_DEFAULTMIX; @@ -463,6 +486,36 @@ void HWR_Lighting(FSurfaceInfo *Surface, INT32 light_level, extracolormap_t *col Surface->LightInfo.light_level = light_level; Surface->LightInfo.fade_start = (colormap != NULL) ? colormap->fadestart : 0; Surface->LightInfo.fade_end = (colormap != NULL) ? colormap->fadeend : 31; + + if (!colormap) + { + colormap = &extra_colormaps[num_extra_colormaps]; + default_colormap = true; + } + if (!colormap->gl_lighttable_id) + { + UINT8 *colormap_pointer; + + CONS_Printf("Dbg: creating hwr lt, id %u, color %X, fadecolor %X\n", colormap->gl_lighttable_id, colormap->rgba, colormap->fadergba); + if (default_colormap) + { + CONS_Printf("Dbg: Watch out! it's the sneaky default colormap!\n"); + colormap_pointer = colormaps; + } + else + { + colormap_pointer = colormap->colormap; + } + colormap->gl_lighttable_id = HWD.pfnAddLightTable(colormap_pointer); + } + + Surface->LightTableId = colormap->gl_lighttable_id; +} + +void HWR_ClearLightTableCache() +{ + if (rendermode == render_opengl) + HWD.pfnClearLightTableCache(); } UINT8 HWR_FogBlockAlpha(INT32 light, extracolormap_t *colormap) // Let's see if this can work @@ -735,7 +788,7 @@ void HWR_RenderPlane(extrasubsector_t *xsub, boolean isceiling, fixed_t fixedhei else if (PolyFlags & PF_Ripple) HWD.pfnSetShader(5); // water shader else - HWD.pfnSetShader(1); // floor shader + HWD.pfnSetShader(gr_use_palette_shader ? 9 : 1); // floor shader HWD.pfnDrawPolygon(&Surf, planeVerts, nrPlaneVerts, PolyFlags); } @@ -800,7 +853,7 @@ static void HWR_DrawSegsSplats(FSurfaceInfo * pSurf) break; } - HWD.pfnSetShader(2); // wall shader + HWD.pfnSetShader(gr_use_palette_shader ? 10 : 2); // wall shader HWD.pfnDrawPolygon(&pSurf, wallVerts, 4, i|PF_Modulated|PF_Decal); } } @@ -834,7 +887,7 @@ void HWR_ProjectWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, FBITFIELD blend { HWR_Lighting(pSurf, lightlevel, wallcolormap); - HWD.pfnSetShader(2); // wall shader + HWD.pfnSetShader(gr_use_palette_shader ? 10 : 2); // wall shader // don't draw to color buffer when drawing to stencil if (gl_drawing_stencil) @@ -2968,7 +3021,7 @@ void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling, fixed_t else blendmode |= PF_Masked|PF_Modulated; - HWD.pfnSetShader(1); // floor shader + HWD.pfnSetShader(gr_use_palette_shader ? 9 : 1); // floor shader HWD.pfnDrawPolygon(&Surf, planeVerts, nrPlaneVerts, blendmode); } @@ -3767,7 +3820,7 @@ static void HWR_DrawSpriteShadow(gr_vissprite_t *spr, GLPatch_t *gpatch, float t if (sSurf.PolyColor.s.alpha > floorheight/4) { sSurf.PolyColor.s.alpha = (UINT8)(sSurf.PolyColor.s.alpha - floorheight/4); - HWD.pfnSetShader(1); // floor shader + HWD.pfnSetShader(gr_use_palette_shader ? 9 : 1); // floor shader HWD.pfnDrawPolygon(&sSurf, swallVerts, 4, PF_Translucent|PF_Modulated); } } @@ -4134,7 +4187,7 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) Surf.PolyColor.s.alpha = alpha; - HWD.pfnSetShader(3); // sprite shader + HWD.pfnSetShader(gr_use_palette_shader ? 10 : 3); // sprite shader HWD.pfnDrawPolygon(&Surf, wallVerts, 4, blend|PF_Modulated); top = bot; @@ -4174,7 +4227,7 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) Surf.PolyColor.s.alpha = alpha; - HWD.pfnSetShader(3); // sprite shader + HWD.pfnSetShader(gr_use_palette_shader ? 10 : 3); // sprite shader HWD.pfnDrawPolygon(&Surf, wallVerts, 4, blend|PF_Modulated); } @@ -4327,7 +4380,7 @@ static void HWR_DrawSprite(gr_vissprite_t *spr) blend = PF_Translucent|PF_Occlude; } - HWD.pfnSetShader(3); // sprite shader + HWD.pfnSetShader(gr_use_palette_shader ? 10 : 3); // sprite shader HWD.pfnDrawPolygon(&Surf, wallVerts, 4, blend|PF_Modulated); } } @@ -4421,7 +4474,7 @@ static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr) blend = PF_Translucent|PF_Occlude; } - HWD.pfnSetShader(3); // sprite shader + HWD.pfnSetShader(gr_use_palette_shader ? 10 : 3); // sprite shader HWD.pfnDrawPolygon(&Surf, wallVerts, 4, blend|PF_Modulated); } @@ -5970,6 +6023,8 @@ void HWR_AddCommands(void) CV_RegisterVar(&cv_portalonly); CV_RegisterVar(&cv_secbright); CV_RegisterVar(&cv_grpaletteshader); + CV_RegisterVar(&cv_shadervar1); + CV_RegisterVar(&cv_shadervar2); } // -------------------------------------------------------------------------- @@ -6033,7 +6088,7 @@ void HWR_RenderWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, FBITFIELD blend, pSurf->PolyColor.s.alpha = alpha; // put the alpha back after lighting - HWD.pfnSetShader(2); // wall shader + HWD.pfnSetShader(gr_use_palette_shader ? 10 : 2); // wall shader if (blend & PF_Environment) blendmode |= PF_Occlude; // PF_Occlude must be used for solid objects diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h index 48d37357c..019b921c6 100644 --- a/src/hardware/hw_main.h +++ b/src/hardware/hw_main.h @@ -142,6 +142,8 @@ void HWR_AddLine(seg_t *line); boolean HWR_CheckBBox(fixed_t *bspcoord); void HWR_RenderDrawNodes(void); +void HWR_ClearLightTableCache(void); + // hw_main.c: Sprites void HWR_AddSprites(sector_t *sec); void HWR_ProjectSprite(mobj_t *thing); diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 2b2dc1b1d..e5816c7c7 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -75,9 +75,21 @@ static FBITFIELD CurrentPolyFlags; static FTextureInfo *gr_cachetail = NULL; static FTextureInfo *gr_cachehead = NULL; -static GLuint palette_tex_num = 0; // 1D texture containing the screen palette -static GLuint pal_lookup_tex = 0; // 3D texture containing RGB -> palette index lookup table -RGBA_t myPaletteData[256]; // the palette for converting textures to RGBA + +typedef struct LightTableCacheEntry_s +{ + GLuint id; + struct LightTableCacheEntry_s *next; +} LightTableCacheEntry_t; + +LightTableCacheEntry_t *ltcachehead = NULL; +LightTableCacheEntry_t *ltcachetail = NULL; + +// tweakable vars for shader tweaking and testing +float shadervar1 = 1.0; +float shadervar2 = 1.0; + +RGBA_t myPaletteData[256]; GLint screen_width = 0; // used by Draw2DLine() GLint screen_height = 0; GLbyte screen_depth = 0; @@ -585,12 +597,18 @@ typedef enum gluniform_fade_start, gluniform_fade_end, + // misc. + gluniform_leveltime, + // palette rendering gluniform_palette, gluniform_color_lookup, + gluniform_lighttable_tex, - // misc. - gluniform_leveltime, + // live tweaking + gluniform_svar1, + gluniform_svar2, + gluniform_max, } gluniform_t; @@ -611,6 +629,18 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; // GLSL Software fragment shader // +#define GLSL_DOOM_COLORMAP_floors \ + "float R_DoomColormap(float light, float z)\n" \ + "{\n" \ + "float lightnum = clamp(light / 17.0, 0.0, 15.0);\n" \ + "float lightz = clamp(z / 16.0, 0.0, 127.0);\n" \ + "float startmap = (15.0 - lightnum) * 4.0;\n" \ + "float scale = 160.0 / (lightz + 1.0);\n" \ + "return startmap * 1.06 - scale * 0.5 * 1.15;\n" \ + "}\n" + +// 1.06 and 1.15 were chosen when trying to match software lighting in a test map + #define GLSL_DOOM_COLORMAP \ "float R_DoomColormap(float light, float z)\n" \ "{\n" \ @@ -621,6 +651,49 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "return startmap - scale * 0.5;\n" \ "}\n" +#define GLSL_DOOM_COLORMAP_walls \ + "float R_DoomColormap(float light, float z)\n" \ + "{\n" \ + "float lightnum = clamp(light / 17.0, 0.0, 15.0);\n" \ + "float lightz = clamp(z / 16.0, 0.0, 127.0);\n" \ + "float startmap = (15.0 - lightnum) * 4.0;\n" \ + "float scale = 160.0 / (lightz + 1.0);\n" \ + "return startmap * 1.05 - scale * 1.0 * 1.1;\n" \ + "}\n" + +// 1.05 and 1.1 were chosen when trying to match software lighting in a test map + +#define GLSL_DOOM_COLORMAP_test \ + "float R_DoomColormap(float light, float z)\n" \ + "{\n" \ + "float lightnum = clamp(light / 8.0, 0.0, 31.0);\n" \ + "float scale = 160.0 / z;\n" \ + "float pindex = clamp(scale * 4.0, 0.0, 47.0);\n" \ + "float left = (31.0-lightnum)*2.0;\n" \ + "float right = 160.0 / floor((pindex+1.0) / 512.0);\n" \ + "return left - right;\n" \ + "}\n" + +// this one is adapted from here https://forum.zdoom.org/viewtopic.php?f=4&t=34984 +// and added -0.016 when trying to match it... doesnt really +#define GLSL_DOOM_COLORMAP_test2 \ + "float R_DoomColormap(float light, float z)\n" \ + "{\n" \ + "int L = int((light / 255.0) * 63.0);\n" \ + "int min_L = 36 - L;\n" \ + "if (min_L < 0)\n" \ + "min_L = 0;\n" \ + "else if (min_L > 31)\n" \ + "min_L = 31;\n" \ + "float scale = 1.0 / (gl_FragCoord.z - 0.016);\n" \ + "int index = (59 - L) - int(scale * 192.0 - 192.0);\n" \ + "if (index < min_L)\n" \ + "index = min_L;\n" \ + "else if (index > 31)\n" \ + "index = 31;\n" \ + "return float(index);\n" \ + "}\n" + #define GLSL_DOOM_LIGHT_EQUATION \ "float R_DoomLightingEquation(float light)\n" \ "{\n" \ @@ -648,16 +721,16 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "}\n" \ "final_color = mix(final_color, fade_color, darkness);\n" -#define GLSL_SOFTWARE_FRAGMENT_SHADER \ +#define GLSL_SOFTWARE_UNIFORMS \ "uniform sampler2D tex;\n" \ "uniform vec4 poly_color;\n" \ "uniform vec4 tint_color;\n" \ "uniform vec4 fade_color;\n" \ "uniform float lighting;\n" \ "uniform float fade_start;\n" \ - "uniform float fade_end;\n" \ - GLSL_DOOM_COLORMAP \ - GLSL_DOOM_LIGHT_EQUATION \ + "uniform float fade_end;\n" + +#define GLSL_SOFTWARE_MAIN \ "void main(void) {\n" \ "vec4 texel = texture2D(tex, gl_TexCoord[0].st);\n" \ "vec4 base_color = texel * poly_color;\n" \ @@ -666,7 +739,56 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; GLSL_SOFTWARE_FADE_EQUATION \ "final_color.a = texel.a * poly_color.a;\n" \ "gl_FragColor = final_color;\n" \ - "}\0" + "}\n" + +#define GLSL_SOFTWARE_FRAGMENT_SHADER_FLOORS \ + GLSL_SOFTWARE_UNIFORMS \ + GLSL_DOOM_COLORMAP_floors \ + GLSL_DOOM_LIGHT_EQUATION \ + GLSL_SOFTWARE_MAIN \ + "\0" + +#define GLSL_SOFTWARE_FRAGMENT_SHADER_WALLS \ + GLSL_SOFTWARE_UNIFORMS \ + GLSL_DOOM_COLORMAP_walls \ + GLSL_DOOM_LIGHT_EQUATION \ + GLSL_SOFTWARE_MAIN \ + "\0" + +#define GLSL_SOFTWARE_PAL_UNIFORMS \ + "uniform sampler2D tex;\n" \ + "uniform sampler2D lighttable_tex;\n" \ + "uniform sampler3D lookup_tex;\n" \ + "uniform int palette[768];\n" \ + "uniform vec4 poly_color;\n" \ + "uniform float lighting;\n" \ + "uniform float svar1;\n" \ + "uniform float svar2;\n" + +#define GLSL_SOFTWARE_PAL_MAIN \ + "void main(void) {\n" \ + "vec4 texel = texture2D(tex, gl_TexCoord[0].st);\n" \ + "int tex_pal_idx = int(texture3D(lookup_tex, vec3((texel * 63.0 + 0.5) / 64.0))[0] * 255.0);\n" \ + "float z = gl_FragCoord.z / gl_FragCoord.w;\n" \ + "int light_y = int(clamp(floor(R_DoomColormap(lighting, z)), 0.0, 31.0));\n" \ + "vec2 lighttable_coord = vec2((float(tex_pal_idx) + 0.5) / 256.0, (float(light_y) + 0.5) / 32.0);\n" \ + "int final_idx = int(texture2D(lighttable_tex, lighttable_coord)[0] * 255.0);\n" \ + "vec4 final_color = vec4(float(palette[final_idx*3])/255.0, float(palette[final_idx*3+1])/255.0, float(palette[final_idx*3+2])/255.0, 1.0);\n" \ + "final_color.a = texel.a * poly_color.a;\n" \ + "gl_FragColor = final_color;\n" \ + "}\n" + +#define GLSL_SOFTWARE_PAL_FRAGMENT_SHADER_FLOORS \ + GLSL_SOFTWARE_PAL_UNIFORMS \ + GLSL_DOOM_COLORMAP_floors \ + GLSL_SOFTWARE_PAL_MAIN \ + "\0" + +#define GLSL_SOFTWARE_PAL_FRAGMENT_SHADER_WALLS \ + GLSL_SOFTWARE_PAL_UNIFORMS \ + GLSL_DOOM_COLORMAP_walls \ + GLSL_SOFTWARE_PAL_MAIN \ + "\0" // // Water surface shader @@ -736,13 +858,9 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "uniform sampler2D tex;\n" \ "uniform sampler3D lookup_tex;\n" \ "uniform int palette[768];\n" \ - "uniform float lighting;\n" \ - GLSL_DOOM_COLORMAP \ "void main(void) {\n" \ - "vec4 texel = texture2D(tex, gl_TexCoord[0].st);\n" \ - "int pal_idx = int(texture3D(lookup_tex, vec3((texel * 63.0 + 0.5) / 64.0))[0] * 255.0);\n" \ - "float z = gl_FragCoord.z / gl_FragCoord.w;\n" \ - "float light_y = clamp(floor(R_DoomColormap(lighting, z)), 0.0, 31.0);\n" \ + "vec3 texel = vec3(texture2D(tex, gl_TexCoord[0].st));\n" \ + "int pal_idx = int(texture3D(lookup_tex, vec3((63.0/64.0) * texel + 1.0 / 128.0))[0] * 255.0);\n" \ "gl_FragColor = vec4(float(palette[pal_idx*3])/255.0, float(palette[pal_idx*3+1])/255.0, float(palette[pal_idx*3+2])/255.0, 1.0);\n" \ "}\0" @@ -750,7 +868,7 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "uniform sampler2D tex;\n" \ "uniform int palette[768];\n" \ "void main(void) {\n" \ - "vec3 texel = vec3(texture2D(tex, gl_TexCoord[0].st));\n" \" \ + "vec3 texel = vec3(texture2D(tex, gl_TexCoord[0].st));\n" \ "vec3 best = vec3(200.0);\n" \ "for (int i = 0; i < 256; i++) {\n" \ "vec3 pal_color = vec3(palette[i*3] / 255.0, palette[i*3+1] / 255.0, palette[i*3+2] / 255.0);\n" \ @@ -775,16 +893,16 @@ static const char *fragment_shaders[] = { GLSL_DEFAULT_FRAGMENT_SHADER, // Floor fragment shader - GLSL_SOFTWARE_FRAGMENT_SHADER, + GLSL_SOFTWARE_FRAGMENT_SHADER_FLOORS, // Wall fragment shader - GLSL_SOFTWARE_FRAGMENT_SHADER, + GLSL_SOFTWARE_FRAGMENT_SHADER_WALLS, // Sprite fragment shader - GLSL_SOFTWARE_FRAGMENT_SHADER, + GLSL_SOFTWARE_FRAGMENT_SHADER_WALLS, // Model fragment shader - GLSL_SOFTWARE_FRAGMENT_SHADER, + GLSL_SOFTWARE_FRAGMENT_SHADER_WALLS, // Water fragment shader GLSL_WATER_FRAGMENT_SHADER, @@ -800,6 +918,10 @@ static const char *fragment_shaders[] = { // Palette fragment shader GLSL_PALETTE_FRAGMENT_SHADER, + + GLSL_SOFTWARE_PAL_FRAGMENT_SHADER_FLOORS, + + GLSL_SOFTWARE_PAL_FRAGMENT_SHADER_WALLS, NULL, }; @@ -848,6 +970,10 @@ static const char *vertex_shaders[] = { // Palette vertex shader GLSL_DEFAULT_VERTEX_SHADER, + + GLSL_DEFAULT_VERTEX_SHADER, + + GLSL_DEFAULT_VERTEX_SHADER, NULL, }; @@ -1004,14 +1130,18 @@ EXPORT boolean HWRAPI(LoadShaders) (void) shader->uniforms[gluniform_lighting] = GETUNI("lighting"); shader->uniforms[gluniform_fade_start] = GETUNI("fade_start"); shader->uniforms[gluniform_fade_end] = GETUNI("fade_end"); - - // palette rendering - shader->uniforms[gluniform_palette] = GETUNI("palette"); - shader->uniforms[gluniform_color_lookup] = GETUNI("lookup_tex"); // misc. (custom shaders) shader->uniforms[gluniform_leveltime] = GETUNI("leveltime"); + // palette rendering + shader->uniforms[gluniform_palette] = GETUNI("palette"); + shader->uniforms[gluniform_color_lookup] = GETUNI("lookup_tex"); + shader->uniforms[gluniform_lighttable_tex] = GETUNI("lighttable_tex"); + + shader->uniforms[gluniform_svar1] = GETUNI("svar1"); + shader->uniforms[gluniform_svar2] = GETUNI("svar2"); + #undef GETUNI // set permanent uniform values @@ -1024,6 +1154,10 @@ EXPORT boolean HWRAPI(LoadShaders) (void) // texture unit numbers for the samplers used for palette rendering UNIFORM_1(shader->uniforms[gluniform_palette], 2, pglUniform1i); UNIFORM_1(shader->uniforms[gluniform_color_lookup], 1, pglUniform1i); + UNIFORM_1(shader->uniforms[gluniform_lighttable_tex], 2, pglUniform1i); + + UNIFORM_1(shader->uniforms[gluniform_svar1], shadervar1, pglUniform1f); + UNIFORM_1(shader->uniforms[gluniform_svar2], shadervar2, pglUniform1f); pglUseProgram(0); @@ -1100,6 +1234,7 @@ EXPORT void HWRAPI(KillShaders) (void) // unused......................... } +GLuint palette_tex_num; // length of one side of lookup texture // smallest separation between all the colors in the srb2 palette is 6, so // possibly a 64x64x64 lookup texture might be enough for 100% correct colors @@ -1148,12 +1283,31 @@ void InitPalette(void) pglBindTexture(GL_TEXTURE_3D, palette_tex_num); pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + if (!pglTexImage3D) + I_Error("pglTexImage3D is NULL!"); pglTexImage3D(GL_TEXTURE_3D, 0, GL_R8, LUT_SIZE, LUT_SIZE, LUT_SIZE, 0, GL_RED, GL_UNSIGNED_BYTE, pal_lookup_tex); free(pal_lookup_tex); pglUseProgram(gl_shaderprograms[8].program); pglUniform1i(gl_shaderprograms[8].uniforms[gluniform_color_lookup], 1); // bind sampler to second texture unit + // bind the palette to the fancy shader here + pglUseProgram(gl_shaderprograms[9].program); + pglUniform1iv(gl_shaderprograms[9].uniforms[gluniform_palette], 768, gl_palette); + // bind tex unit 2 to lighttable tex + pglUniform1i(gl_shaderprograms[9].uniforms[gluniform_lighttable_tex], 2); + pglUniform1i(gl_shaderprograms[9].uniforms[gluniform_color_lookup], 1); + // bind the palette to the fancy shader here + pglUseProgram(gl_shaderprograms[10].program); + pglUniform1iv(gl_shaderprograms[10].uniforms[gluniform_palette], 768, gl_palette); + // bind tex unit 2 to lighttable tex + pglUniform1i(gl_shaderprograms[10].uniforms[gluniform_lighttable_tex], 2); + pglUniform1i(gl_shaderprograms[10].uniforms[gluniform_color_lookup], 1); pglUseProgram(0); pglBindTexture(GL_TEXTURE_3D, 0); + + // bind 3d lookup to unit 1, maybe it can stay there + pglActiveTexture(GL_TEXTURE1); + pglBindTexture(GL_TEXTURE_3D, palette_tex_num); + pglActiveTexture(GL_TEXTURE0); gl_palette_initialized = true; } @@ -1336,6 +1490,51 @@ EXPORT void HWRAPI(ClearMipMapCache) (void) Flush(); } +EXPORT UINT32 HWRAPI(AddLightTable) (UINT8 *lighttable) +{ + LightTableCacheEntry_t *cache_entry = malloc(sizeof(LightTableCacheEntry_t)); + if (!ltcachetail) + { + ltcachehead = ltcachetail = cache_entry; + } + else + { + ltcachetail->next = cache_entry; + ltcachetail = cache_entry; + } + ltcachetail->next = NULL; + pglGenTextures(1, <cachetail->id); + if (!ltcachetail->id) + I_Error("hwr lighttable cache entry id is zero"); + pglBindTexture(GL_TEXTURE_2D, ltcachetail->id); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + // should this be a square? (256x256) + // if so, then could change the height. just need to allocate a temp + // 256x256 buffer and copy the lightmap there so there is a full 256x256 + // memory area for opengl to read from. + pglTexImage2D(GL_TEXTURE_2D, 0, GL_R8, 256, 32, 0, GL_RED, GL_UNSIGNED_BYTE, lighttable); + + // restore the tex that was bound before + if (!gl_batching) + pglBindTexture(GL_TEXTURE_2D, tex_downloaded); + + return ltcachetail->id; +} + +EXPORT void HWRAPI(ClearLightTableCache) (void) +{ + while (ltcachehead) + { + pglDeleteTextures(1, <cachehead->id); + LightTableCacheEntry_t *next = ltcachehead->next; + free(ltcachehead); + ltcachehead = next; + } + ltcachetail = NULL; + + CONS_Printf("Debug: cleared hwr light tables\n"); +} // -----------------+ // ReadRect : Read a rectangle region of the truecolor framebuffer @@ -2016,6 +2215,9 @@ static int comparePolygons(const void *p1, const void *p2) diff = poly1->texNum - poly2->texNum; if (diff != 0) return diff; + + diff = poly1->surf.LightTableId - poly2->surf.LightTableId; + if (diff != 0) return diff; diff = poly1->polyFlags - poly2->polyFlags; if (diff != 0) return diff; @@ -2148,7 +2350,15 @@ EXPORT void HWRAPI(RenderBatches) (precise_t *sSortTime, precise_t *sDrawTime, i firstFade.alpha = byte2float[currentSurfaceInfo.FadeColor.s.alpha]; if (gl_allowshaders) + { load_shaders(¤tSurfaceInfo, &firstPoly, &firstTint, &firstFade); + if (gl_use_palette_shader) + { + pglActiveTexture(GL_TEXTURE2);// this stuff could be done better but gonna do it quick like this for now + pglBindTexture(GL_TEXTURE_2D, currentSurfaceInfo.LightTableId); + pglActiveTexture(GL_TEXTURE0); + } + } if (currentPolyFlags & PF_NoTexture) currentTexture = 0; @@ -2266,7 +2476,8 @@ EXPORT void HWRAPI(RenderBatches) (precise_t *sSortTime, precise_t *sDrawTime, i currentSurfaceInfo.FadeColor.rgba != nextSurfaceInfo.FadeColor.rgba || currentSurfaceInfo.LightInfo.light_level != nextSurfaceInfo.LightInfo.light_level || currentSurfaceInfo.LightInfo.fade_start != nextSurfaceInfo.LightInfo.fade_start || - currentSurfaceInfo.LightInfo.fade_end != nextSurfaceInfo.LightInfo.fade_end) + currentSurfaceInfo.LightInfo.fade_end != nextSurfaceInfo.LightInfo.fade_end || + currentSurfaceInfo.LightTableId != nextSurfaceInfo.LightTableId) { changeState = true; changeSurfaceInfo = true; @@ -2389,7 +2600,15 @@ EXPORT void HWRAPI(RenderBatches) (precise_t *sSortTime, precise_t *sDrawTime, i fade.alpha = byte2float[nextSurfaceInfo.FadeColor.s.alpha]; load_shaders(&nextSurfaceInfo, &poly, &tint, &fade); + + if (gl_use_palette_shader) + { + pglActiveTexture(GL_TEXTURE2);// this stuff could be done better but gonna do it quick like this for now + pglBindTexture(GL_TEXTURE_2D, nextSurfaceInfo.LightTableId); + pglActiveTexture(GL_TEXTURE0); + } } + currentSurfaceInfo = nextSurfaceInfo; changeSurfaceInfo = false; @@ -2488,6 +2707,14 @@ EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUI fade.green = byte2float[pSurf->FadeColor.s.green]; fade.blue = byte2float[pSurf->FadeColor.s.blue]; fade.alpha = byte2float[pSurf->FadeColor.s.alpha]; + + // inefficient. load the colormap texture + if (gl_use_palette_shader || gl_allowshaders) + { + pglActiveTexture(GL_TEXTURE2); + pglBindTexture(GL_TEXTURE_2D, pSurf->LightTableId); + pglActiveTexture(GL_TEXTURE0); + } } load_shaders(pSurf, &poly, &tint, &fade); @@ -2834,6 +3061,14 @@ EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value) case HWD_SET_PALETTE_SHADER_ENABLED: gl_use_palette_shader = Value; break; + + case HWD_SET_SVAR1: + shadervar1 = (float)Value / 1000.0f; + break; + + case HWD_SET_SVAR2: + shadervar2 = (float)Value / 1000.0f; + break; case HWD_SET_TEXTUREFILTERMODE: switch (Value) @@ -3903,13 +4138,13 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) ClearBuffer(true, false, false, &clearColour); pglBindTexture(GL_TEXTURE_2D, finalScreenTexture); - if (gl_use_palette_shader) + /*if (gl_use_palette_shader) { pglUseProgram(gl_shaderprograms[8].program); // palette shader - pglUniform1iv(gl_shaderprograms[8].uniforms[gluniform_palette], 768, gl_palette); + pglUniform1iv(gl_shaderprograms[8].uniforms[gluniform_palette], 768, gl_palette); pglActiveTexture(GL_TEXTURE1); pglBindTexture(GL_TEXTURE_3D, palette_tex_num); - } + }*/ pglColor4ubv(white); pglTexCoordPointer(2, GL_FLOAT, 0, fix); @@ -3919,12 +4154,12 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) tex_downloaded = finalScreenTexture; - if (gl_use_palette_shader) + /*if (gl_use_palette_shader) { pglUseProgram(0); pglBindTexture(GL_TEXTURE_3D, 0); pglActiveTexture(GL_TEXTURE0); - } + }*/ } #endif //HWRENDER diff --git a/src/r_data.c b/src/r_data.c index f982b0366..a352a48a7 100644 --- a/src/r_data.c +++ b/src/r_data.c @@ -26,6 +26,10 @@ #include "v_video.h" // pLocalPalette #include "dehacked.h" +#ifdef HWRENDER +#include "hardware/hw_main.h" +#endif + #if defined (_WIN32) || defined (_WIN32_WCE) #include // alloca(sizeof) #endif @@ -1137,6 +1141,10 @@ void R_ClearColormaps(void) foundcolormaps[i] = LUMPERROR; memset(extra_colormaps, 0, sizeof (extra_colormaps)); + +#ifdef HWRENDER + HWR_ClearLightTableCache(); +#endif } /*INT32 R_ColormapNumForName(char *name) @@ -1317,7 +1325,7 @@ INT32 R_CreateColormap(char *p1, char *p2, char *p3) extra_colormaps[mapnum].fadeend = (UINT16)fadeend; extra_colormaps[mapnum].fog = fog; - if (rendermode == render_soft) + if (rendermode == render_soft || cv_grpaletteshader.value == 1) { double r, g, b, cbrightness; int p; diff --git a/src/r_defs.h b/src/r_defs.h index 559e3646b..7254a6289 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -62,6 +62,12 @@ typedef struct INT32 fadergba; // The colour the colourmaps fade to lighttable_t *colormap; + + +#ifdef HWRENDER + // The id of the hardware lighttable. Zero means it does not exist yet. + UINT32 gl_lighttable_id; +#endif } extracolormap_t; // diff --git a/src/sdl/hwsym_sdl.c b/src/sdl/hwsym_sdl.c index 2627c3fdb..dcaaa7f51 100644 --- a/src/sdl/hwsym_sdl.c +++ b/src/sdl/hwsym_sdl.c @@ -113,6 +113,9 @@ void *hwSym(const char *funcName,void *handle) GETFUNC(StartBatching); GETFUNC(RenderBatches); + + GETFUNC(AddLightTable); + GETFUNC(ClearLightTableCache); #else //HWRENDER if (0 == strcmp("FinishUpdate", funcName)) diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 3fd96819c..2966cb391 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -2141,6 +2141,9 @@ void I_StartupGraphics(void) HWD.pfnStartBatching = hwSym("StartBatching",NULL); HWD.pfnRenderBatches = hwSym("RenderBatches",NULL); + + HWD.pfnAddLightTable = hwSym("AddLightTable",NULL); + HWD.pfnClearLightTableCache = hwSym("ClearLightTableCache",NULL); if (!HWD.pfnInit()) // load the OpenGL library rendermode = render_soft; -- 2.54.0 From 2553c9e87898af5d0fe55c5f99cbef91cbd5db0d Mon Sep 17 00:00:00 2001 From: lug420 Date: Mon, 11 Sep 2023 18:30:35 +0200 Subject: [PATCH 28/42] cleanup a bit remove debug prints and vars clean stuff up a bit --- src/hardware/hw_defs.h | 2 - src/hardware/hw_main.c | 24 --------- src/hardware/r_opengl/r_opengl.c | 87 +++----------------------------- 3 files changed, 6 insertions(+), 107 deletions(-) diff --git a/src/hardware/hw_defs.h b/src/hardware/hw_defs.h index e4ec10b44..6002fcf18 100644 --- a/src/hardware/hw_defs.h +++ b/src/hardware/hw_defs.h @@ -233,8 +233,6 @@ enum hwdsetspecialstate { HWD_SET_SHADERS, HWD_SET_PALETTE_SHADER_ENABLED, - HWD_SET_SVAR1, - HWD_SET_SVAR2, HWD_SET_TEXTUREFILTERMODE, HWD_SET_TEXTUREANISOTROPICMODE, diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index c9024e472..173f423bf 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -69,9 +69,6 @@ static void CV_screentextures_ONChange(void); static void CV_useCustomShaders_ONChange(void); static void CV_grpaletteshader_OnChange(void); -static void CV_shadervar1_OnChange(void); -static void CV_shadervar2_OnChange(void); - static CV_PossibleValue_t grfiltermode_cons_t[]= {{HWD_SET_TEXTUREFILTER_POINTSAMPLED, "Nearest"}, {HWD_SET_TEXTUREFILTER_BILINEAR, "Bilinear"}, {HWD_SET_TEXTUREFILTER_TRILINEAR, "Trilinear"}, {HWD_SET_TEXTUREFILTER_MIXED1, "Linear_Nearest"}, @@ -93,11 +90,6 @@ consvar_t cv_grsolvetjoin = {"gr_solvetjoin", "On", 0, CV_OnOff, NULL, 0, NULL, consvar_t cv_grbatching = {"gr_batching", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_grpaletteshader = {"gr_paletteshader", "Off", CV_CALL|CV_SAVE, CV_OnOff, CV_grpaletteshader_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_shadervar1 = {"svar1", "1000", CV_CALL, CV_Unsigned, - CV_shadervar1_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_shadervar2 = {"svar2", "1000", CV_CALL, CV_Unsigned, - CV_shadervar2_OnChange, 0, NULL, NULL, 0, 0, NULL}; - static CV_PossibleValue_t grrenderdistance_cons_t[] = { {0, "Max"}, {1, "1024"}, {2, "2048"}, {3, "4096"}, {4, "6144"}, {5, "8192"}, {6, "12288"}, {7, "16384"}, {0, NULL}}; @@ -160,18 +152,6 @@ static void CV_grpaletteshader_OnChange(void) } } -static void CV_shadervar1_OnChange(void) -{ - if (rendermode == render_opengl) - HWD.pfnSetSpecialState(HWD_SET_SVAR1, cv_shadervar1.value); -} - -static void CV_shadervar2_OnChange(void) -{ - if (rendermode == render_opengl) - HWD.pfnSetSpecialState(HWD_SET_SVAR2, cv_shadervar2.value); -} - // ========================================================================== // Globals // ========================================================================== @@ -496,10 +476,8 @@ void HWR_Lighting(FSurfaceInfo *Surface, INT32 light_level, extracolormap_t *col { UINT8 *colormap_pointer; - CONS_Printf("Dbg: creating hwr lt, id %u, color %X, fadecolor %X\n", colormap->gl_lighttable_id, colormap->rgba, colormap->fadergba); if (default_colormap) { - CONS_Printf("Dbg: Watch out! it's the sneaky default colormap!\n"); colormap_pointer = colormaps; } else @@ -6023,8 +6001,6 @@ void HWR_AddCommands(void) CV_RegisterVar(&cv_portalonly); CV_RegisterVar(&cv_secbright); CV_RegisterVar(&cv_grpaletteshader); - CV_RegisterVar(&cv_shadervar1); - CV_RegisterVar(&cv_shadervar2); } // -------------------------------------------------------------------------- diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index e5816c7c7..27ca423a6 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -85,10 +85,6 @@ typedef struct LightTableCacheEntry_s LightTableCacheEntry_t *ltcachehead = NULL; LightTableCacheEntry_t *ltcachetail = NULL; -// tweakable vars for shader tweaking and testing -float shadervar1 = 1.0; -float shadervar2 = 1.0; - RGBA_t myPaletteData[256]; GLint screen_width = 0; // used by Draw2DLine() GLint screen_height = 0; @@ -596,20 +592,15 @@ typedef enum gluniform_lighting, gluniform_fade_start, gluniform_fade_end, - - // misc. - gluniform_leveltime, // palette rendering gluniform_palette, gluniform_color_lookup, gluniform_lighttable_tex, - // live tweaking - gluniform_svar1, - gluniform_svar2, - - + // misc. + gluniform_leveltime, + gluniform_max, } gluniform_t; @@ -661,39 +652,6 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "return startmap * 1.05 - scale * 1.0 * 1.1;\n" \ "}\n" -// 1.05 and 1.1 were chosen when trying to match software lighting in a test map - -#define GLSL_DOOM_COLORMAP_test \ - "float R_DoomColormap(float light, float z)\n" \ - "{\n" \ - "float lightnum = clamp(light / 8.0, 0.0, 31.0);\n" \ - "float scale = 160.0 / z;\n" \ - "float pindex = clamp(scale * 4.0, 0.0, 47.0);\n" \ - "float left = (31.0-lightnum)*2.0;\n" \ - "float right = 160.0 / floor((pindex+1.0) / 512.0);\n" \ - "return left - right;\n" \ - "}\n" - -// this one is adapted from here https://forum.zdoom.org/viewtopic.php?f=4&t=34984 -// and added -0.016 when trying to match it... doesnt really -#define GLSL_DOOM_COLORMAP_test2 \ - "float R_DoomColormap(float light, float z)\n" \ - "{\n" \ - "int L = int((light / 255.0) * 63.0);\n" \ - "int min_L = 36 - L;\n" \ - "if (min_L < 0)\n" \ - "min_L = 0;\n" \ - "else if (min_L > 31)\n" \ - "min_L = 31;\n" \ - "float scale = 1.0 / (gl_FragCoord.z - 0.016);\n" \ - "int index = (59 - L) - int(scale * 192.0 - 192.0);\n" \ - "if (index < min_L)\n" \ - "index = min_L;\n" \ - "else if (index > 31)\n" \ - "index = 31;\n" \ - "return float(index);\n" \ - "}\n" - #define GLSL_DOOM_LIGHT_EQUATION \ "float R_DoomLightingEquation(float light)\n" \ "{\n" \ @@ -762,8 +720,6 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "uniform int palette[768];\n" \ "uniform vec4 poly_color;\n" \ "uniform float lighting;\n" \ - "uniform float svar1;\n" \ - "uniform float svar2;\n" #define GLSL_SOFTWARE_PAL_MAIN \ "void main(void) {\n" \ @@ -849,11 +805,9 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "}\0" // -// Palette color quantization shader test. +// Palette color quantization shader // -// Could test putting this to GLSL_SOFTWARE_FRAGMENT_SHADER and seeing what happens to performance. - #define GLSL_PALETTE_FRAGMENT_SHADER \ "uniform sampler2D tex;\n" \ "uniform sampler3D lookup_tex;\n" \ @@ -864,19 +818,6 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; "gl_FragColor = vec4(float(palette[pal_idx*3])/255.0, float(palette[pal_idx*3+1])/255.0, float(palette[pal_idx*3+2])/255.0, 1.0);\n" \ "}\0" -#define GLSL_PALETTE_FRAGMENT_SHADER_OLD \ - "uniform sampler2D tex;\n" \ - "uniform int palette[768];\n" \ - "void main(void) {\n" \ - "vec3 texel = vec3(texture2D(tex, gl_TexCoord[0].st));\n" \ - "vec3 best = vec3(200.0);\n" \ - "for (int i = 0; i < 256; i++) {\n" \ - "vec3 pal_color = vec3(palette[i*3] / 255.0, palette[i*3+1] / 255.0, palette[i*3+2] / 255.0);\n" \ - "best = mix(pal_color, best, step(length(best-texel), length(pal_color-texel)));\n" \ - "}\n" \ - "gl_FragColor = vec4(best[0], best[1], best[2] ,1.0);\n" \ - "}\0" - // // GLSL generic fragment shader // @@ -1131,16 +1072,13 @@ EXPORT boolean HWRAPI(LoadShaders) (void) shader->uniforms[gluniform_fade_start] = GETUNI("fade_start"); shader->uniforms[gluniform_fade_end] = GETUNI("fade_end"); - // misc. (custom shaders) - shader->uniforms[gluniform_leveltime] = GETUNI("leveltime"); - // palette rendering shader->uniforms[gluniform_palette] = GETUNI("palette"); shader->uniforms[gluniform_color_lookup] = GETUNI("lookup_tex"); shader->uniforms[gluniform_lighttable_tex] = GETUNI("lighttable_tex"); - shader->uniforms[gluniform_svar1] = GETUNI("svar1"); - shader->uniforms[gluniform_svar2] = GETUNI("svar2"); + // misc. (custom shaders) + shader->uniforms[gluniform_leveltime] = GETUNI("leveltime"); #undef GETUNI @@ -1156,9 +1094,6 @@ EXPORT boolean HWRAPI(LoadShaders) (void) UNIFORM_1(shader->uniforms[gluniform_color_lookup], 1, pglUniform1i); UNIFORM_1(shader->uniforms[gluniform_lighttable_tex], 2, pglUniform1i); - UNIFORM_1(shader->uniforms[gluniform_svar1], shadervar1, pglUniform1f); - UNIFORM_1(shader->uniforms[gluniform_svar2], shadervar2, pglUniform1f); - pglUseProgram(0); #undef UNIFORM_1 @@ -1532,8 +1467,6 @@ EXPORT void HWRAPI(ClearLightTableCache) (void) ltcachehead = next; } ltcachetail = NULL; - - CONS_Printf("Debug: cleared hwr light tables\n"); } // -----------------+ @@ -3061,14 +2994,6 @@ EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value) case HWD_SET_PALETTE_SHADER_ENABLED: gl_use_palette_shader = Value; break; - - case HWD_SET_SVAR1: - shadervar1 = (float)Value / 1000.0f; - break; - - case HWD_SET_SVAR2: - shadervar2 = (float)Value / 1000.0f; - break; case HWD_SET_TEXTUREFILTERMODE: switch (Value) -- 2.54.0 From ec4140a9d29eaf1bb3c6328eb5c7ba52d5fbe42d Mon Sep 17 00:00:00 2001 From: lug420 Date: Mon, 11 Sep 2023 20:00:09 +0200 Subject: [PATCH 29/42] remove custom shader toggle + clear colormaps when toggle palette shader the custom shader toggle often broke stuff when toggled while palette shader was active also clearing colormaps when toggling palette shader is ugly midlevel but atleast it doesent visually break completely def need to somehow reinitialze colormaps instead or smth --- src/hardware/hw_main.c | 13 ++++++++----- src/hardware/hw_main.h | 2 +- src/m_menu.c | 4 ++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 173f423bf..1433087eb 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -30,6 +30,7 @@ #include "../r_fps.h" #include "../r_state.h" #include "../r_local.h" +#include "../r_data.h" #include "../r_patch.h" // a mystery as to what this is for #include "../r_bsp.h" // R_NoEncore #include "../r_main.h" // cv_fov @@ -66,7 +67,7 @@ int gr_use_palette_shader = 0; static void CV_filtermode_ONChange(void); static void CV_anisotropic_ONChange(void); static void CV_screentextures_ONChange(void); -static void CV_useCustomShaders_ONChange(void); +//static void CV_useCustomShaders_ONChange(void); static void CV_grpaletteshader_OnChange(void); static CV_PossibleValue_t grfiltermode_cons_t[]= {{HWD_SET_TEXTUREFILTER_POINTSAMPLED, "Nearest"}, @@ -88,7 +89,6 @@ consvar_t cv_grcorrecttricks = {"gr_correcttricks", "Off", 0, CV_OnOff, NULL, 0, consvar_t cv_grsolvetjoin = {"gr_solvetjoin", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_grbatching = {"gr_batching", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_grpaletteshader = {"gr_paletteshader", "Off", CV_CALL|CV_SAVE, CV_OnOff, CV_grpaletteshader_OnChange, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t grrenderdistance_cons_t[] = { {0, "Max"}, {1, "1024"}, {2, "2048"}, {3, "4096"}, {4, "6144"}, {5, "8192"}, @@ -120,7 +120,9 @@ static INT32 current_bsp_culling_distance = 0; consvar_t cv_grscreentextures = {"gr_screentextures", "On", CV_CALL, CV_OnOff, CV_screentextures_ONChange, 0, NULL, NULL, 0, 0, NULL}; - consvar_t cv_grusecustomshaders = {"gr_usecustomshaders", "Yes", CV_CALL|CV_SAVE, CV_OnOff, CV_useCustomShaders_ONChange, 0, NULL, NULL, 0, 0, NULL}; +//consvar_t cv_grusecustomshaders = {"gr_usecustomshaders", "Yes", CV_CALL|CV_SAVE, CV_OnOff, CV_useCustomShaders_ONChange, 0, NULL, NULL, 0, 0, NULL}; // rip in peace sweet prince + +consvar_t cv_grpaletteshader = {"gr_paletteshader", "Off", CV_CALL|CV_SAVE, CV_OnOff, CV_grpaletteshader_OnChange, 0, NULL, NULL, 0, 0, NULL}; static void CV_filtermode_ONChange(void) { @@ -137,11 +139,11 @@ static void CV_screentextures_ONChange(void) HWD.pfnSetSpecialState(HWD_SET_SCREEN_TEXTURES, cv_grscreentextures.value); } -static void CV_useCustomShaders_ONChange(void) +/*static void CV_useCustomShaders_ONChange(void) { if (rendermode == render_opengl) HWD.pfnInitCustomShaders(); -} +}*/ static void CV_grpaletteshader_OnChange(void) { @@ -149,6 +151,7 @@ static void CV_grpaletteshader_OnChange(void) { HWD.pfnSetSpecialState(HWD_SET_PALETTE_SHADER_ENABLED, cv_grpaletteshader.value); gr_use_palette_shader = cv_grpaletteshader.value; + R_ClearColormaps(); } } diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h index 019b921c6..37027da82 100644 --- a/src/hardware/hw_main.h +++ b/src/hardware/hw_main.h @@ -180,7 +180,7 @@ extern consvar_t cv_grfakecontrast; extern consvar_t cv_grfallbackplayermodel; extern consvar_t cv_grbatching; extern consvar_t cv_grrenderdistance; -extern consvar_t cv_grusecustomshaders; +//extern consvar_t cv_grusecustomshaders; extern consvar_t cv_grpaletteshader; extern consvar_t cv_grportals; extern consvar_t cv_nostencil; diff --git a/src/m_menu.c b/src/m_menu.c index 980a4c694..fa4210c00 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1347,7 +1347,8 @@ static menuitem_t OP_OpenGLOptionsMenu[] = {IT_STRING | IT_CVAR, NULL, "3D Models", &cv_grmdls, 5}, {IT_STRING | IT_CVAR, NULL, "Fallback Player 3D Model", &cv_grfallbackplayermodel, 15}, {IT_STRING|IT_CVAR, NULL, "Shaders", &cv_grshaders, 25}, - {IT_STRING|IT_CVAR, NULL, "Use custom Shaders", &cv_grusecustomshaders, 35}, + //{IT_STRING|IT_CVAR, NULL, "Use custom Shaders", &cv_grusecustomshaders, 35}, // rip in peace sweet prince + {IT_STRING|IT_CVAR, NULL, "Palette Rendering", &cv_grpaletteshader, 35}, {IT_STRING | IT_CVAR, NULL, "Min Shader Brightness", &cv_secbright, 45}, {IT_STRING|IT_CVAR, NULL, "Texture Quality", &cv_scr_depth, 65}, @@ -1407,7 +1408,6 @@ static menuitem_t OP_SoundOptionsMenu[] = {IT_STRING|IT_SUBMENU, NULL, "Advanced Settings...", &OP_SoundAdvancedDef, 155} }; - static menuitem_t OP_SoundAdvancedMenu[] = { #ifdef HAVE_OPENMPT -- 2.54.0 From bac058d128c8ec2b2e0086272893b8362aab4859 Mon Sep 17 00:00:00 2001 From: lug420 Date: Mon, 11 Sep 2023 20:07:03 +0200 Subject: [PATCH 30/42] forgor some things --- src/hardware/r_opengl/r_opengl.c | 10 +++++----- src/m_menu.c | 2 +- src/r_main.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 27ca423a6..71b66c22b 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -32,8 +32,8 @@ #include "../../p_tick.h" // for leveltime (NOTE: THIS IS BAD, FIGURE OUT HOW TO PROPERLY IMPLEMENT gl_leveltime) #include "../../i_system.h" // for I_GetPreciseTime (batching time measurements) -// Eeeeh not sure is this right way, but it works -extern consvar_t cv_grusecustomshaders; +// Eeeeh not sure is this right way, but it works < sry :c +//extern consvar_t cv_grusecustomshaders; extern fixed_t fovtan; // also extremely bad, I'm just too lazy!!! @@ -982,12 +982,12 @@ EXPORT boolean HWRAPI(LoadShaders) (void) gl_shaderprogram_t *shader; const GLchar* vert_shader = vertex_shaders[i]; const GLchar* frag_shader = fragment_shaders[i]; - boolean custom = cv_grusecustomshaders.value && ((gl_customvertexshaders[i] || gl_customfragmentshaders[i]) && (i > 0)); + boolean custom = ((gl_customvertexshaders[i] || gl_customfragmentshaders[i]) && (i > 0)); // 18032019 - if (cv_grusecustomshaders.value && gl_customvertexshaders[i]) + if (gl_customvertexshaders[i]) vert_shader = gl_customvertexshaders[i]; - if (cv_grusecustomshaders.value && gl_customfragmentshaders[i]) + if (gl_customfragmentshaders[i]) frag_shader = gl_customfragmentshaders[i]; if (i >= MAXSHADERS) diff --git a/src/m_menu.c b/src/m_menu.c index fa4210c00..acaf7cb99 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1347,7 +1347,7 @@ static menuitem_t OP_OpenGLOptionsMenu[] = {IT_STRING | IT_CVAR, NULL, "3D Models", &cv_grmdls, 5}, {IT_STRING | IT_CVAR, NULL, "Fallback Player 3D Model", &cv_grfallbackplayermodel, 15}, {IT_STRING|IT_CVAR, NULL, "Shaders", &cv_grshaders, 25}, - //{IT_STRING|IT_CVAR, NULL, "Use custom Shaders", &cv_grusecustomshaders, 35}, // rip in peace sweet prince + //{IT_STRING|IT_CVAR, NULL, "Use custom Shaders", &cv_grusecustomshaders, 35}, {IT_STRING|IT_CVAR, NULL, "Palette Rendering", &cv_grpaletteshader, 35}, {IT_STRING | IT_CVAR, NULL, "Min Shader Brightness", &cv_secbright, 45}, diff --git a/src/r_main.c b/src/r_main.c index dc914e79a..f3b46668f 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1954,7 +1954,7 @@ void R_RegisterEngineStuff(void) CV_RegisterVar(&cv_grfakecontrast); CV_RegisterVar(&cv_grshearing); CV_RegisterVar(&cv_grshaders); - CV_RegisterVar(&cv_grusecustomshaders); + CV_RegisterVar(&cv_grpaletteshader); #endif #ifdef HWRENDER -- 2.54.0 From 075148443907304fb5e035f9cb71342f65ae7f74 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Tue, 12 Sep 2023 00:38:50 +0200 Subject: [PATCH 31/42] fix some effects idk lmao but this fixes a few effects to be "on par" with software renderer aswell as menus and hud stuff --- src/hardware/r_opengl/r_opengl.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index d8aa3a8c5..8c496f163 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -4078,13 +4078,12 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) ClearBuffer(true, false, false, &clearColour); pglBindTexture(GL_TEXTURE_2D, finalScreenTexture); - /*if (gl_use_palette_shader) + if (gl_use_palette_shader) { pglUseProgram(gl_shaderprograms[8].program); // palette shader pglUniform1iv(gl_shaderprograms[8].uniforms[gluniform_palette], 768, gl_palette); pglActiveTexture(GL_TEXTURE1); - pglBindTexture(GL_TEXTURE_3D, palette_tex_num); - }*/ + } pglColor4ubv(white); pglTexCoordPointer(2, GL_FLOAT, 0, fix); @@ -4094,12 +4093,11 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) tex_downloaded = finalScreenTexture; - /*if (gl_use_palette_shader) + if (gl_use_palette_shader) { pglUseProgram(0); - pglBindTexture(GL_TEXTURE_3D, 0); pglActiveTexture(GL_TEXTURE0); - }*/ + } } #endif //HWRENDER -- 2.54.0 From 5bf722a1fbf8fa3475b136efb606a20ad06fdb31 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Tue, 12 Sep 2023 01:50:46 +0200 Subject: [PATCH 32/42] only allow this thing when shaders are enabled aswell yes i will do it like that no i wont use gl_allowshaders i want this thing to be able to affect the menus and hud, just like software :p --- src/hardware/r_opengl/r_opengl.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 8c496f163..e18c142b4 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -32,6 +32,8 @@ #include "../../p_tick.h" // for leveltime (NOTE: THIS IS BAD, FIGURE OUT HOW TO PROPERLY IMPLEMENT gl_leveltime) #include "../../i_system.h" // for I_GetPreciseTime (batching time measurements) +#include "../hw_main.h" + // Eeeeh not sure is this right way, but it works < sry :c //extern consvar_t cv_grusecustomshaders; @@ -4078,7 +4080,7 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) ClearBuffer(true, false, false, &clearColour); pglBindTexture(GL_TEXTURE_2D, finalScreenTexture); - if (gl_use_palette_shader) + if (gl_use_palette_shader && cv_grshaders.value) { pglUseProgram(gl_shaderprograms[8].program); // palette shader pglUniform1iv(gl_shaderprograms[8].uniforms[gluniform_palette], 768, gl_palette); @@ -4093,7 +4095,7 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) tex_downloaded = finalScreenTexture; - if (gl_use_palette_shader) + if (gl_use_palette_shader && cv_grshaders.value) { pglUseProgram(0); pglActiveTexture(GL_TEXTURE0); -- 2.54.0 From e2acb4c3fc4fec5ec75041b466d35019f41c9e3d Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Tue, 12 Sep 2023 17:07:19 +0200 Subject: [PATCH 33/42] only do this when were running the palette shader --- src/hardware/hw_main.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 69af58a99..25395bda7 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -470,27 +470,30 @@ void HWR_Lighting(FSurfaceInfo *Surface, INT32 light_level, extracolormap_t *col Surface->LightInfo.fade_start = (colormap != NULL) ? colormap->fadestart : 0; Surface->LightInfo.fade_end = (colormap != NULL) ? colormap->fadeend : 31; - if (!colormap) + if (gr_use_palette_shader) { - colormap = &extra_colormaps[num_extra_colormaps]; - default_colormap = true; - } - if (!colormap->gl_lighttable_id) + if (!colormap) { - UINT8 *colormap_pointer; - - if (default_colormap) - { - colormap_pointer = colormaps; + colormap = &extra_colormaps[num_extra_colormaps]; + default_colormap = true; } - else - { - colormap_pointer = colormap->colormap; - } - colormap->gl_lighttable_id = HWD.pfnAddLightTable(colormap_pointer); - } + if (!colormap->gl_lighttable_id) + { + UINT8 *colormap_pointer; - Surface->LightTableId = colormap->gl_lighttable_id; + if (default_colormap) + { + colormap_pointer = colormaps; + } + else + { + colormap_pointer = colormap->colormap; + } + colormap->gl_lighttable_id = HWD.pfnAddLightTable(colormap_pointer); + } + + Surface->LightTableId = colormap->gl_lighttable_id; + } } void HWR_ClearLightTableCache() @@ -6118,7 +6121,6 @@ void HWR_Startup(void) } } - // -------------------------------------------------------------------------- // Free resources allocated by the hardware renderer // -------------------------------------------------------------------------- -- 2.54.0 From f83a937dc55ec9bc5c06604d86fe4168ba31e96c Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Tue, 12 Sep 2023 18:56:51 +0200 Subject: [PATCH 34/42] redo parts of the lighttable shader this caused performance drops before even with the whole thing disabled --- src/hardware/r_opengl/r_opengl.c | 73 +++++++++++++++++--------------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index e18c142b4..575290953 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -49,12 +49,21 @@ struct GLRGBAFloat GLfloat alpha; }; typedef struct GLRGBAFloat GLRGBAFloat; -static const GLubyte white[4] = { 255, 255, 255, 255 }; + +// lighttable list item +struct LTListItem +{ + UINT32 id; + struct LTListItem *next; +}; +typedef struct LTListItem LTListItem; // ========================================================================== // CONSTANTS // ========================================================================== +static const GLubyte white[4] = { 255, 255, 255, 255 }; + // With OpenGL 1.1+, the first texture should be 1 #define NOTEXTURE_NUM 0 @@ -72,20 +81,15 @@ static float NEAR_CLIPPING_PLANE = NZCLIP_PLANE; static GLuint tex_downloaded = 0; +static GLuint lt_downloaded = 0; // currently bound lighttable texture static GLfloat fov = 90.0f; static FBITFIELD CurrentPolyFlags; static FTextureInfo *gr_cachetail = NULL; static FTextureInfo *gr_cachehead = NULL; -typedef struct LightTableCacheEntry_s -{ - GLuint id; - struct LightTableCacheEntry_s *next; -} LightTableCacheEntry_t; - -LightTableCacheEntry_t *ltcachehead = NULL; -LightTableCacheEntry_t *ltcachetail = NULL; +static LTListItem *LightTablesTail = NULL; +static LTListItem *LightTablesHead = NULL; RGBA_t myPaletteData[256]; GLint screen_width = 0; // used by Draw2DLine() @@ -1427,48 +1431,47 @@ EXPORT void HWRAPI(ClearMipMapCache) (void) Flush(); } + EXPORT UINT32 HWRAPI(AddLightTable) (UINT8 *lighttable) { - LightTableCacheEntry_t *cache_entry = malloc(sizeof(LightTableCacheEntry_t)); - if (!ltcachetail) + LTListItem *item = malloc(sizeof(LTListItem)); + if (!LightTablesTail) { - ltcachehead = ltcachetail = cache_entry; + LightTablesHead = LightTablesTail = item; } else { - ltcachetail->next = cache_entry; - ltcachetail = cache_entry; + LightTablesTail->next = item; + LightTablesTail = item; } - ltcachetail->next = NULL; - pglGenTextures(1, <cachetail->id); - if (!ltcachetail->id) - I_Error("hwr lighttable cache entry id is zero"); - pglBindTexture(GL_TEXTURE_2D, ltcachetail->id); + item->next = NULL; + pglGenTextures(1, &item->id); + pglBindTexture(GL_TEXTURE_2D, item->id); pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - // should this be a square? (256x256) - // if so, then could change the height. just need to allocate a temp - // 256x256 buffer and copy the lightmap there so there is a full 256x256 - // memory area for opengl to read from. pglTexImage2D(GL_TEXTURE_2D, 0, GL_R8, 256, 32, 0, GL_RED, GL_UNSIGNED_BYTE, lighttable); - // restore the tex that was bound before - if (!gl_batching) - pglBindTexture(GL_TEXTURE_2D, tex_downloaded); + // restore previously bound texture + pglBindTexture(GL_TEXTURE_2D, tex_downloaded); - return ltcachetail->id; + return item->id; } +// Delete light table textures, ids given before become invalid and must not be used. EXPORT void HWRAPI(ClearLightTableCache) (void) { - while (ltcachehead) + while (LightTablesHead) { - pglDeleteTextures(1, <cachehead->id); - LightTableCacheEntry_t *next = ltcachehead->next; - free(ltcachehead); - ltcachehead = next; + LTListItem *item = LightTablesHead; + pglDeleteTextures(1, (GLuint *)&item->id); + LightTablesHead = item->next; + free(item); } - ltcachetail = NULL; + + LightTablesTail = NULL; + + // we no longer have a bound light table (if we had one), we just deleted it! + lt_downloaded = 0; } // -----------------+ @@ -2658,12 +2661,12 @@ EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUI fade.blue = byte2float[pSurf->FadeColor.s.blue]; fade.alpha = byte2float[pSurf->FadeColor.s.alpha]; - // inefficient. load the colormap texture - if (gl_use_palette_shader || gl_allowshaders) + if (pSurf->LightTableId && pSurf->LightTableId != lt_downloaded) { pglActiveTexture(GL_TEXTURE2); pglBindTexture(GL_TEXTURE_2D, pSurf->LightTableId); pglActiveTexture(GL_TEXTURE0); + lt_downloaded = pSurf->LightTableId; } } -- 2.54.0 From b4d48cc9ec8a73790574b50b6557d05eece0902d Mon Sep 17 00:00:00 2001 From: Indev Date: Tue, 12 Sep 2023 21:55:35 +0300 Subject: [PATCH 35/42] Set palette uniform in InitPalette instead of DrawScreenFinalTexture --- src/hardware/r_opengl/r_opengl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 575290953..62d2caa75 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -1230,6 +1230,7 @@ void InitPalette(void) free(pal_lookup_tex); pglUseProgram(gl_shaderprograms[8].program); pglUniform1i(gl_shaderprograms[8].uniforms[gluniform_color_lookup], 1); // bind sampler to second texture unit + pglUniform1iv(gl_shaderprograms[8].uniforms[gluniform_palette], 768, gl_palette); // bind the palette to the fancy shader here pglUseProgram(gl_shaderprograms[9].program); pglUniform1iv(gl_shaderprograms[9].uniforms[gluniform_palette], 768, gl_palette); @@ -4086,7 +4087,6 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) if (gl_use_palette_shader && cv_grshaders.value) { pglUseProgram(gl_shaderprograms[8].program); // palette shader - pglUniform1iv(gl_shaderprograms[8].uniforms[gluniform_palette], 768, gl_palette); pglActiveTexture(GL_TEXTURE1); } -- 2.54.0 From 538de7d2d2b439331949320a31a99bc8ca37b041 Mon Sep 17 00:00:00 2001 From: lug420 Date: Wed, 13 Sep 2023 04:42:35 +0200 Subject: [PATCH 36/42] fix memfree command on 64bit --- src/android/i_system.c | 2 +- src/dummy/i_system.c | 2 +- src/i_system.h | 2 +- src/sdl/i_system.c | 13 ++++++------- src/z_zone.c | 10 +++++----- 5 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/android/i_system.c b/src/android/i_system.c index 51a96d93a..c0b49a886 100644 --- a/src/android/i_system.c +++ b/src/android/i_system.c @@ -24,7 +24,7 @@ static INT64 start_time; // as microseconds since the epoch // I should probably return how much memory is remaining // for this process, considering Android's process memory limit. -UINT32 I_GetFreeMem(UINT32 *total) +size_t I_GetFreeMem(size_t *total) { // what the heck? sysinfo() is partially missing in bionic? /* struct sysinfo si; */ diff --git a/src/dummy/i_system.c b/src/dummy/i_system.c index 1696672b8..cf8144b90 100644 --- a/src/dummy/i_system.c +++ b/src/dummy/i_system.c @@ -5,7 +5,7 @@ UINT8 graphics_started = 0; UINT8 keyboard_started = 0; -UINT32 I_GetFreeMem(UINT32 *total) +size_t I_GetFreeMem(size_t *total) { *total = 0; return 0; diff --git a/src/i_system.h b/src/i_system.h index 89ea1ae2d..05826c79e 100644 --- a/src/i_system.h +++ b/src/i_system.h @@ -40,7 +40,7 @@ extern UINT8 keyboard_started; \return free memory in the system */ -UINT32 I_GetFreeMem(UINT32 *total); +size_t I_GetFreeMem(size_t *total); /** \brief Returns precise time value for performance measurement. The precise time should be a monotonically increasing counter, and will wrap. diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 5b76edddf..d1add12b4 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -3806,8 +3806,7 @@ static long get_entry(const char* name, const char* buf) } #endif -// quick fix for compil -UINT32 I_GetFreeMem(UINT32 *total) +size_t I_GetFreeMem(size_t *total) { #ifdef FREEBSD struct vmmeter sum; @@ -3855,8 +3854,8 @@ UINT32 I_GetFreeMem(UINT32 *total) info.dwLength = sizeof (MEMORYSTATUS); GlobalMemoryStatus( &info ); if (total) - *total = (UINT32)info.dwTotalPhys; - return (UINT32)info.dwAvailPhys; + *total = (size_t)info.dwTotalPhys; + return (size_t)info.dwAvailPhys; #elif defined (__OS2__) UINT32 pr_arena; @@ -3871,8 +3870,8 @@ UINT32 I_GetFreeMem(UINT32 *total) /* Linux */ char buf[1024]; char *memTag; - UINT32 freeKBytes; - UINT32 totalKBytes; + size_t freeKBytes; + size_t totalKBytes; INT32 n; INT32 meminfo_fd = -1; long Cached; @@ -3903,7 +3902,7 @@ UINT32 I_GetFreeMem(UINT32 *total) } memTag += sizeof (MEMTOTAL); - totalKBytes = atoi(memTag); + totalKBytes = (size_t)atoi(memTag); if ((memTag = strstr(buf, MEMAVAILABLE)) == NULL) { diff --git a/src/z_zone.c b/src/z_zone.c index 199eefd08..1eb9ba42e 100644 --- a/src/z_zone.c +++ b/src/z_zone.c @@ -140,14 +140,14 @@ static void Command_Memdump_f(void); void Z_Init(void) { - UINT32 total, memfree; + size_t total, memfree; memset(&head, 0x00, sizeof(head)); head.next = head.prev = &head; memfree = I_GetFreeMem(&total)>>20; - CONS_Printf("System memory: %uMB - Free: %uMB\n", total>>20, memfree); + CONS_Printf("System memory: %sMB - Free: %sMB\n", sizeu1(total>>20), sizeu2(memfree)); // Note: This allocates memory. Watch out. COM_AddCommand("memfree", Command_Memfree_f); @@ -616,7 +616,7 @@ size_t Z_TagUsage(INT32 tagnum) void Command_Memfree_f(void) { - UINT32 freebytes, totalbytes; + size_t freebytes, totalbytes; Z_CheckHeap(-1); CONS_Printf("\x82%s", M_GetText("Memory Info\n")); @@ -644,8 +644,8 @@ void Command_Memfree_f(void) CONS_Printf("\x82%s", M_GetText("System Memory Info\n")); freebytes = I_GetFreeMem(&totalbytes); - CONS_Printf(M_GetText(" Total physical memory: %7u KB\n"), totalbytes>>10); - CONS_Printf(M_GetText("Available physical memory: %7u KB\n"), freebytes>>10); + CONS_Printf(M_GetText(" Total physical memory: %s KB\n"), sizeu1(totalbytes>>10)); + CONS_Printf(M_GetText("Available physical memory: %s KB\n"), sizeu1(freebytes>>10)); } #ifdef ZDEBUG -- 2.54.0 From 3204095afbe603957a6dd005615e337c5cce2d81 Mon Sep 17 00:00:00 2001 From: lug420 Date: Wed, 13 Sep 2023 16:09:58 +0200 Subject: [PATCH 37/42] revert "redo parts of the lighttable shader" die --- src/hardware/r_opengl/r_opengl.c | 64 +++++++++++++++----------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 62d2caa75..69341f12a 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -50,19 +50,13 @@ struct GLRGBAFloat }; typedef struct GLRGBAFloat GLRGBAFloat; -// lighttable list item -struct LTListItem -{ - UINT32 id; - struct LTListItem *next; -}; -typedef struct LTListItem LTListItem; +static const GLubyte white[4] = { 255, 255, 255, 255 }; // ========================================================================== // CONSTANTS // ========================================================================== -static const GLubyte white[4] = { 255, 255, 255, 255 }; + // With OpenGL 1.1+, the first texture should be 1 #define NOTEXTURE_NUM 0 @@ -81,15 +75,20 @@ static float NEAR_CLIPPING_PLANE = NZCLIP_PLANE; static GLuint tex_downloaded = 0; -static GLuint lt_downloaded = 0; // currently bound lighttable texture static GLfloat fov = 90.0f; static FBITFIELD CurrentPolyFlags; static FTextureInfo *gr_cachetail = NULL; static FTextureInfo *gr_cachehead = NULL; -static LTListItem *LightTablesTail = NULL; -static LTListItem *LightTablesHead = NULL; +typedef struct LightTableCacheEntry_s +{ + GLuint id; + struct LightTableCacheEntry_s *next; +} LightTableCacheEntry_t; + +LightTableCacheEntry_t *ltcachehead = NULL; +LightTableCacheEntry_t *ltcachetail = NULL; RGBA_t myPaletteData[256]; GLint screen_width = 0; // used by Draw2DLine() @@ -1432,47 +1431,45 @@ EXPORT void HWRAPI(ClearMipMapCache) (void) Flush(); } - EXPORT UINT32 HWRAPI(AddLightTable) (UINT8 *lighttable) { - LTListItem *item = malloc(sizeof(LTListItem)); - if (!LightTablesTail) + LightTableCacheEntry_t *cache_entry = malloc(sizeof(LightTableCacheEntry_t)); + if (!ltcachetail) { - LightTablesHead = LightTablesTail = item; + ltcachehead = ltcachetail = cache_entry; } else { - LightTablesTail->next = item; - LightTablesTail = item; + ltcachetail->next = cache_entry; + ltcachetail = cache_entry; } - item->next = NULL; - pglGenTextures(1, &item->id); - pglBindTexture(GL_TEXTURE_2D, item->id); + ltcachetail->next = NULL; + pglGenTextures(1, <cachetail->id); + if (!ltcachetail->id) + I_Error("hwr lighttable cache entry id is zero"); + pglBindTexture(GL_TEXTURE_2D, ltcachetail->id); pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); pglTexImage2D(GL_TEXTURE_2D, 0, GL_R8, 256, 32, 0, GL_RED, GL_UNSIGNED_BYTE, lighttable); // restore previously bound texture - pglBindTexture(GL_TEXTURE_2D, tex_downloaded); + if (!gl_batching) + pglBindTexture(GL_TEXTURE_2D, tex_downloaded); - return item->id; + return ltcachetail->id; } // Delete light table textures, ids given before become invalid and must not be used. EXPORT void HWRAPI(ClearLightTableCache) (void) { - while (LightTablesHead) + while (ltcachehead) { - LTListItem *item = LightTablesHead; - pglDeleteTextures(1, (GLuint *)&item->id); - LightTablesHead = item->next; - free(item); + pglDeleteTextures(1, <cachehead->id); + LightTableCacheEntry_t *next = ltcachehead->next; + free(ltcachehead); + ltcachehead = next; } - - LightTablesTail = NULL; - - // we no longer have a bound light table (if we had one), we just deleted it! - lt_downloaded = 0; + ltcachetail = NULL; } // -----------------+ @@ -2662,12 +2659,11 @@ EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUI fade.blue = byte2float[pSurf->FadeColor.s.blue]; fade.alpha = byte2float[pSurf->FadeColor.s.alpha]; - if (pSurf->LightTableId && pSurf->LightTableId != lt_downloaded) + if (gl_use_palette_shader && gl_allowshaders) { pglActiveTexture(GL_TEXTURE2); pglBindTexture(GL_TEXTURE_2D, pSurf->LightTableId); pglActiveTexture(GL_TEXTURE0); - lt_downloaded = pSurf->LightTableId; } } -- 2.54.0 From 9044a46b31ba9ad407f9aaa92034a407ef4039d9 Mon Sep 17 00:00:00 2001 From: lug420 Date: Wed, 13 Sep 2023 21:32:35 +0200 Subject: [PATCH 38/42] fix fullscreen toggle and resolution changes --- src/v_video.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/v_video.c b/src/v_video.c index 77295c41b..86f193106 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -225,8 +225,12 @@ void V_SetPalette(INT32 palettenum) LoadMapPalette(); #ifdef HWRENDER - if (rendermode != render_soft && rendermode != render_none) + if (rendermode != render_soft && rendermode != render_none) { + // reset our palette lookups n shit + gl_palette_initialized = false; + InitPalette(); HWR_SetPalette(&pLocalPalette[palettenum*256]); + } #if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL) else #endif -- 2.54.0 From 13fd825bcf57d1bce3e3af5b1a72365e4b45f8a9 Mon Sep 17 00:00:00 2001 From: alufolie91 Date: Thu, 14 Sep 2023 03:43:11 +0200 Subject: [PATCH 39/42] hackiest shit to make custom shaders not kill palette shader this is so super dumb its unreal but it works --- src/hardware/hw_main.c | 9 +++++---- src/hardware/hw_main.h | 2 +- src/hardware/r_opengl/r_opengl.c | 21 +++++++++++++++------ src/r_main.c | 1 + 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 25395bda7..c98a7f47a 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -67,7 +67,7 @@ int gr_use_palette_shader = 0; static void CV_filtermode_ONChange(void); static void CV_anisotropic_ONChange(void); static void CV_screentextures_ONChange(void); -//static void CV_useCustomShaders_ONChange(void); +static void CV_useCustomShaders_ONChange(void); static void CV_grpaletteshader_OnChange(void); static CV_PossibleValue_t grfiltermode_cons_t[]= {{HWD_SET_TEXTUREFILTER_POINTSAMPLED, "Nearest"}, @@ -120,7 +120,7 @@ static INT32 current_bsp_culling_distance = 0; consvar_t cv_grscreentextures = {"gr_screentextures", "On", CV_CALL, CV_OnOff, CV_screentextures_ONChange, 0, NULL, NULL, 0, 0, NULL}; -//consvar_t cv_grusecustomshaders = {"gr_usecustomshaders", "Yes", CV_CALL|CV_SAVE, CV_OnOff, CV_useCustomShaders_ONChange, 0, NULL, NULL, 0, 0, NULL}; // rip in peace sweet prince +consvar_t cv_grusecustomshaders = {"gr_usecustomshaders", "Yes", CV_CALL|CV_SAVE, CV_OnOff, CV_useCustomShaders_ONChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_grpaletteshader = {"gr_paletteshader", "Off", CV_CALL|CV_SAVE, CV_OnOff, CV_grpaletteshader_OnChange, 0, NULL, NULL, 0, 0, NULL}; @@ -139,11 +139,11 @@ static void CV_screentextures_ONChange(void) HWD.pfnSetSpecialState(HWD_SET_SCREEN_TEXTURES, cv_grscreentextures.value); } -/*static void CV_useCustomShaders_ONChange(void) +static void CV_useCustomShaders_ONChange(void) { if (rendermode == render_opengl) HWD.pfnInitCustomShaders(); -}*/ +} static void CV_grpaletteshader_OnChange(void) { @@ -152,6 +152,7 @@ static void CV_grpaletteshader_OnChange(void) HWD.pfnSetSpecialState(HWD_SET_PALETTE_SHADER_ENABLED, cv_grpaletteshader.value); gr_use_palette_shader = cv_grpaletteshader.value; R_ClearColormaps(); + InitPalette(); } } diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h index 37027da82..019b921c6 100644 --- a/src/hardware/hw_main.h +++ b/src/hardware/hw_main.h @@ -180,7 +180,7 @@ extern consvar_t cv_grfakecontrast; extern consvar_t cv_grfallbackplayermodel; extern consvar_t cv_grbatching; extern consvar_t cv_grrenderdistance; -//extern consvar_t cv_grusecustomshaders; +extern consvar_t cv_grusecustomshaders; extern consvar_t cv_grpaletteshader; extern consvar_t cv_grportals; extern consvar_t cv_nostencil; diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 69341f12a..0c4a619aa 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -35,7 +35,7 @@ #include "../hw_main.h" // Eeeeh not sure is this right way, but it works < sry :c -//extern consvar_t cv_grusecustomshaders; +extern consvar_t cv_grusecustomshaders; extern fixed_t fovtan; // also extremely bad, I'm just too lazy!!! @@ -987,13 +987,14 @@ EXPORT boolean HWRAPI(LoadShaders) (void) gl_shaderprogram_t *shader; const GLchar* vert_shader = vertex_shaders[i]; const GLchar* frag_shader = fragment_shaders[i]; - boolean custom = ((gl_customvertexshaders[i] || gl_customfragmentshaders[i]) && (i > 0)); - + boolean custom = cv_grusecustomshaders.value && ((gl_customvertexshaders[i] || gl_customfragmentshaders[i]) && (i > 0)); + // 18032019 - if (gl_customvertexshaders[i]) + if (cv_grusecustomshaders.value && gl_customvertexshaders[i]) vert_shader = gl_customvertexshaders[i]; - if (gl_customfragmentshaders[i]) + if (cv_grusecustomshaders.value && gl_customfragmentshaders[i]) frag_shader = gl_customfragmentshaders[i]; + if (i >= MAXSHADERS) break; @@ -1114,7 +1115,9 @@ EXPORT boolean HWRAPI(LoadShaders) (void) EXPORT void HWRAPI(LoadCustomShader) (int number, char *shader, size_t size, boolean fragment) { #ifdef GL_SHADERS - if (!pglUseProgram) return; + if (!pglUseProgram) + return; + if (number < 1 || number > MAXSHADERS) I_Error("LoadCustomShader(): cannot load shader %d (max %d)", number, MAXSHADERS); @@ -1136,8 +1139,14 @@ EXPORT void HWRAPI(LoadCustomShader) (int number, char *shader, size_t size, boo EXPORT void HWRAPI(InitCustomShaders) (void) { #ifdef GL_SHADERS + KillShaders(); LoadShaders(); + +if (gl_use_palette_shader) + { + InitPalette(); + } #endif } diff --git a/src/r_main.c b/src/r_main.c index f3b46668f..512a2b65c 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1954,6 +1954,7 @@ void R_RegisterEngineStuff(void) CV_RegisterVar(&cv_grfakecontrast); CV_RegisterVar(&cv_grshearing); CV_RegisterVar(&cv_grshaders); + CV_RegisterVar(&cv_grusecustomshaders); CV_RegisterVar(&cv_grpaletteshader); #endif -- 2.54.0 From fe74e69da6aea63316288941234f860c15b4cd3a Mon Sep 17 00:00:00 2001 From: lug420 Date: Thu, 14 Sep 2023 18:42:35 +0200 Subject: [PATCH 40/42] dont need this --- src/hardware/hw_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 6e66795da..9a3a2a3dc 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -992,7 +992,7 @@ void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, FSurfa INT32 solid, i; lightlist_t * list = sector->lightlist; const UINT8 alpha = Surf->PolyColor.s.alpha; - FUINT lightnum = sector->lightlevel;//HWR_CalcWallLight(sector->lightlevel, v1x, v1y, v2x, v2y); + FUINT lightnum = HWR_CalcWallLight(sector->lightlevel, v1x, v1y, v2x, v2y); extracolormap_t *colormap = NULL; realtop = top = wallVerts[3].y; -- 2.54.0 From 8c7f35fa29d0ca35f3494c57858f1dab398a3b1c Mon Sep 17 00:00:00 2001 From: lug420 Date: Thu, 14 Sep 2023 19:17:46 +0200 Subject: [PATCH 41/42] absolute hell lighttable sorting was on even with the palette shader disabled, but, we dont need that shit for non palette renderer mode hope this shit doesent break anything ever pls --- src/hardware/r_opengl/r_opengl.c | 18 +++++++++++++++++- src/v_video.c | 7 +++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 0c4a619aa..49b9726dc 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -2169,8 +2169,11 @@ static int comparePolygons(const void *p1, const void *p2) diff = poly1->texNum - poly2->texNum; if (diff != 0) return diff; + if (gl_use_palette_shader) + { diff = poly1->surf.LightTableId - poly2->surf.LightTableId; if (diff != 0) return diff; + } diff = poly1->polyFlags - poly2->polyFlags; if (diff != 0) return diff; @@ -2428,7 +2431,7 @@ EXPORT void HWRAPI(RenderBatches) (precise_t *sSortTime, precise_t *sDrawTime, i changeState = true; changePolyFlags = true; } - if (gl_allowshaders) + if ((gl_allowshaders) && (gl_use_palette_shader)) { if (currentSurfaceInfo.PolyColor.rgba != nextSurfaceInfo.PolyColor.rgba || currentSurfaceInfo.TintColor.rgba != nextSurfaceInfo.TintColor.rgba || @@ -2442,6 +2445,19 @@ EXPORT void HWRAPI(RenderBatches) (precise_t *sSortTime, precise_t *sDrawTime, i changeSurfaceInfo = true; } } + else if ((gl_allowshaders) && (!gl_use_palette_shader)) + { + if (currentSurfaceInfo.PolyColor.rgba != nextSurfaceInfo.PolyColor.rgba || + currentSurfaceInfo.TintColor.rgba != nextSurfaceInfo.TintColor.rgba || + currentSurfaceInfo.FadeColor.rgba != nextSurfaceInfo.FadeColor.rgba || + currentSurfaceInfo.LightInfo.light_level != nextSurfaceInfo.LightInfo.light_level || + currentSurfaceInfo.LightInfo.fade_start != nextSurfaceInfo.LightInfo.fade_start || + currentSurfaceInfo.LightInfo.fade_end != nextSurfaceInfo.LightInfo.fade_end) + { + changeState = true; + changeSurfaceInfo = true; + } + } else { if (currentSurfaceInfo.PolyColor.rgba != nextSurfaceInfo.PolyColor.rgba) diff --git a/src/v_video.c b/src/v_video.c index 86f193106..3be8fcf80 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -226,9 +226,11 @@ void V_SetPalette(INT32 palettenum) #ifdef HWRENDER if (rendermode != render_soft && rendermode != render_none) { + + if (cv_grpaletteshader.value == 1){ // reset our palette lookups n shit gl_palette_initialized = false; - InitPalette(); + InitPalette();} HWR_SetPalette(&pLocalPalette[palettenum*256]); } #if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL) @@ -244,9 +246,10 @@ void V_SetPaletteLump(const char *pal) LoadPalette(pal); #ifdef HWRENDER if (rendermode != render_soft && rendermode != render_none) { + if (cv_grpaletteshader.value == 1){ // reset our palette lookups n shit gl_palette_initialized = false; - InitPalette(); + InitPalette();} HWR_SetPalette(pLocalPalette); } #if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL) -- 2.54.0 From f70f7152ab338b1e020d14b5fc2f80537b17b798 Mon Sep 17 00:00:00 2001 From: lug420 Date: Thu, 14 Sep 2023 20:24:36 +0200 Subject: [PATCH 42/42] let the thing do its thing fixes switching of paletterenderer thing --- src/hardware/hw_main.c | 2 +- src/r_data.c | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 9a3a2a3dc..e534e4e09 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -151,7 +151,7 @@ static void CV_grpaletteshader_OnChange(void) { HWD.pfnSetSpecialState(HWD_SET_PALETTE_SHADER_ENABLED, cv_grpaletteshader.value); gr_use_palette_shader = cv_grpaletteshader.value; - R_ClearColormaps(); + //R_ClearColormaps(); InitPalette(); } } diff --git a/src/r_data.c b/src/r_data.c index a352a48a7..40be149b1 100644 --- a/src/r_data.c +++ b/src/r_data.c @@ -1325,12 +1325,11 @@ INT32 R_CreateColormap(char *p1, char *p2, char *p3) extra_colormaps[mapnum].fadeend = (UINT16)fadeend; extra_colormaps[mapnum].fog = fog; - if (rendermode == render_soft || cv_grpaletteshader.value == 1) - { + double r, g, b, cbrightness; int p; lighttable_t *colormap_p; - + // Initialise the map and delta arrays // map[i] stores an RGB color (as double) for index i, // which is then converted to SRB2's palette later @@ -1409,8 +1408,7 @@ INT32 R_CreateColormap(char *p1, char *p2, char *p3) colormap_p2 += 256; } } - } - + return (INT32)mapnum; } -- 2.54.0