From 617107f9c1c4f88ef1dff314206067b9e6113164 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Thu, 12 Jan 2012 21:23:39 +0900 Subject: [PATCH] Perform some black magic. }:> --- libs/video/renderer/glsl/glsl_bsp.c | 54 +++++++++++++++++++++----- libs/video/renderer/glsl/quakesky.vert | 3 +- 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/libs/video/renderer/glsl/glsl_bsp.c b/libs/video/renderer/glsl/glsl_bsp.c index fbab1bd03..e1e8a78ec 100644 --- a/libs/video/renderer/glsl/glsl_bsp.c +++ b/libs/video/renderer/glsl/glsl_bsp.c @@ -96,6 +96,9 @@ static mat4_t bsp_vp; static GLuint skybox_tex; static qboolean skybox_loaded; +static quat_t sky_rotation[2]; +static quat_t sky_velocity; +static double sky_time; static const char quakebsp_vert[] = #include "quakebsp.vc" @@ -162,7 +165,7 @@ static struct { static struct { int program; shaderparam_t mvp_matrix; - shaderparam_t origin; + shaderparam_t sky_matrix; shaderparam_t vertex; shaderparam_t palette; shaderparam_t solid; @@ -171,7 +174,7 @@ static struct { } quake_skyid = { 0, {"mvp_mat", 1}, - {"origin", 1}, + {"sky_mat", 1}, {"vertex", 0}, {"palette", 1}, {"solid", 1}, @@ -182,19 +185,20 @@ static struct { static struct { int program; shaderparam_t mvp_matrix; - shaderparam_t origin; + shaderparam_t sky_matrix; shaderparam_t vertex; shaderparam_t sky; } quake_skybox = { 0, {"mvp_mat", 1}, - {"origin", 1}, + {"sky_mat", 1}, {"vertex", 0}, {"sky", 1}, }; static struct { shaderparam_t *mvp_matrix; + shaderparam_t *sky_matrix; shaderparam_t *vertex; } sky_params; @@ -485,6 +489,12 @@ R_BuildDisplayLists (model_t **models, int num_models) msurface_t *surf; dstring_t *vertices; + QuatSet (1, 0, 0, 0, sky_rotation[0]); + QuatSet (1, 0, 0, 0, sky_rotation[1]); + QuatSet (0, 0.02, 0.03, 0.01, sky_velocity); + QuatExp (sky_velocity, sky_velocity); + sky_time = r_realtime; + // now run through all surfaces, chaining them to their textures, thus // effectively sorting the surfaces by texture (without worrying about // surface order on the same texture chain). @@ -859,33 +869,54 @@ turb_end (void) qfglBindBuffer (GL_ARRAY_BUFFER, 0); } +static void +spin (mat4_t mat) +{ + quat_t q; + mat4_t m; + float blend; + + while (r_realtime - sky_time > 1) { + QuatCopy (sky_rotation[1], sky_rotation[0]); + QuatMult (sky_velocity, sky_rotation[0], sky_rotation[1]); + sky_time += 1; + } + blend = bound (0, (r_realtime - sky_time), 1); + + QuatBlend (sky_rotation[0], sky_rotation[1], blend, q); + Mat4Identity (mat); + VectorNegate (r_origin, mat + 12); + QuatToMatrix (q, m, 1, 1); + Mat4Mult (m, mat, mat); +} + static void sky_begin (void) { + mat4_t mat; + Mat4Mult (glsl_projection, glsl_view, bsp_vp); if (skybox_loaded) { sky_params.mvp_matrix = &quake_skybox.mvp_matrix; sky_params.vertex = &quake_skybox.vertex; + sky_params.sky_matrix = &quake_skybox.sky_matrix; qfglUseProgram (quake_skybox.program); qfglEnableVertexAttribArray (quake_skybox.vertex.location); - qfglUniform3fv (quake_skybox.origin.location, 1, r_origin); - qfglUniform1i (quake_skybox.sky.location, 0); qfglActiveTexture (GL_TEXTURE0 + 0); qfglEnable (GL_TEXTURE_CUBE_MAP); qfglBindTexture (GL_TEXTURE_CUBE_MAP, skybox_tex); } else { sky_params.mvp_matrix = &quake_skyid.mvp_matrix; + sky_params.sky_matrix = &quake_skyid.sky_matrix; sky_params.vertex = &quake_skyid.vertex; qfglUseProgram (quake_skyid.program); qfglEnableVertexAttribArray (quake_skyid.vertex.location); - qfglUniform3fv (quake_skyid.origin.location, 1, r_origin); - qfglUniform1i (quake_skyid.palette.location, 2); qfglActiveTexture (GL_TEXTURE0 + 2); qfglEnable (GL_TEXTURE_2D); @@ -902,6 +933,9 @@ sky_begin (void) qfglEnable (GL_TEXTURE_2D); } + spin (mat); + qfglUniformMatrix4fv (sky_params.sky_matrix->location, 1, false, mat); + qfglBindBuffer (GL_ARRAY_BUFFER, bsp_vbo); } @@ -1144,7 +1178,7 @@ R_InitBsp (void) GL_FRAGMENT_SHADER); quake_skyid.program = GL_LinkProgram ("quakeskyid", vert, frag); GL_ResolveShaderParam (quake_skyid.program, &quake_skyid.mvp_matrix); - GL_ResolveShaderParam (quake_skyid.program, &quake_skyid.origin); + GL_ResolveShaderParam (quake_skyid.program, &quake_skyid.sky_matrix); GL_ResolveShaderParam (quake_skyid.program, &quake_skyid.vertex); GL_ResolveShaderParam (quake_skyid.program, &quake_skyid.palette); GL_ResolveShaderParam (quake_skyid.program, &quake_skyid.solid); @@ -1155,7 +1189,7 @@ R_InitBsp (void) GL_FRAGMENT_SHADER); quake_skybox.program = GL_LinkProgram ("quakeskybox", vert, frag); GL_ResolveShaderParam (quake_skybox.program, &quake_skybox.mvp_matrix); - GL_ResolveShaderParam (quake_skybox.program, &quake_skybox.origin); + GL_ResolveShaderParam (quake_skybox.program, &quake_skybox.sky_matrix); GL_ResolveShaderParam (quake_skybox.program, &quake_skybox.vertex); GL_ResolveShaderParam (quake_skybox.program, &quake_skybox.sky); } diff --git a/libs/video/renderer/glsl/quakesky.vert b/libs/video/renderer/glsl/quakesky.vert index be5cb9904..98754de77 100644 --- a/libs/video/renderer/glsl/quakesky.vert +++ b/libs/video/renderer/glsl/quakesky.vert @@ -1,6 +1,5 @@ uniform mat4 mvp_mat; uniform mat4 sky_mat; -uniform vec3 origin; attribute vec4 tlst; attribute vec4 vertex; @@ -11,5 +10,5 @@ void main (void) { gl_Position = mvp_mat * vertex; - direction = vertex.xyz - origin; + direction = (sky_mat * vertex).xyz; }