From 70c878c344e7a519c9238964e78d2e2fcee87358 Mon Sep 17 00:00:00 2001 From: Kirill Yurkin <47507219+ugozapad@users.noreply.github.com> Date: Tue, 2 Dec 2025 20:25:38 +0300 Subject: [PATCH 1/3] client: render: add OpenGL 3.1 support --- client/render/gl_export.cpp | 8 ++++++++ client/render/gl_export.h | 8 ++++++++ client/render/gl_local.h | 1 + 3 files changed, 17 insertions(+) diff --git a/client/render/gl_export.cpp b/client/render/gl_export.cpp index 8453b0815..c0abbf29e 100644 --- a/client/render/gl_export.cpp +++ b/client/render/gl_export.cpp @@ -229,6 +229,13 @@ static dllfunc_t opengl_200funcs[] = { NULL, NULL } }; +static dllfunc_t opengl_310funcs[] = +{ +{ "glGetUniformBlockIndex" , (void **)&pglGetUniformBlockIndex }, +{ "glUniformBlockBinding" , (void **)&pglUniformBlockBinding }, +{ NULL, NULL } +}; + static dllfunc_t drawrangeelementsextfuncs[] = { { "glDrawRangeElementsEXT" , (void **)&pglDrawRangeElements }, @@ -533,6 +540,7 @@ static void GL_InitExtensions( void ) // initialize gl extensions GL_CheckExtension("OpenGL 1.1.0", opengl_110funcs, NULL, R_OPENGL_110); GL_CheckExtension("OpenGL 2.0", opengl_200funcs, NULL, R_OPENGL_200); + GL_CheckExtension("OpenGL 3.1", opengl_310funcs, NULL, R_OPENGL_310); if (!GL_Support(R_OPENGL_110)) { diff --git a/client/render/gl_export.h b/client/render/gl_export.h index 2dcf8e612..44563b68c 100644 --- a/client/render/gl_export.h +++ b/client/render/gl_export.h @@ -935,6 +935,12 @@ typedef unsigned int GLhandleARB; #define GL_ACTIVE_UNIFORMS 0x8B86 #define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_INVALID_INDEX 0xFFFFFFFFu + // GL_NV_alpha_to_coverage_dither_control #define GL_ALPHA_TO_COVERAGE_DITHER_DEFAULT_NV 0x934D #define GL_ALPHA_TO_COVERAGE_DITHER_ENABLE_NV 0x934E @@ -1311,6 +1317,8 @@ EXTERN void (APIENTRY *pglGetShaderInfoLog)(GLuint shader, GLsizei maxLength, GL EXTERN void (APIENTRY *pglGetProgramInfoLog)(GLuint program, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); EXTERN void (APIENTRY *pglGetActiveUniform)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); EXTERN GLint (APIENTRY *pglGetUniformLocation)(GLuint program, const GLcharARB *name); +EXTERN GLuint (APIENTRY *pglGetUniformBlockIndex)(GLuint program, const GLcharARB *uniformBlockName); +EXTERN void (APIENTRY *pglUniformBlockBinding)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); EXTERN void ( APIENTRY *pglProgramStringARB)(GLenum target, GLenum format, GLsizei len, const void *string); EXTERN void ( APIENTRY *pglProgramEnvParameter4fARB)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); diff --git a/client/render/gl_local.h b/client/render/gl_local.h index 10c588484..ccd266aa7 100644 --- a/client/render/gl_local.h +++ b/client/render/gl_local.h @@ -431,6 +431,7 @@ enum { R_OPENGL_110 = 0, // base R_OPENGL_200, + R_OPENGL_310, R_WGL_PROCADDRESS, R_ARB_VERTEX_BUFFER_OBJECT_EXT, R_ARB_VERTEX_ARRAY_OBJECT_EXT, From 40595d98e1591cf005dfbc64917ec4c355e707ef Mon Sep 17 00:00:00 2001 From: ugozapad Date: Thu, 9 Apr 2026 10:34:09 +0300 Subject: [PATCH 2/3] client: render: add u_ModelViewProjection and clip plane uniforms and some shader update for GLSL 140 --- client/render/gl_cubemap.cpp | 20 ++++++++++++++++++++ client/render/gl_decals.cpp | 19 +++++++++++++++++++ client/render/gl_grass.cpp | 22 +++++++++++++++++++++- client/render/gl_shader.cpp | 4 ++++ client/render/gl_shader.h | 3 +++ client/render/gl_sky.cpp | 20 ++++++++++++++++++++ client/render/gl_studio_draw.cpp | 19 +++++++++++++++++++ client/render/gl_world_new.cpp | 20 ++++++++++++++++++++ game_dir/glsl/cubemap.h | 4 ++-- game_dir/glsl/forward/decal_bmodel_vp.glsl | 7 +++++-- game_dir/glsl/forward/decal_studio_vp.glsl | 7 +++++-- game_dir/glsl/forward/depth_bmodel_vp.glsl | 8 ++++++-- game_dir/glsl/forward/depth_grass_vp.glsl | 7 +++++-- game_dir/glsl/forward/depth_studio_vp.glsl | 8 ++++++-- game_dir/glsl/forward/generic_vp.glsl | 5 ++++- game_dir/glsl/forward/light_bmodel_vp.glsl | 7 +++++-- game_dir/glsl/forward/light_grass_vp.glsl | 7 +++++-- game_dir/glsl/forward/light_studio_vp.glsl | 7 +++++-- game_dir/glsl/forward/scene_bmodel_vp.glsl | 7 +++++-- game_dir/glsl/forward/scene_grass_vp.glsl | 1 + game_dir/glsl/forward/scene_studio_vp.glsl | 7 +++++-- game_dir/glsl/shadow_proj.h | 3 ++- 22 files changed, 187 insertions(+), 25 deletions(-) diff --git a/client/render/gl_cubemap.cpp b/client/render/gl_cubemap.cpp index 45271aba1..b0755e6ed 100644 --- a/client/render/gl_cubemap.cpp +++ b/client/render/gl_cubemap.cpp @@ -594,6 +594,26 @@ static void GL_FilterCubemapSpecularIBL(mcubemap_t *cubemap) projectionMatrix.CopyToArray(matrixBuffer); u->SetValue(&matrixBuffer[0]); break; + case UT_MODELVIEWMATRIX: + u->SetValue(&RI->view.worldMatrix); + break; + case UT_MODELVIEWPROJECTIONMATRIX: + u->SetValue(&RI->view.worldProjectionMatrix); + break; + case UT_CLIPPLANE: + { + GLdouble clip[4]; + mplane_t *p = &RI->clipPlane; + + clip[0] = p->normal[0]; + clip[1] = p->normal[1]; + clip[2] = p->normal[2]; + clip[3] = -p->dist; + + u->SetValue(clip); + + break; + } } } COpenGLUnitCube::GetInstance().Draw(); diff --git a/client/render/gl_decals.cpp b/client/render/gl_decals.cpp index 126893968..835c52c12 100644 --- a/client/render/gl_decals.cpp +++ b/client/render/gl_decals.cpp @@ -1443,7 +1443,26 @@ void R_SetDecalUniforms( brushdecal_t *decal ) break; case UT_SWAYHEIGHT: u->SetValue(desc->swayHeight); + case UT_MODELVIEWMATRIX: + u->SetValue(&RI->view.worldMatrix); break; + case UT_MODELVIEWPROJECTIONMATRIX: + u->SetValue(&RI->view.worldProjectionMatrix); + break; + case UT_CLIPPLANE: + { + GLdouble clip[4]; + mplane_t *p = &RI->clipPlane; + + clip[0] = p->normal[0]; + clip[1] = p->normal[1]; + clip[2] = p->normal[2]; + clip[3] = -p->dist; + + u->SetValue(clip); + + break; + } default: ALERT( at_error, "%s: unhandled uniform %s\n", RI->currentshader->name, u->name ); break; diff --git a/client/render/gl_grass.cpp b/client/render/gl_grass.cpp index 9b4e8252f..e5aefb102 100644 --- a/client/render/gl_grass.cpp +++ b/client/render/gl_grass.cpp @@ -852,7 +852,27 @@ void R_SetGrassUniforms( word hProgram, grass_t *grass ) break; case UT_GRASSPARAMS: u->SetValue( m_flGrassFadeStart, m_flGrassFadeDist, m_flGrassFadeEnd ); - break; + break; + case UT_MODELVIEWMATRIX: + u->SetValue(&RI->view.worldMatrix); + break; + case UT_MODELVIEWPROJECTIONMATRIX: + u->SetValue(&RI->view.worldProjectionMatrix); + break; + case UT_CLIPPLANE: + { + GLdouble clip[4]; + mplane_t *p = &RI->clipPlane; + + clip[0] = p->normal[0]; + clip[1] = p->normal[1]; + clip[2] = p->normal[2]; + clip[3] = -p->dist; + + u->SetValue(clip); + + break; + } default: ALERT( at_error, "%s: unhandled uniform %s\n", RI->currentshader->name, u->name ); break; diff --git a/client/render/gl_shader.cpp b/client/render/gl_shader.cpp index e4448230a..7a3d9dd1c 100644 --- a/client/render/gl_shader.cpp +++ b/client/render/gl_shader.cpp @@ -311,6 +311,9 @@ static uniformTable_t glsl_uniformTable[] = { "u_LightScale", UT_LIGHTSCALE, UFL_GLOBAL_PARM }, { "u_LightThreshold", UT_LIGHTTHRESHOLD, UFL_GLOBAL_PARM }, { "u_NumVisibleModels", UT_NUMVISIBLEMODELS, UFL_GLOBAL_PARM }, +{ "u_ModelViewMatrix", UT_MODELVIEWMATRIX, 0 }, +{ "u_ModelViewProjectionMatrix", UT_MODELVIEWPROJECTIONMATRIX, 0 }, +{ "u_ClipPlane", UT_CLIPPLANE, 0 }, { "u_Undefined", UT_UNDEFINED, 0 }, }; @@ -717,6 +720,7 @@ static bool GL_ProcessShader( glsl_program_t *program, const char *filename, GLe // add internal defines outputFile->Printf("#version 130\n"); // OpenGL 3.0 required (because bit operations support needed) + outputFile->Printf("#extension GL_ARB_uniform_buffer_object : enable\n"); outputFile->Printf("#ifndef M_PI\n#define M_PI 3.14159265358979323846\n#endif\n"); outputFile->Printf("#ifndef M_PI2\n#define M_PI2 6.28318530717958647692\n#endif\n"); diff --git a/client/render/gl_shader.h b/client/render/gl_shader.h index 56d7ad3bb..36d67257e 100644 --- a/client/render/gl_shader.h +++ b/client/render/gl_shader.h @@ -169,6 +169,9 @@ typedef enum UT_LIGHTSCALE, UT_LIGHTTHRESHOLD, UT_NUMVISIBLEMODELS, + UT_MODELVIEWMATRIX, + UT_MODELVIEWPROJECTIONMATRIX, + UT_CLIPPLANE, UT_UNDEFINED, } uniformType_t; diff --git a/client/render/gl_sky.cpp b/client/render/gl_sky.cpp index 8238ecd8c..01b87a62c 100644 --- a/client/render/gl_sky.cpp +++ b/client/render/gl_sky.cpp @@ -311,6 +311,26 @@ static void GL_DrawSkySide( word hProgram, int skyside ) case UT_ZFAR: u->SetValue( RI->view.farClip ); break; + case UT_MODELVIEWMATRIX: + u->SetValue(&RI->view.worldMatrix); + break; + case UT_MODELVIEWPROJECTIONMATRIX: + u->SetValue(&RI->view.worldProjectionMatrix); + break; + case UT_CLIPPLANE: + { + GLdouble clip[4]; + mplane_t *p = &RI->clipPlane; + + clip[0] = p->normal[0]; + clip[1] = p->normal[1]; + clip[2] = p->normal[2]; + clip[3] = -p->dist; + + u->SetValue(clip); + + break; + } default: ALERT( at_error, "%s: unhandled uniform %s\n", RI->currentshader->name, u->name ); break; diff --git a/client/render/gl_studio_draw.cpp b/client/render/gl_studio_draw.cpp index 62a83a867..67d156de0 100644 --- a/client/render/gl_studio_draw.cpp +++ b/client/render/gl_studio_draw.cpp @@ -3706,7 +3706,26 @@ void CStudioModelRenderer :: DrawSingleMesh( CSolidEntry *entry, bool force, boo break; case UT_SWAYHEIGHT: u->SetValue(mat->swayHeight); + case UT_MODELVIEWMATRIX: + u->SetValue( &RI->view.worldMatrix ); break; + case UT_MODELVIEWPROJECTIONMATRIX: + u->SetValue( &RI->view.worldProjectionMatrix ); + break; + case UT_CLIPPLANE: + { + GLdouble clip[4]; + mplane_t *p = &RI->clipPlane; + + clip[0] = p->normal[0]; + clip[1] = p->normal[1]; + clip[2] = p->normal[2]; + clip[3] = -p->dist; + + u->SetValue(clip); + + break; + } default: ALERT( at_error, "%s: unhandled uniform %s\n", RI->currentshader->name, u->name ); break; diff --git a/client/render/gl_world_new.cpp b/client/render/gl_world_new.cpp index 05c4c4d5e..96db83fa1 100644 --- a/client/render/gl_world_new.cpp +++ b/client/render/gl_world_new.cpp @@ -2868,6 +2868,26 @@ void R_SetSurfaceUniforms( word hProgram, msurface_t *surface, bool force ) case UT_LIGHTNUMS1: u->SetValue( (float)e->lights[4], (float)e->lights[5], (float)e->lights[6], (float)e->lights[7] ); break; + case UT_MODELVIEWMATRIX: + u->SetValue(&RI->view.worldMatrix); + break; + case UT_MODELVIEWPROJECTIONMATRIX: + u->SetValue(&RI->view.worldProjectionMatrix); + break; + case UT_CLIPPLANE: + { + GLdouble clip[4]; + mplane_t *p = &RI->clipPlane; + + clip[0] = p->normal[0]; + clip[1] = p->normal[1]; + clip[2] = p->normal[2]; + clip[3] = -p->dist; + + u->SetValue(clip); + + break; + } default: ALERT( at_error, "%s: unhandled uniform %s\n", RI->currentshader->name, u->name ); break; diff --git a/game_dir/glsl/cubemap.h b/game_dir/glsl/cubemap.h index 886509000..7d964ef73 100644 --- a/game_dir/glsl/cubemap.h +++ b/game_dir/glsl/cubemap.h @@ -56,8 +56,8 @@ vec3 CubemapProbeInternal( const vec3 vPos, const vec3 vView, const vec3 nWorld, vec3 wRef = normalize( reflect( I, NW )); vec3 R1 = CubemapBoxParallaxCorrected( wRef, vPos, u_CubeOrigin[0], u_BoxMins[0], u_BoxMaxs[0] ); vec3 R2 = CubemapBoxParallaxCorrected( wRef, vPos, u_CubeOrigin[1], u_BoxMins[1], u_BoxMaxs[1] ); - vec3 srcColor0 = textureCubeLod( cubemap0, R1, u_CubeMipCount.x - smoothness * u_CubeMipCount.x ).rgb; - vec3 srcColor1 = textureCubeLod( cubemap1, R2, u_CubeMipCount.y - smoothness * u_CubeMipCount.y ).rgb; + vec3 srcColor0 = textureLod( cubemap0, R1, u_CubeMipCount.x - smoothness * u_CubeMipCount.x ).rgb; + vec3 srcColor1 = textureLod( cubemap1, R2, u_CubeMipCount.y - smoothness * u_CubeMipCount.y ).rgb; vec3 reflectance = mix( srcColor0, srcColor1, u_LerpFactor ); return reflectance; } diff --git a/game_dir/glsl/forward/decal_bmodel_vp.glsl b/game_dir/glsl/forward/decal_bmodel_vp.glsl index 8ba9b1549..81fb74b31 100644 --- a/game_dir/glsl/forward/decal_bmodel_vp.glsl +++ b/game_dir/glsl/forward/decal_bmodel_vp.glsl @@ -28,6 +28,9 @@ uniform float u_LightStyleValues[MAX_LIGHTSTYLES]; uniform vec3 u_ViewOrigin; // already in modelspace uniform mat4 u_ModelMatrix; uniform mat4 u_ReflectMatrix; +uniform mat4 u_ModelViewMatrix; +uniform mat4 u_ModelViewProjectionMatrix; +uniform vec4 u_ClipPlane; varying vec4 var_TexDiffuse; varying vec3 var_TexLight0; @@ -51,8 +54,8 @@ void main( void ) vec4 position = vec4( attr_Position, 1.0 ); vec4 worldpos = u_ModelMatrix * position; - gl_Position = gl_ModelViewProjectionMatrix * worldpos; - gl_ClipVertex = gl_ModelViewMatrix * worldpos; + gl_Position = u_ModelViewProjectionMatrix * worldpos; + gl_ClipDistance[0] = dot( worldpos, u_ClipPlane ); // compute TBN mat3 tbn = ComputeTBN( u_ModelMatrix ); diff --git a/game_dir/glsl/forward/decal_studio_vp.glsl b/game_dir/glsl/forward/decal_studio_vp.glsl index d41c167de..bd52a29b7 100644 --- a/game_dir/glsl/forward/decal_studio_vp.glsl +++ b/game_dir/glsl/forward/decal_studio_vp.glsl @@ -34,6 +34,9 @@ uniform float u_Smoothness; uniform vec3 u_LightDiffuse; uniform vec2 u_LightShade; uniform vec3 u_LightDir; +uniform mat4 u_ModelViewMatrix; +uniform mat4 u_ModelViewProjectionMatrix; +uniform vec4 u_ClipPlane; #if defined (VERTEX_LIGHTING) uniform float u_LightGamma; @@ -59,8 +62,8 @@ void main( void ) mat4 boneMatrix = ComputeSkinningMatrix(); vec4 worldpos = boneMatrix * position; - gl_Position = gl_ModelViewProjectionMatrix * worldpos; - gl_ClipVertex = gl_ModelViewMatrix * worldpos; + gl_Position = u_ModelViewProjectionMatrix * worldpos; + gl_ClipDistance[0] = dot( worldpos, u_ClipPlane ); // compute TBN mat3 tbn = ComputeTBN( boneMatrix ); diff --git a/game_dir/glsl/forward/depth_bmodel_vp.glsl b/game_dir/glsl/forward/depth_bmodel_vp.glsl index ce8e70d13..a0ba9c83f 100644 --- a/game_dir/glsl/forward/depth_bmodel_vp.glsl +++ b/game_dir/glsl/forward/depth_bmodel_vp.glsl @@ -16,9 +16,13 @@ GNU General Public License for more details. attribute vec3 attr_Position; attribute vec2 attr_TexCoord0; +uniform mat4 u_ModelViewMatrix; +uniform mat4 u_ModelViewProjectionMatrix; uniform mat4 u_ModelMatrix; +uniform vec4 u_ClipPlane; uniform vec2 u_TexOffset; + varying vec2 var_TexCoord; // for alpha-testing void main( void ) @@ -27,8 +31,8 @@ void main( void ) vec4 worldpos = u_ModelMatrix * position; // transform vertex position into homogenous clip-space - gl_Position = gl_ModelViewProjectionMatrix * worldpos; - gl_ClipVertex = gl_ModelViewMatrix * worldpos; + gl_Position = u_ModelViewProjectionMatrix * worldpos; + gl_ClipDistance[0] = dot( worldpos, u_ClipPlane ); var_TexCoord = attr_TexCoord0 + u_TexOffset; } \ No newline at end of file diff --git a/game_dir/glsl/forward/depth_grass_vp.glsl b/game_dir/glsl/forward/depth_grass_vp.glsl index 8356cd57a..b5124bfb7 100644 --- a/game_dir/glsl/forward/depth_grass_vp.glsl +++ b/game_dir/glsl/forward/depth_grass_vp.glsl @@ -20,10 +20,13 @@ GNU General Public License for more details. attribute vec4 attr_Position; attribute vec4 attr_Normal; +uniform mat4 u_ModelViewMatrix; +uniform mat4 u_ModelViewProjectionMatrix; uniform mat4 u_ModelMatrix; uniform vec3 u_GrassParams; uniform vec3 u_ViewOrigin; uniform float u_RealTime; +uniform vec4 u_ClipPlane; varying vec2 var_TexDiffuse; @@ -46,7 +49,7 @@ void main( void ) } vec4 worldpos = u_ModelMatrix * position; - gl_Position = gl_ModelViewProjectionMatrix * worldpos; + gl_Position = u_ModelViewProjectionMatrix * worldpos; var_TexDiffuse = GetTexCoordsForVertex( int( attr_Normal.w )); - gl_ClipVertex = gl_ModelViewMatrix * worldpos; + gl_ClipDistance[0] = dot( worldpos, u_ClipPlane ); } \ No newline at end of file diff --git a/game_dir/glsl/forward/depth_studio_vp.glsl b/game_dir/glsl/forward/depth_studio_vp.glsl index 57e1b9fde..b6e7ab035 100644 --- a/game_dir/glsl/forward/depth_studio_vp.glsl +++ b/game_dir/glsl/forward/depth_studio_vp.glsl @@ -24,6 +24,10 @@ uniform float u_RealTime; varying vec2 var_TexDiffuse; +uniform mat4 u_ModelViewMatrix; +uniform mat4 u_ModelViewProjectionMatrix; +uniform vec4 u_ClipPlane; + void main( void ) { vec4 position = vec4( attr_Position, 1.0 ); @@ -38,8 +42,8 @@ void main( void ) vec4 worldpos = boneMatrix * position; // transform vertex position into homogenous clip-space - gl_Position = gl_ModelViewProjectionMatrix * worldpos; - gl_ClipVertex = gl_ModelViewMatrix * worldpos; + gl_Position = u_ModelViewProjectionMatrix * worldpos; + gl_ClipDistance[0] = dot( worldpos, u_ClipPlane ); var_TexDiffuse = attr_TexCoord0; } \ No newline at end of file diff --git a/game_dir/glsl/forward/generic_vp.glsl b/game_dir/glsl/forward/generic_vp.glsl index 24dd60616..139e63f1d 100644 --- a/game_dir/glsl/forward/generic_vp.glsl +++ b/game_dir/glsl/forward/generic_vp.glsl @@ -16,11 +16,14 @@ GNU General Public License for more details. varying vec4 var_Vertex; varying vec2 var_TexCoord; +uniform mat4 u_ModelViewMatrix; +uniform mat4 u_ModelViewProjectionMatrix; + void main( void ) { var_Vertex = gl_Vertex; var_TexCoord = gl_MultiTexCoord0.xy; - gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + gl_Position = u_ModelViewProjectionMatrix * gl_Vertex; } \ No newline at end of file diff --git a/game_dir/glsl/forward/light_bmodel_vp.glsl b/game_dir/glsl/forward/light_bmodel_vp.glsl index 6acb3354f..222411c3e 100644 --- a/game_dir/glsl/forward/light_bmodel_vp.glsl +++ b/game_dir/glsl/forward/light_bmodel_vp.glsl @@ -26,6 +26,9 @@ uniform vec3 u_ViewOrigin; uniform mat4 u_ModelMatrix; uniform mat4 u_ReflectMatrix; uniform vec2 u_TexOffset; +uniform mat4 u_ModelViewMatrix; +uniform mat4 u_ModelViewProjectionMatrix; +uniform vec4 u_ClipPlane; varying vec2 var_TexDiffuse; varying vec3 var_LightVec; @@ -67,8 +70,8 @@ void main( void ) vec4 position = vec4( attr_Position, 1.0 ); // in object space vec4 worldpos = u_ModelMatrix * position; - gl_Position = gl_ModelViewProjectionMatrix * worldpos; - gl_ClipVertex = gl_ModelViewMatrix * worldpos; + gl_Position = u_ModelViewProjectionMatrix * worldpos; + gl_ClipDistance[0] = dot( worldpos, u_ClipPlane ); // compute TBN mat3 tbn = ComputeTBN( u_ModelMatrix ); diff --git a/game_dir/glsl/forward/light_grass_vp.glsl b/game_dir/glsl/forward/light_grass_vp.glsl index e8080d151..473680ab9 100644 --- a/game_dir/glsl/forward/light_grass_vp.glsl +++ b/game_dir/glsl/forward/light_grass_vp.glsl @@ -27,6 +27,9 @@ uniform vec3 u_GrassParams; uniform vec4 u_LightOrigin; uniform vec3 u_ViewOrigin; uniform float u_RealTime; +uniform mat4 u_ModelViewMatrix; +uniform mat4 u_ModelViewProjectionMatrix; +uniform vec4 u_ClipPlane; varying vec2 var_TexDiffuse; varying vec3 var_LightVec; @@ -60,9 +63,9 @@ void main( void ) } vec4 worldpos = u_ModelMatrix * position; - gl_Position = gl_ModelViewProjectionMatrix * worldpos; + gl_Position = u_ModelViewProjectionMatrix * worldpos; var_TexDiffuse = GetTexCoordsForVertex( int( attr_Normal.w )); - gl_ClipVertex = gl_ModelViewMatrix * worldpos; + gl_ClipDistance[0] = dot( worldpos, u_ClipPlane ); #if defined( LIGHT_SPOT ) var_ProjCoord = ( Mat4Texture( -0.5 ) * u_LightViewProjMatrix ) * worldpos; diff --git a/game_dir/glsl/forward/light_studio_vp.glsl b/game_dir/glsl/forward/light_studio_vp.glsl index d61c12624..70635f225 100644 --- a/game_dir/glsl/forward/light_studio_vp.glsl +++ b/game_dir/glsl/forward/light_studio_vp.glsl @@ -27,6 +27,9 @@ uniform vec3 u_ViewOrigin; uniform vec3 u_ViewRight; uniform float u_SwayHeight; uniform float u_RealTime; +uniform mat4 u_ModelViewMatrix; +uniform mat4 u_ModelViewProjectionMatrix; +uniform vec4 u_ClipPlane; varying vec2 var_TexDiffuse; varying vec3 var_LightVec; @@ -68,8 +71,8 @@ void main( void ) vec4 worldpos = boneMatrix * position; // transform vertex position into homogenous clip-space - gl_Position = gl_ModelViewProjectionMatrix * worldpos; - gl_ClipVertex = gl_ModelViewMatrix * worldpos; + gl_Position = u_ModelViewProjectionMatrix * worldpos; + gl_ClipDistance[0] = dot( worldpos, u_ClipPlane ); // compute TBN mat3 tbn = ComputeTBN( boneMatrix ); diff --git a/game_dir/glsl/forward/scene_bmodel_vp.glsl b/game_dir/glsl/forward/scene_bmodel_vp.glsl index 4acf4901b..38fcc2a58 100644 --- a/game_dir/glsl/forward/scene_bmodel_vp.glsl +++ b/game_dir/glsl/forward/scene_bmodel_vp.glsl @@ -28,6 +28,9 @@ uniform mat4 u_ReflectMatrix; uniform vec3 u_ViewOrigin; // already in modelspace uniform vec2 u_DetailScale; uniform vec2 u_TexOffset; // conveyor stuff +uniform mat4 u_ModelViewMatrix; +uniform mat4 u_ModelViewProjectionMatrix; +uniform vec4 u_ClipPlane; centroid varying vec2 var_TexDiffuse; centroid varying vec3 var_TexLight0; @@ -60,8 +63,8 @@ void main( void ) vec4 position = vec4( attr_Position, 1.0 ); // in object space vec4 worldpos = u_ModelMatrix * position; - gl_Position = gl_ModelViewProjectionMatrix * worldpos; - gl_ClipVertex = gl_ModelViewMatrix * worldpos; + gl_Position = u_ModelViewProjectionMatrix * worldpos; + gl_ClipDistance[0] = dot( worldpos, u_ClipPlane ); // compute TBN mat3 tbn = ComputeTBN( u_ModelMatrix ); diff --git a/game_dir/glsl/forward/scene_grass_vp.glsl b/game_dir/glsl/forward/scene_grass_vp.glsl index 8208d0a85..2c8a2c72a 100644 --- a/game_dir/glsl/forward/scene_grass_vp.glsl +++ b/game_dir/glsl/forward/scene_grass_vp.glsl @@ -24,6 +24,7 @@ attribute vec4 attr_LightVecs; attribute vec4 attr_LightStyles; uniform mat4 u_ModelMatrix; +uniform mat4 u_ModelViewMatrix; uniform float u_LightStyleValues[MAX_LIGHTSTYLES]; uniform vec3 u_GrassParams; uniform vec3 u_ViewOrigin; diff --git a/game_dir/glsl/forward/scene_studio_vp.glsl b/game_dir/glsl/forward/scene_studio_vp.glsl index e6dc24a3d..c4f5aeee1 100644 --- a/game_dir/glsl/forward/scene_studio_vp.glsl +++ b/game_dir/glsl/forward/scene_studio_vp.glsl @@ -45,6 +45,9 @@ uniform vec2 u_LightShade; // x is ambientlight, y is shadelight uniform vec3 u_LightDir; uniform float u_SwayHeight; uniform float u_RealTime; +uniform mat4 u_ModelViewMatrix; +uniform mat4 u_ModelViewProjectionMatrix; +uniform vec4 u_ClipPlane; uniform float u_LightStyleValues[MAX_LIGHTSTYLES]; uniform float u_LightGamma; @@ -89,8 +92,8 @@ void main( void ) vec4 worldpos = boneMatrix * position; // transform vertex position into homogenous clip-space - gl_Position = gl_ModelViewProjectionMatrix * worldpos; - gl_ClipVertex = gl_ModelViewMatrix * worldpos; + gl_Position = u_ModelViewProjectionMatrix * worldpos; + gl_ClipDistance[0] = dot( worldpos, u_ClipPlane ); // compute TBN mat3 tbn = ComputeTBN( boneMatrix ); diff --git a/game_dir/glsl/shadow_proj.h b/game_dir/glsl/shadow_proj.h index 7391e1cc9..ee2e46481 100644 --- a/game_dir/glsl/shadow_proj.h +++ b/game_dir/glsl/shadow_proj.h @@ -21,6 +21,7 @@ uniform sampler2DShadow u_ShadowMap1; uniform sampler2DShadow u_ShadowMap2; uniform sampler2DShadow u_ShadowMap3; +uniform mat4 u_ModelViewMatrix; uniform mat4 u_ShadowMatrix[MAX_SHADOWMAPS]; uniform vec4 u_ShadowSplitDist; uniform vec4 u_TexelSize; // shadowmap resolution @@ -43,7 +44,7 @@ float ShadowProj( const in vec3 world ) float shadow = 0.0; // transform to camera space - vec4 cam = gl_ModelViewMatrix * vec4( world.xyz, 1.0 ); + vec4 cam = u_ModelViewMatrix * vec4( world.xyz, 1.0 ); float vertexDistanceToCamera = -cam.z; vec3 shadowVert; From 1f158c4f088bbb8012e6c58e7a46d66b9624a5c4 Mon Sep 17 00:00:00 2001 From: ugozapad Date: Thu, 9 Apr 2026 11:02:33 +0300 Subject: [PATCH 3/3] client: render: fix sway break and missing uniforms in decal render --- client/render/gl_backend.cpp | 12 ++++++++++++ client/render/gl_cubemap.cpp | 11 ++++------- client/render/gl_decals.cpp | 11 ++++------- client/render/gl_grass.cpp | 11 ++++------- client/render/gl_local.h | 1 + client/render/gl_sky.cpp | 5 +---- client/render/gl_studio_draw.cpp | 12 +++++------- client/render/gl_studiodecal_new.cpp | 17 +++++++++++++++++ client/render/gl_world_new.cpp | 11 ++++------- 9 files changed, 52 insertions(+), 39 deletions(-) diff --git a/client/render/gl_backend.cpp b/client/render/gl_backend.cpp index 5380af4e9..213c67453 100644 --- a/client/render/gl_backend.cpp +++ b/client/render/gl_backend.cpp @@ -974,6 +974,18 @@ void GL_ClipPlane( bool enable ) } } +/* +================= +GL_InitClipPlane +================= +*/ +void GL_InitClipPlane( const mplane_t *in, GLdouble *out ) +{ + out[0] = in->normal[0]; + out[1] = in->normal[1]; + out[2] = in->normal[2]; + out[3] = -in->dist; +} /* ================= diff --git a/client/render/gl_cubemap.cpp b/client/render/gl_cubemap.cpp index b0755e6ed..52cad5886 100644 --- a/client/render/gl_cubemap.cpp +++ b/client/render/gl_cubemap.cpp @@ -604,14 +604,11 @@ static void GL_FilterCubemapSpecularIBL(mcubemap_t *cubemap) { GLdouble clip[4]; mplane_t *p = &RI->clipPlane; - - clip[0] = p->normal[0]; - clip[1] = p->normal[1]; - clip[2] = p->normal[2]; - clip[3] = -p->dist; - + + GL_InitClipPlane(p, clip); + u->SetValue(clip); - + break; } } diff --git a/client/render/gl_decals.cpp b/client/render/gl_decals.cpp index 835c52c12..659c74179 100644 --- a/client/render/gl_decals.cpp +++ b/client/render/gl_decals.cpp @@ -1453,14 +1453,11 @@ void R_SetDecalUniforms( brushdecal_t *decal ) { GLdouble clip[4]; mplane_t *p = &RI->clipPlane; - - clip[0] = p->normal[0]; - clip[1] = p->normal[1]; - clip[2] = p->normal[2]; - clip[3] = -p->dist; - + + GL_InitClipPlane(p, clip); + u->SetValue(clip); - + break; } default: diff --git a/client/render/gl_grass.cpp b/client/render/gl_grass.cpp index e5aefb102..f611fb727 100644 --- a/client/render/gl_grass.cpp +++ b/client/render/gl_grass.cpp @@ -863,14 +863,11 @@ void R_SetGrassUniforms( word hProgram, grass_t *grass ) { GLdouble clip[4]; mplane_t *p = &RI->clipPlane; - - clip[0] = p->normal[0]; - clip[1] = p->normal[1]; - clip[2] = p->normal[2]; - clip[3] = -p->dist; - + + GL_InitClipPlane(p, clip); + u->SetValue(clip); - + break; } default: diff --git a/client/render/gl_local.h b/client/render/gl_local.h index ccd266aa7..da2e42beb 100644 --- a/client/render/gl_local.h +++ b/client/render/gl_local.h @@ -764,6 +764,7 @@ void GL_DisableAllTexGens(void); void GL_DepthMask(GLint enable); void GL_FrontFace(GLenum front); void GL_ClipPlane(bool enable); +void GL_InitClipPlane( const mplane_t *in, GLdouble *out ); void GL_BindFBO(GLuint buffer); void GL_AlphaTest(GLint enable); void GL_AlphaToCoverage(bool enable); diff --git a/client/render/gl_sky.cpp b/client/render/gl_sky.cpp index 01b87a62c..c762581d2 100644 --- a/client/render/gl_sky.cpp +++ b/client/render/gl_sky.cpp @@ -322,10 +322,7 @@ static void GL_DrawSkySide( word hProgram, int skyside ) GLdouble clip[4]; mplane_t *p = &RI->clipPlane; - clip[0] = p->normal[0]; - clip[1] = p->normal[1]; - clip[2] = p->normal[2]; - clip[3] = -p->dist; + GL_InitClipPlane(p, clip); u->SetValue(clip); diff --git a/client/render/gl_studio_draw.cpp b/client/render/gl_studio_draw.cpp index 67d156de0..3ee9bae60 100644 --- a/client/render/gl_studio_draw.cpp +++ b/client/render/gl_studio_draw.cpp @@ -3706,6 +3706,7 @@ void CStudioModelRenderer :: DrawSingleMesh( CSolidEntry *entry, bool force, boo break; case UT_SWAYHEIGHT: u->SetValue(mat->swayHeight); + break; case UT_MODELVIEWMATRIX: u->SetValue( &RI->view.worldMatrix ); break; @@ -3716,14 +3717,11 @@ void CStudioModelRenderer :: DrawSingleMesh( CSolidEntry *entry, bool force, boo { GLdouble clip[4]; mplane_t *p = &RI->clipPlane; - - clip[0] = p->normal[0]; - clip[1] = p->normal[1]; - clip[2] = p->normal[2]; - clip[3] = -p->dist; - + + GL_InitClipPlane(p, clip); + u->SetValue(clip); - + break; } default: diff --git a/client/render/gl_studiodecal_new.cpp b/client/render/gl_studiodecal_new.cpp index 7d7a3edc2..252ee268d 100644 --- a/client/render/gl_studiodecal_new.cpp +++ b/client/render/gl_studiodecal_new.cpp @@ -1712,6 +1712,23 @@ void CStudioModelRenderer :: SetDecalUniforms( studiodecal_t *pDecal ) height = pDecal->texinfo->gl_heightmap_id.GetHeight(); u->SetValue( (float)width, (float)height, pDecal->texinfo->matdesc->reliefScale, cv_shadow_offset->value ); break; + case UT_MODELVIEWMATRIX: + u->SetValue(&RI->view.worldMatrix); + break; + case UT_MODELVIEWPROJECTIONMATRIX: + u->SetValue(&RI->view.worldProjectionMatrix); + break; + case UT_CLIPPLANE: + { + GLdouble clip[4]; + mplane_t *p = &RI->clipPlane; + + GL_InitClipPlane(p, clip); + + u->SetValue(clip); + + break; + } default: ALERT( at_error, "Unhandled uniform %s\n", u->name ); break; diff --git a/client/render/gl_world_new.cpp b/client/render/gl_world_new.cpp index 96db83fa1..4d3d4b255 100644 --- a/client/render/gl_world_new.cpp +++ b/client/render/gl_world_new.cpp @@ -2878,14 +2878,11 @@ void R_SetSurfaceUniforms( word hProgram, msurface_t *surface, bool force ) { GLdouble clip[4]; mplane_t *p = &RI->clipPlane; - - clip[0] = p->normal[0]; - clip[1] = p->normal[1]; - clip[2] = p->normal[2]; - clip[3] = -p->dist; - + + GL_InitClipPlane(p, clip); + u->SetValue(clip); - + break; } default: