Screentextures toggle port from saturn

This commit is contained in:
NepDisk 2026-05-02 11:58:19 -04:00
parent b622ed1333
commit ee3402e72a
10 changed files with 87 additions and 6 deletions

View file

@ -339,13 +339,12 @@ boolean D_RenderLevel(void)
if (r_splitscreen == 2) // Draw over the fourth screen so you don't have to stare at a HOM :V
{
// V_DrawPatchFill, but for the fourth screen only
patch_t *pat = static_cast<patch_t*>(W_CachePatchName("SRB2BACK", PU_CACHE));
INT32 x, y, pw = SHORT(pat->width) * vid.dup, ph = SHORT(pat->height) * vid.dup;
for (x = vid.width>>1; x < vid.width; x += pw)
{
for (y = vid.height>>1; y < vid.height; y += ph)
V_DrawScaledPatch(x, y, V_NOSCALESTART, pat);
V_DrawScaledPatch(x, y, V_NOSCALESTART, srb2back);
}
}
}

View file

@ -316,6 +316,7 @@ enum hwdsetspecialstate
HWD_SET_SHADERS,
HWD_SET_TEXTUREFILTERMODE,
HWD_SET_TEXTUREANISOTROPICMODE,
HWD_SET_SCREEN_TEXTURES,
HWD_NUMSTATE
};
typedef enum hwdsetspecialstate hwdspecialstate_t;

View file

@ -877,6 +877,7 @@ static CV_PossibleValue_t glshearing_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "Thi
static void CV_glfiltermode_OnChange(void);
static void CV_glanisotropic_OnChange(void);
static void CV_screentextures_OnChange(void);
static CV_PossibleValue_t glfiltermode_cons_t[]= {{HWD_SET_TEXTUREFILTER_POINTSAMPLED, "Nearest"},
{HWD_SET_TEXTUREFILTER_BILINEAR, "Bilinear"}, {HWD_SET_TEXTUREFILTER_TRILINEAR, "Trilinear"},
@ -892,6 +893,15 @@ consvar_t cv_glallowshaders = CVAR_INIT ("gr_allowclientshaders", "On", CV_NETVA
consvar_t cv_fovchange = CVAR_INIT ("gr_fovchange", "Off", CV_SAVE, CV_OnOff, NULL);
consvar_t cv_glsecbright = CVAR_INIT("gr_secbright", "0", CV_SAVE, glsecbright_cons_t, NULL);
// The current screen texture implementation is inefficient and disabling it can result in significant
// performance gains on lower end hardware. The game is still quite playable without this functionality.
// Features that break when disabling this:
// - water and heat wave effects
// - intermission background
// - full screen scaling (use native resolution or windowed mode to avoid this)
static CV_PossibleValue_t glscreentextures_cons_t[] = {{0, "Off"}, {1, "Wipes Only"}, {2, "All"}, {0, NULL}};
consvar_t cv_glscreentextures = CVAR_INIT("gr_screentextures", "All", CV_CALL|CV_SAVE, glscreentextures_cons_t, CV_screentextures_OnChange);
consvar_t cv_glmodels = CVAR_INIT ("gr_models", "Off", CV_SAVE, CV_OnOff, NULL);
#ifdef BAD_MODEL_OPTIONS
@ -940,6 +950,17 @@ consvar_t cv_glskydebug = CVAR_INIT ("gr_skydebug", "0", 0, CV_Unsigned, NULL);
#define ONLY_IF_GL_LOADED if (vid.glstate != VID_GL_LIBRARY_LOADED) return;
static void CV_screentextures_OnChange(void)
{
ONLY_IF_GL_LOADED
if (cv_glscreentextures.value != 2)
{
if (cv_glpaletterendering.value != 0)
CV_SetValue(&cv_glpaletterendering, 0);
}
GL_SetSpecialState(HWD_SET_SCREEN_TEXTURES, cv_glscreentextures.value);
}
static void CV_glfiltermode_OnChange(void)
{
ONLY_IF_GL_LOADED
@ -964,10 +985,15 @@ void CV_glmodellighting_OnChange(void)
void CV_glpaletterendering_OnChange(void)
{
ONLY_IF_GL_LOADED
if (cv_glpaletterendering.value != 0 && cv_glscreentextures.value != 2) // can't do palette rendering without screen textures
CV_SetValue(&cv_glpaletterendering, 0);
if (gl_shadersavailable)
{
HWR_CompileShaders();
HWR_TogglePaletteRendering();
HWR_PrecacheLevel();
}
}
@ -1051,6 +1077,8 @@ void HWR_AddCommands(void)
CV_RegisterVar(&cv_gldebugportal);
CV_RegisterVar(&cv_glskydebug);
CV_RegisterVar(&cv_glscreentextures);
}
void HWR_AddSessionCommands(void)
@ -1081,6 +1109,14 @@ void HWR_Startup(void)
gl_shadersavailable = HWR_InitShaders();
HWR_SetShaderState();
HWR_TogglePaletteRendering();
if (cv_glscreentextures.value != 2)
{
if (cv_glpaletterendering.value != 0)
CV_SetValue(&cv_glpaletterendering, 0);
}
GL_SetSpecialState(HWD_SET_SCREEN_TEXTURES, cv_glscreentextures.value);
}
gl_init = true;
@ -1180,6 +1216,9 @@ void HWR_DoPostProcessor(player_t *player)
GL_DrawPolygon(&Surf, v, 4, PF_Modulated|PF_Additive|PF_NoTexture|PF_NoDepthTest);
}
if (cv_glscreentextures.value != 2) // screen textures are needed for the rest of the effects
return;
// Capture the screen for intermission and screen waving
if (gamestate != GS_INTERMISSION)
GL_MakeScreenTexture(HWD_SCREENTEXTURE_GENERIC1);
@ -1290,6 +1329,12 @@ static boolean HWR_WipeCheck(UINT8 wipenum, UINT8 scrnnum)
void HWR_DoWipe(UINT8 wipenum, UINT8 scrnnum)
{
if (cv_glscreentextures.value == 0)
{
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); // just draw a black screen instead of flashing and crap
return;
}
if (!HWR_WipeCheck(wipenum, scrnnum))
return;

View file

@ -86,7 +86,7 @@ boolean HWR_ShouldUsePaletteRendering(void);
extern CV_PossibleValue_t glanisotropicmode_cons_t[];
extern consvar_t cv_glshaders, cv_glallowshaders;
extern consvar_t cv_glmodels;
extern consvar_t cv_glmodels, cv_glscreentextures;
// SRB2Kart: We don't like these options.
// Interpolation should be up to who animated the model.

View file

@ -2034,7 +2034,7 @@ static void loading_status(void)
x = BASEVIDWIDTH/2;
y = BASEVIDHEIGHT/2;
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, levelfadecol); // Black background to match fade in effect
//V_DrawPatchFill(W_CachePatchName("SRB2BACK",PU_CACHE)); // SRB2 background, ehhh too bright.
//V_DrawPatchFill(srb2back); // SRB2 background, ehhh too bright.
M_DrawTextBox(x-58, y-8, 13, 1);
V_DrawString(x-50, y, V_YELLOWMAP, "Loading...");
V_DrawRightAlignedString(x+50, y, V_YELLOWMAP, s);

View file

@ -628,6 +628,9 @@ static PFNglUniform3fv pglUniform3fv;
static PFNglGetUniformLocation pglGetUniformLocation;
// 13062019
static INT32 gl_enable_screen_textures = 2;
typedef enum
{
// textures
@ -2411,6 +2414,10 @@ void GL_SetSpecialState(hwdspecialstate_t IdState, INT32 Value)
Flush(); //??? if we want to change filter mode by texture, remove this
break;
case HWD_SET_SCREEN_TEXTURES:
gl_enable_screen_textures = Value;
break;
default:
break;
}
@ -3043,6 +3050,9 @@ void GL_PostImgRedraw(float points[SCREENVERTS][SCREENVERTS][2])
float float_x, float_y, float_nextx, float_nexty;
float xfix, yfix;
if (gl_enable_screen_textures != 2)
return;
const float blackBack[16] =
{
-16.0f, -16.0f, 6.0f,
@ -3135,6 +3145,9 @@ void GL_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags)
{
float xfix, yfix;
if (gl_enable_screen_textures != 2)
return;
const float screenVerts[12] =
{
-1.0f, -1.0f, 1.0f,
@ -3183,6 +3196,9 @@ void GL_DoScreenWipe(int wipeStart, int wipeEnd)
INT32 fademaskdownloaded = tex_downloaded; // the fade mask that has been set
if (!gl_enable_screen_textures)
return;
const float screenVerts[12] =
{
-1.0f, -1.0f, 1.0f,
@ -3260,6 +3276,9 @@ void GL_MakeScreenTexture(int tex)
{
boolean firstTime = (screenTextures[tex] == 0);
if (!gl_enable_screen_textures)
return;
// Create screen texture
if (firstTime)
pglGenTextures(1, &screenTextures[tex]);
@ -3285,6 +3304,9 @@ void GL_RenderVhsEffect(fixed_t upbary, fixed_t downbary, UINT8 updistort, UINT8
float fix[8];
float i;
if (gl_enable_screen_textures != 2)
return;
GLubyte color[4] = {255, 255, 255, 255};
float screenVerts[12] =
@ -3402,6 +3424,9 @@ void GL_DrawScreenFinalTexture(int tex, int width, int height)
float off[12];
float fix[8];
if (gl_enable_screen_textures != 2)
return;
xfix = 1/((float)(texsize)/((float)((screen_width))));
yfix = 1/((float)(texsize)/((float)((screen_height))));

View file

@ -82,6 +82,8 @@ patch_t *pinglocal[2]; // mindelay indecator
patch_t *framecounter;
patch_t *frameslash; // framerate stuff. Used in screen.c
patch_t *srb2back = NULL;
static player_t *plr;
boolean hu_keystrokes; // :)
boolean chat_on; // entering a chat message?
@ -166,6 +168,8 @@ void HU_LoadGraphics(void)
// fps stuff
HU_UpdatePatch(&framecounter, "FRAMER");
HU_UpdatePatch(&frameslash, "FRAMESL");
HU_UpdatePatch(&srb2back, "SRB2BACK");
}
// Initialise Heads up

View file

@ -111,6 +111,7 @@ extern boolean hu_keystrokes;
extern patch_t *pinggfx[5];
extern patch_t *framecounter;
extern patch_t *frameslash;
extern patch_t *srb2back;
// set true whenever the tab rankings are being shown for any reason
extern boolean hu_showscores;

View file

@ -185,9 +185,11 @@ void OglSdlFinishUpdate(boolean waitvbl)
SDL_GetWindowSizeInPixels(window, &sdlw, &sdlh);
HWR_MakeScreenFinalTexture();
GL_SetShader(HWR_GetShaderFromTarget(SHADER_FINAL_POST_PROCESS));
if (gl_shadersavailable)
GL_SetShader(HWR_GetShaderFromTarget(SHADER_FINAL_POST_PROCESS));
HWR_DrawScreenFinalTexture(sdlw, sdlh);
GL_UnSetShader();
if (gl_shadersavailable)
GL_UnSetShader();
SDL_GL_SwapWindow(window);
GL_GClipRect(0, 0, vid.width, vid.height, NZCLIP_PLANE);

View file

@ -384,7 +384,11 @@ void Y_IntermissionDrawer(void)
if (useinterpic)
V_DrawScaledPatch(0, 0, 0, interpic);
#ifdef HWRENDER
else if (y_screenbuffer != NULL && !(rendermode == render_opengl && cv_glscreentextures.value != 2))
#else
else if (y_screenbuffer != NULL)
#endif
{
if (rendermode == render_soft)
VID_BlitLinearScreen(y_screenbuffer, vid.screens[0], vid.width, vid.height, vid.width, vid.rowbytes);