From 73d88323189cf3212ab3c24313be7a85b4f5844d Mon Sep 17 00:00:00 2001 From: Shpoike Date: Sat, 2 Sep 2023 06:57:07 +0100 Subject: [PATCH] Handle skyautorotate so the q2 remaster's skies do not spin constantly in a really annoying way. --- engine/client/cl_main.c | 1 + engine/client/cl_parse.c | 15 +++++++++++---- engine/client/client.h | 1 + engine/client/wad.c | 5 +++++ engine/gl/gl_warp.c | 2 ++ engine/gl/shader.h | 2 +- engine/shaders/glsl/defaultskybox.glsl | 9 ++++++--- 7 files changed, 27 insertions(+), 8 deletions(-) diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index d99849818..212fdf5e9 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -2250,6 +2250,7 @@ void CL_ClearState (qboolean gamestart) cl.autotrack_killer = -1; cl.downloadlist = pendingdownloads; cl.faileddownloads = faileddownloads; + cl.skyautorotate = 1; if (cfg_save_auto.ival && Cvar_UnsavedArchive()) Cmd_ExecuteString("cfg_save\n", RESTRICT_LOCAL); diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index b9207c24c..ea2632617 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -4716,7 +4716,13 @@ static void CLQ2_ParseConfigString (void) else if (i == Q2CS_SKYAXIS || i == Q2CS_SKYROTATE) { if (i == Q2CS_SKYROTATE) - cl.skyrotate = atof(s); + { + s = COM_Parse(s); + cl.skyrotate = atof(com_token); + s = COM_Parse(s); + if (*com_token) + cl.skyautorotate = atoi(com_token); + } else { s = COM_Parse(s); @@ -4737,12 +4743,13 @@ static void CLQ2_ParseConfigString (void) if (cl.skyrotate) { if (cl.skyaxis[0]||cl.skyaxis[1]||cl.skyaxis[2]) - Cvar_Set(&r_skybox_orientation, va("%g %g %g %g", cl.skyaxis[0], cl.skyaxis[1], cl.skyaxis[2], cl.skyrotate)); + Cvar_LockFromServer(&r_skybox_orientation, va("%g %g %g %g", cl.skyaxis[0], cl.skyaxis[1], cl.skyaxis[2], cl.skyrotate)); else - Cvar_Set(&r_skybox_orientation, va("0 0 1 %g", cl.skyrotate)); + Cvar_LockFromServer(&r_skybox_orientation, va("0 0 1 %g", cl.skyrotate)); } else - Cvar_Set(&r_skybox_orientation, ""); + Cvar_LockFromServer(&r_skybox_orientation, ""); + Cvar_LockFromServer(&r_skybox_autorotate, va("%i", cl.skyautorotate)); } else if (i == Q2CS_STATUSBAR) { diff --git a/engine/client/client.h b/engine/client/client.h index da4416d2f..62def9746 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -925,6 +925,7 @@ typedef struct //used for q2 sky/configstrings char skyname[MAX_QPATH]; float skyrotate; + qboolean skyautorotate; vec3_t skyaxis; qboolean fog_locked; //FIXME: make bitmask diff --git a/engine/client/wad.c b/engine/client/wad.c index 6bb2530c4..c1a31b4ed 100644 --- a/engine/client/wad.c +++ b/engine/client/wad.c @@ -927,6 +927,10 @@ void Mod_ParseInfoFromEntityLump(model_t *wmodel) //actually, this should be in { cl.skyrotate = atof(token); } + else if (!strcmp("skyautorotate", key)) //q2ex feature + { + cl.skyautorotate = atof(token); + } else if (!strcmp("skyaxis", key)) //q2 feature { char *s; @@ -955,6 +959,7 @@ void Mod_ParseInfoFromEntityLump(model_t *wmodel) //actually, this should be in } else Cvar_Set(&r_skybox_orientation, ""); + Cvar_SetValue(&r_skybox_autorotate, cl.skyautorotate); if (wmodel) { diff --git a/engine/gl/gl_warp.c b/engine/gl/gl_warp.c index a77ce18c6..4b5652f44 100644 --- a/engine/gl/gl_warp.c +++ b/engine/gl/gl_warp.c @@ -40,6 +40,7 @@ static cvar_t gl_skyboxdist = CVARD ("gl_skyboxdist", "0", "The distance o static cvar_t r_skycloudalpha = CVARFD ("r_skycloudalpha", "1", CVAR_RENDERERLATCH, "Controls how opaque the front layer of legacy scrolling skies should be."); cvar_t r_skyboxname = CVARFC ("r_skybox", "", CVAR_RENDERERCALLBACK | CVAR_SHADERSYSTEM, R_SkyBox_Changed); cvar_t r_skybox_orientation = CVARFD ("r_glsl_skybox_orientation", "0 0 0 0", CVAR_SHADERSYSTEM, "Defines the axis around which skyboxes will rotate (the first three values). The fourth value defines the speed the skybox rotates at, in degrees per second."); +cvar_t r_skybox_autorotate = CVARFD ("r_glsl_skybox_autorotate", "1", CVAR_SHADERSYSTEM, "Defines the axis around which skyboxes will rotate (the first three values). The fourth value defines the speed the skybox rotates at, in degrees per second."); cvar_t r_skyfog = CVARD ("r_skyfog", "0.5", "This controls an alpha-blend value for fog on skyboxes, cumulative with regular fog alpha."); static shader_t *forcedsky; @@ -1344,6 +1345,7 @@ void R_Sky_Register(void) Cvar_Register (&r_skyfog, groupname); Cvar_Register (&r_skyboxname, groupname); Cvar_Register (&r_skybox_orientation, groupname); + Cvar_Register (&r_skybox_autorotate, groupname); Cvar_Register (&gl_skyboxdist, groupname); Cmd_AddCommandAD("sky", R_ForceSky_f, R_ForceSky_c, "For compat with Quakespasm, please use r_skybox."); //QS compat diff --git a/engine/gl/shader.h b/engine/gl/shader.h index 902ff9ee7..1f94088b0 100644 --- a/engine/gl/shader.h +++ b/engine/gl/shader.h @@ -1095,5 +1095,5 @@ void CLQ1_AddOrientedCylinder(shader_t *shader, float radius, float height, qboo void CLQ1_AddOrientedSphere(shader_t *shader, float radius, float *matrix, float r, float g, float b, float a); void CLQ1_AddOrientedHalfSphere(shader_t *shader, float radius, float gap, float *matrix, float r, float g, float b, float a); -extern cvar_t r_fastturb, r_fastsky, r_skyboxname, r_skybox_orientation; +extern cvar_t r_fastturb, r_fastsky, r_skyboxname, r_skybox_orientation, r_skybox_autorotate; #endif diff --git a/engine/shaders/glsl/defaultskybox.glsl b/engine/shaders/glsl/defaultskybox.glsl index 5db1ac0ff..708d15e53 100644 --- a/engine/shaders/glsl/defaultskybox.glsl +++ b/engine/shaders/glsl/defaultskybox.glsl @@ -2,6 +2,7 @@ !!samps reflectcube !!cvardf r_skyfog=0.5 !!cvard4 r_glsl_skybox_orientation=0 0 0 0 +!!cvardf r_glsl_skybox_autorotate=1 #include "sys/defs.h" #include "sys/fog.h" @@ -11,10 +12,12 @@ varying vec3 pos; #ifdef VERTEX_SHADER mat3 rotateAroundAxis(vec4 axis) //xyz axis, with angle in w { -#define skyang axis.w*(3.14/180.0)*e_time + if (bool(r_glsl_skybox_autorotate)) + axis.w *= e_time; + axis.w *= (3.14/180.0); axis.xyz = normalize(axis.xyz); - float s = sin(skyang); - float c = cos(skyang); + float s = sin(axis.w); + float c = cos(axis.w); float oc = 1.0 - c; return mat3(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s,