mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-10 23:32:09 +00:00
beat the skydome bugs to a pulp. no more seam (and probably a bunch faster
on slow cards)
This commit is contained in:
parent
3c58b712d9
commit
e483333bbe
1 changed files with 142 additions and 23 deletions
|
@ -188,10 +188,119 @@ R_DrawSkyBox (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3_t domescale = {512.0, 512.0, 128.0};
|
vec3_t domescale = {2048.0, 2048.0, 512.0};
|
||||||
|
vec3_t zenith = { 0.0, 0.0, 512.0};
|
||||||
|
vec3_t nadir = { 0.0, 0.0, -512.0};
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
skydome_vertex (const vec3_t v, float speedscale)
|
||||||
|
{
|
||||||
|
float length, s, t;
|
||||||
|
vec3_t dir, point;
|
||||||
|
|
||||||
|
VectorCopy (v, dir);
|
||||||
|
dir[2] *= 3.0;
|
||||||
|
|
||||||
|
length = DotProduct (dir, dir);
|
||||||
|
length = 2.953125 / sqrt (length);
|
||||||
|
|
||||||
|
dir[0] *= length;
|
||||||
|
dir[1] *= length;
|
||||||
|
|
||||||
|
s = speedscale + dir[0];
|
||||||
|
t = speedscale + dir[1];
|
||||||
|
|
||||||
|
VectorAdd (r_refdef.vieworg, v, point);
|
||||||
|
|
||||||
|
qfglTexCoord2f (s, t);
|
||||||
|
qfglVertex3fv (point);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
R_DrawSkyLayer (float s)
|
skydome_debug (void)
|
||||||
|
{
|
||||||
|
float x, y, a1x, a1y, a2x, a2y;
|
||||||
|
int a, b, h, t, i;
|
||||||
|
vec3_t v[3];
|
||||||
|
|
||||||
|
qfglDisable (GL_TEXTURE_2D);
|
||||||
|
qfglBegin (GL_LINES);
|
||||||
|
for (a = 0; a < 16; a++) {
|
||||||
|
a1x = bubble_costable[a * 2] * domescale[0];
|
||||||
|
a1y = -bubble_sintable[a * 2] * domescale[1];
|
||||||
|
a2x = bubble_costable[(a + 1) * 2] * domescale[0];
|
||||||
|
a2y = -bubble_sintable[(a + 1) * 2] * domescale[1];
|
||||||
|
|
||||||
|
h = 1;
|
||||||
|
t = 0;
|
||||||
|
VectorAdd (zenith, r_refdef.vieworg, v[0]);
|
||||||
|
for (b = 1; b <= 8; b++) {
|
||||||
|
x = bubble_costable[b + 8];
|
||||||
|
y = -bubble_sintable[b + 8];
|
||||||
|
|
||||||
|
v[h][0] = a1x * x;
|
||||||
|
v[h][1] = a1y * x;
|
||||||
|
v[h][2] = y * domescale[2];
|
||||||
|
VectorAdd (v[h], r_refdef.vieworg, v[h]);
|
||||||
|
for (i = t; i != h; i = (i + 1) % 3) {
|
||||||
|
qfglVertex3fv (v[i]);
|
||||||
|
qfglVertex3fv (v[h]);
|
||||||
|
}
|
||||||
|
h = (h + 1) % 3;
|
||||||
|
if (h == t)
|
||||||
|
t = (t + 1) % 3;
|
||||||
|
|
||||||
|
v[h][0] = a2x * x;
|
||||||
|
v[h][1] = a2y * x;
|
||||||
|
v[h][2] = y * domescale[2];
|
||||||
|
VectorAdd (v[h], r_refdef.vieworg, v[h]);
|
||||||
|
for (i = t; i != h; i = (i + 1) % 3) {
|
||||||
|
qfglVertex3fv (v[i]);
|
||||||
|
qfglVertex3fv (v[h]);
|
||||||
|
}
|
||||||
|
h = (h + 1) % 3;
|
||||||
|
if (h == t)
|
||||||
|
t = (t + 1) % 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
h = 1;
|
||||||
|
t = 0;
|
||||||
|
VectorAdd (nadir, r_refdef.vieworg, v[0]);
|
||||||
|
for (b = 15; b >= 8; b--) {
|
||||||
|
x = bubble_costable[b + 8];
|
||||||
|
y = -bubble_sintable[b + 8];
|
||||||
|
|
||||||
|
v[h][0] = a2x * x;
|
||||||
|
v[h][1] = a2y * x;
|
||||||
|
v[h][2] = y * domescale[2];
|
||||||
|
VectorAdd (v[h], r_refdef.vieworg, v[h]);
|
||||||
|
for (i = t; i != h; i = (i + 1) % 3) {
|
||||||
|
qfglVertex3fv (v[i]);
|
||||||
|
qfglVertex3fv (v[h]);
|
||||||
|
}
|
||||||
|
h = (h + 1) % 3;
|
||||||
|
if (h == t)
|
||||||
|
t = (t + 1) % 3;
|
||||||
|
|
||||||
|
v[h][0] = a1x * x;
|
||||||
|
v[h][1] = a1y * x;
|
||||||
|
v[h][2] = y * domescale[2];
|
||||||
|
VectorAdd (v[h], r_refdef.vieworg, v[h]);
|
||||||
|
for (i = t; i != h; i = (i + 1) % 3) {
|
||||||
|
qfglVertex3fv (v[i]);
|
||||||
|
qfglVertex3fv (v[h]);
|
||||||
|
}
|
||||||
|
h = (h + 1) % 3;
|
||||||
|
if (h == t)
|
||||||
|
t = (t + 1) % 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
qfglEnd ();
|
||||||
|
qfglEnable (GL_TEXTURE_2D);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
R_DrawSkyLayer (float speedscale)
|
||||||
{
|
{
|
||||||
float x, y, a1x, a1y, a2x, a2y;
|
float x, y, a1x, a1y, a2x, a2y;
|
||||||
int a, b;
|
int a, b;
|
||||||
|
@ -204,32 +313,39 @@ R_DrawSkyLayer (float s)
|
||||||
a2y = -bubble_sintable[(a + 1) * 2] * domescale[1];
|
a2y = -bubble_sintable[(a + 1) * 2] * domescale[1];
|
||||||
|
|
||||||
qfglBegin (GL_TRIANGLE_STRIP);
|
qfglBegin (GL_TRIANGLE_STRIP);
|
||||||
qfglTexCoord2f (0.5 + s * (1.0 / 128.0), 0.5 + s * (1.0 / 128.0));
|
skydome_vertex (zenith, speedscale);
|
||||||
qfglVertex3f (r_refdef.vieworg[0], r_refdef.vieworg[1],
|
for (b = 1; b <= 8; b++) {
|
||||||
r_refdef.vieworg[2] + domescale[2]);
|
x = bubble_costable[b + 8];
|
||||||
for (b = 1; b < 8; b++) {
|
y = -bubble_sintable[b + 8];
|
||||||
x = bubble_costable[(b << 1) + 16];
|
|
||||||
y = -bubble_sintable[(b << 1) + 16];
|
|
||||||
|
|
||||||
v[0] = a1x * x;
|
v[0] = a1x * x;
|
||||||
v[1] = a1y * x;
|
v[1] = a1y * x;
|
||||||
v[2] = y * domescale[2];
|
v[2] = y * domescale[2];
|
||||||
qfglTexCoord2f ((v[0] + s) * (1.0 / 128.0),
|
skydome_vertex (v, speedscale);
|
||||||
(v[1] + s) * (1.0 / 128.0));
|
|
||||||
qfglVertex3f (v[0] + r_refdef.vieworg[0], v[1] +
|
|
||||||
r_refdef.vieworg[1], v[2] + r_refdef.vieworg[2]);
|
|
||||||
|
|
||||||
v[0] = a2x * x;
|
v[0] = a2x * x;
|
||||||
v[1] = a2y * x;
|
v[1] = a2y * x;
|
||||||
v[2] = y * domescale[2];
|
v[2] = y * domescale[2];
|
||||||
qfglTexCoord2f ((v[0] + s) * (1.0 / 128.0),
|
skydome_vertex (v, speedscale);
|
||||||
(v[1] + s) * (1.0 / 128.0));
|
}
|
||||||
qfglVertex3f (v[0] + r_refdef.vieworg[0], v[1] +
|
qfglEnd ();
|
||||||
r_refdef.vieworg[1], v[2] + r_refdef.vieworg[2]);
|
|
||||||
|
qfglBegin (GL_TRIANGLE_STRIP);
|
||||||
|
skydome_vertex (nadir, speedscale);
|
||||||
|
for (b = 15; b >= 8; b--) {
|
||||||
|
x = bubble_costable[b + 8];
|
||||||
|
y = -bubble_sintable[b + 8];
|
||||||
|
|
||||||
|
v[0] = a2x * x;
|
||||||
|
v[1] = a2y * x;
|
||||||
|
v[2] = y * domescale[2];
|
||||||
|
skydome_vertex (v, speedscale);
|
||||||
|
|
||||||
|
v[0] = a1x * x;
|
||||||
|
v[1] = a1y * x;
|
||||||
|
v[2] = y * domescale[2];
|
||||||
|
skydome_vertex (v, speedscale);
|
||||||
}
|
}
|
||||||
qfglTexCoord2f (0.5 + s * (1.0 / 128.0), 0.5 + s * (1.0 / 128.0));
|
|
||||||
qfglVertex3f (r_refdef.vieworg[0], r_refdef.vieworg[1],
|
|
||||||
r_refdef.vieworg[2] - domescale[2]);
|
|
||||||
qfglEnd ();
|
qfglEnd ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -242,18 +358,21 @@ R_DrawSkyDome (void)
|
||||||
// base sky
|
// base sky
|
||||||
qfglDisable (GL_BLEND);
|
qfglDisable (GL_BLEND);
|
||||||
qfglBindTexture (GL_TEXTURE_2D, solidskytexture);
|
qfglBindTexture (GL_TEXTURE_2D, solidskytexture);
|
||||||
speedscale = r_realtime * 8;
|
speedscale = r_realtime / 16;
|
||||||
speedscale -= (int) speedscale & ~127;
|
speedscale -= floor (speedscale);;
|
||||||
R_DrawSkyLayer (speedscale);
|
R_DrawSkyLayer (speedscale);
|
||||||
qfglEnable (GL_BLEND);
|
qfglEnable (GL_BLEND);
|
||||||
|
|
||||||
// clouds
|
// clouds
|
||||||
if (gl_sky_multipass->int_val) {
|
if (gl_sky_multipass->int_val) {
|
||||||
qfglBindTexture (GL_TEXTURE_2D, alphaskytexture);
|
qfglBindTexture (GL_TEXTURE_2D, alphaskytexture);
|
||||||
speedscale = r_realtime * 16;
|
speedscale = r_realtime / 16;
|
||||||
speedscale -= (int) speedscale & ~127;
|
speedscale -= floor (speedscale);;
|
||||||
R_DrawSkyLayer (speedscale);
|
R_DrawSkyLayer (speedscale);
|
||||||
}
|
}
|
||||||
|
if (gl_sky_debug->int_val) {
|
||||||
|
skydome_debug ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
|
|
Loading…
Reference in a new issue