mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-22 18:31:27 +00:00
Perform some black magic.
}:>
This commit is contained in:
parent
cbd13ac54e
commit
617107f9c1
2 changed files with 45 additions and 12 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue