From 462b64b8ce26632d08556d616fbe7607d59ed609 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Sun, 11 Feb 2024 19:21:22 +0300 Subject: [PATCH] ref: gl: add water warp scroll effect for compatibility with Magic-Nipples's engine fork --- ref/gl/gl_local.h | 3 +++ ref/gl/gl_opengl.c | 6 ++++++ ref/gl/gl_warp.c | 28 +++++++++++++++++++++------- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/ref/gl/gl_local.h b/ref/gl/gl_local.h index 35c98797..15bd237a 100644 --- a/ref/gl/gl_local.h +++ b/ref/gl/gl_local.h @@ -809,6 +809,9 @@ extern convar_t r_studio_drawelements; extern convar_t r_ripple; extern convar_t r_ripple_updatetime; extern convar_t r_ripple_spawntime; +extern convar_t r_water_warp; +extern convar_t r_water_warp_x; +extern convar_t r_water_warp_y; // // engine shared convars diff --git a/ref/gl/gl_opengl.c b/ref/gl/gl_opengl.c index d0be3cd1..8b4e65bf 100644 --- a/ref/gl/gl_opengl.c +++ b/ref/gl/gl_opengl.c @@ -37,6 +37,9 @@ CVAR_DEFINE( r_vbo_overbrightmode, "gl_vbo_overbrightmode", "0", FCVAR_ARCHIVE, CVAR_DEFINE_AUTO( r_ripple, "0", FCVAR_GLCONFIG, "enable software-like water texture ripple simulation" ); CVAR_DEFINE_AUTO( r_ripple_updatetime, "0.05", FCVAR_GLCONFIG, "how fast ripple simulation is" ); CVAR_DEFINE_AUTO( r_ripple_spawntime, "0.1", FCVAR_GLCONFIG, "how fast new ripples spawn" ); +CVAR_DEFINE_AUTO( r_water_warp, "1", FCVAR_GLCONFIG, "set water warp style (0: disable, 1: sine waves, 2: constant scroll)" ); +CVAR_DEFINE_AUTO( r_water_warp_x, "6", FCVAR_GLCONFIG, "water warp scroll x axis speed" ); +CVAR_DEFINE_AUTO( r_water_warp_y, "6", FCVAR_GLCONFIG, "water warp scroll y axis speed" ); DEFINE_ENGINE_SHARED_CVAR_LIST() @@ -1192,6 +1195,9 @@ static void GL_InitCommands( void ) gEngfuncs.Cvar_RegisterVariable( &r_ripple ); gEngfuncs.Cvar_RegisterVariable( &r_ripple_updatetime ); gEngfuncs.Cvar_RegisterVariable( &r_ripple_spawntime ); + gEngfuncs.Cvar_RegisterVariable( &r_water_warp ); + gEngfuncs.Cvar_RegisterVariable( &r_water_warp_x ); + gEngfuncs.Cvar_RegisterVariable( &r_water_warp_y ); gEngfuncs.Cvar_RegisterVariable( &gl_extensions ); gEngfuncs.Cvar_RegisterVariable( &gl_texture_nearest ); diff --git a/ref/gl/gl_warp.c b/ref/gl/gl_warp.c index bff62d6e..5e2e58f2 100644 --- a/ref/gl/gl_warp.c +++ b/ref/gl/gl_warp.c @@ -781,7 +781,7 @@ Does a water warp on the pre-fragmented glpoly_t chain void EmitWaterPolys( msurface_t *warp, qboolean reverse ) { float *v, nv, waveHeight; - float s, t, os, ot; + float s, t, os, ot, warp_s, warp_t; glpoly_t *p; int i; @@ -822,15 +822,29 @@ void EmitWaterPolys( msurface_t *warp, qboolean reverse ) os = v[3]; ot = v[4]; - if( !r_ripple.value ) + switch((int)r_water_warp.value ) { - s = os + r_turbsin[(int)((ot * 0.125f + gp_cl->time) * TURBSCALE) & 255]; - t = ot + r_turbsin[(int)((os * 0.125f + gp_cl->time) * TURBSCALE) & 255]; + case 0: + warp_s = warp_t = 0; + break; + case 1: + warp_s = r_turbsin[(int)((ot * 0.125f + gp_cl->time) * TURBSCALE) & 255]; + warp_t = r_turbsin[(int)((os * 0.125f + gp_cl->time) * TURBSCALE) & 255]; + break; + case 2: + default: + warp_s = gp_cl->time * r_water_warp_x.value; + warp_t = gp_cl->time * r_water_warp_y.value; + break; } - else + + s = os + warp_s; + t = ot + warp_t; + + if( r_ripple.value ) { - s = os / g_ripple.texturescale; - t = ot / g_ripple.texturescale; + s /= g_ripple.texturescale; + t /= g_ripple.texturescale; } s *= ( 1.0f / SUBDIVIDE_SIZE );