diff options
Diffstat (limited to 'src/gl_sky.c')
-rw-r--r-- | src/gl_sky.c | 248 |
1 files changed, 118 insertions, 130 deletions
diff --git a/src/gl_sky.c b/src/gl_sky.c index 4f9510d..2fbc5f2 100644 --- a/src/gl_sky.c +++ b/src/gl_sky.c @@ -9,7 +9,7 @@ of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -26,75 +26,69 @@ static vec3_t skyaxis; static int sky_images[6]; static const vec3_t skyclip[6] = { - {1,1,0}, - {1,-1,0}, - {0,-1,1}, - {0,1,1}, - {1,0,1}, - {-1,0,1} + { 1, 1, 0 }, + { 1, -1, 0 }, + { 0, -1, 1 }, + { 0, 1, 1 }, + { 1, 0, 1 }, + { -1, 0, 1 } }; // 1 = s, 2 = t, 3 = 2048 static const int st_to_vec[6][3] = { - {3,-1,2}, - {-3,1,2}, + { 3, -1, 2 }, + { -3, 1, 2 }, - {1,3,2}, - {-1,-3,2}, + { 1, 3, 2 }, + { -1, -3, 2 }, - {-2,-1,3}, // 0 degrees yaw, look straight up - {2,-1,-3} // look straight down + { -2, -1, 3 }, // 0 degrees yaw, look straight up + { 2, -1, -3 } // look straight down }; // s = [0]/[2], t = [1]/[2] static const int vec_to_st[6][3] = { - {-2,3,1}, - {2,3,-1}, + { -2, 3, 1 }, + { 2, 3, -1 }, - {1,3,2}, - {-1,3,-2}, + { 1, 3, 2 }, + { -1, 3, -2 }, - {-2,-1,3}, - {-2,1,-3} + { -2, -1, 3 }, + { -2, 1, -3 } }; static float skymins[2][6], skymaxs[2][6]; static const float sky_min = 1.0f / 512.0f; static const float sky_max = 511.0f / 512.0f; -static void DrawSkyPolygon (int nump, vec3_t vecs) +static void DrawSkyPolygon(int nump, vec3_t vecs) { - int i,j; + int i, j; vec3_t v, av; float s, t, dv; int axis; float *vp; // decide which face it maps to - VectorCopy (vec3_origin, v); - for (i=0, vp=vecs ; i<nump ; i++, vp+=3) - { - VectorAdd (vp, v, v); + VectorCopy(vec3_origin, v); + for (i = 0, vp = vecs; i < nump; i++, vp += 3) { + VectorAdd(vp, v, v); } av[0] = fabs(v[0]); av[1] = fabs(v[1]); av[2] = fabs(v[2]); - if (av[0] > av[1] && av[0] > av[2]) - { + if (av[0] > av[1] && av[0] > av[2]) { if (v[0] < 0) axis = 1; else axis = 0; - } - else if (av[1] > av[2] && av[1] > av[0]) - { + } else if (av[1] > av[2] && av[1] > av[0]) { if (v[1] < 0) axis = 3; else axis = 2; - } - else - { + } else { if (v[2] < 0) axis = 5; else @@ -102,8 +96,7 @@ static void DrawSkyPolygon (int nump, vec3_t vecs) } // project new texture coords - for (i=0 ; i<nump ; i++, vecs+=3) - { + for (i = 0; i < nump; i++, vecs += 3) { j = vec_to_st[axis][2]; if (j > 0) dv = vecs[j - 1]; @@ -113,14 +106,14 @@ static void DrawSkyPolygon (int nump, vec3_t vecs) continue; // don't divide by zero j = vec_to_st[axis][0]; if (j < 0) - s = -vecs[-j -1] / dv; + s = -vecs[-j - 1] / dv; else - s = vecs[j-1] / dv; + s = vecs[j - 1] / dv; j = vec_to_st[axis][1]; if (j < 0) - t = -vecs[-j -1] / dv; + t = -vecs[-j - 1] / dv; else - t = vecs[j-1] / dv; + t = vecs[j - 1] / dv; if (s < skymins[0][axis]) skymins[0][axis] = s; @@ -140,7 +133,7 @@ static void DrawSkyPolygon (int nump, vec3_t vecs) #define SIDE_BACK 1 #define SIDE_ON 2 -static void ClipSkyPolygon (int nump, vec3_t vecs, int stage) +static void ClipSkyPolygon(int nump, vec3_t vecs, int stage) { const float *norm; float *v; @@ -152,73 +145,65 @@ static void ClipSkyPolygon (int nump, vec3_t vecs, int stage) int newc[2]; int i, j; - if (nump > MAX_CLIP_VERTS-2) - Com_Error( ERR_DROP, "ClipSkyPolygon: MAX_CLIP_VERTS"); - if (stage == 6) - { // fully clipped, so draw it - DrawSkyPolygon (nump, vecs); + if (nump > MAX_CLIP_VERTS - 2) + Com_Error(ERR_DROP, "ClipSkyPolygon: MAX_CLIP_VERTS"); + if (stage == 6) { + // fully clipped, so draw it + DrawSkyPolygon(nump, vecs); return; } front = back = qfalse; norm = skyclip[stage]; - for (i=0, v = vecs ; i<nump ; i++, v+=3) - { - d = DotProduct (v, norm); - if (d > ON_EPSILON) - { + for (i = 0, v = vecs; i < nump; i++, v += 3) { + d = DotProduct(v, norm); + if (d > ON_EPSILON) { front = qtrue; sides[i] = SIDE_FRONT; - } - else if (d < -ON_EPSILON) - { + } else if (d < -ON_EPSILON) { back = qtrue; sides[i] = SIDE_BACK; - } - else + } else sides[i] = SIDE_ON; dists[i] = d; } - if (!front || !back) - { // not clipped - ClipSkyPolygon (nump, vecs, stage+1); + if (!front || !back) { + // not clipped + ClipSkyPolygon(nump, vecs, stage + 1); return; } // clip it sides[i] = sides[0]; dists[i] = dists[0]; - VectorCopy (vecs, (vecs+(i*3)) ); + VectorCopy(vecs, (vecs + (i * 3))); newc[0] = newc[1] = 0; - for (i=0, v = vecs ; i<nump ; i++, v+=3) - { - switch (sides[i]) - { + for (i = 0, v = vecs; i < nump; i++, v += 3) { + switch (sides[i]) { case SIDE_FRONT: - VectorCopy (v, newv[0][newc[0]]); + VectorCopy(v, newv[0][newc[0]]); newc[0]++; break; case SIDE_BACK: - VectorCopy (v, newv[1][newc[1]]); + VectorCopy(v, newv[1][newc[1]]); newc[1]++; break; case SIDE_ON: - VectorCopy (v, newv[0][newc[0]]); + VectorCopy(v, newv[0][newc[0]]); newc[0]++; - VectorCopy (v, newv[1][newc[1]]); + VectorCopy(v, newv[1][newc[1]]); newc[1]++; break; } - if (sides[i] == SIDE_ON || sides[i+1] == SIDE_ON || sides[i+1] == sides[i]) + if (sides[i] == SIDE_ON || sides[i + 1] == SIDE_ON || sides[i + 1] == sides[i]) continue; - d = dists[i] / (dists[i] - dists[i+1]); - for (j=0 ; j<3 ; j++) - { - e = v[j] + d*(v[j+3] - v[j]); + d = dists[i] / (dists[i] - dists[i + 1]); + for (j = 0; j < 3; j++) { + e = v[j] + d * (v[j + 3] - v[j]); newv[0][newc[0]][j] = e; newv[1][newc[1]][j] = e; } @@ -227,8 +212,8 @@ static void ClipSkyPolygon (int nump, vec3_t vecs, int stage) } // continue - ClipSkyPolygon (newc[0], newv[0][0], stage+1); - ClipSkyPolygon (newc[1], newv[1][0], stage+1); + ClipSkyPolygon(newc[0], newv[0][0], stage + 1); + ClipSkyPolygon(newc[1], newv[1][0], stage + 1); } /* @@ -236,25 +221,26 @@ static void ClipSkyPolygon (int nump, vec3_t vecs, int stage) R_AddSkySurface ================= */ -void R_AddSkySurface( mface_t *fa ) { +void R_AddSkySurface(mface_t *fa) +{ int i; vec3_t verts[MAX_CLIP_VERTS]; msurfedge_t *surfedge; mvertex_t *vert; medge_t *edge; - if( fa->numsurfedges > MAX_CLIP_VERTS ) { - Com_Error( ERR_DROP, "%s: too many verts", __func__ ); + if (fa->numsurfedges > MAX_CLIP_VERTS) { + Com_Error(ERR_DROP, "%s: too many verts", __func__); } // calculate vertex values for sky box surfedge = fa->firstsurfedge; - for( i = 0; i < fa->numsurfedges; i++, surfedge++ ) { + for (i = 0; i < fa->numsurfedges; i++, surfedge++) { edge = surfedge->edge; vert = edge->v[surfedge->vert]; - VectorSubtract (vert->point, glr.fd.vieworg, verts[i]); + VectorSubtract(vert->point, glr.fd.vieworg, verts[i]); } - ClipSkyPolygon (fa->numsurfedges, verts[0], 0); + ClipSkyPolygon(fa->numsurfedges, verts[0], 0); } @@ -263,28 +249,27 @@ void R_AddSkySurface( mface_t *fa ) { R_ClearSkyBox ============== */ -void R_ClearSkyBox( void ) { +void R_ClearSkyBox(void) +{ int i; - for (i=0 ; i<6 ; i++) - { + for (i = 0; i < 6; i++) { skymins[0][i] = skymins[1][i] = 9999; skymaxs[0][i] = skymaxs[1][i] = -9999; } } -static void MakeSkyVec (float s, float t, int axis, vec_t *v) +static void MakeSkyVec(float s, float t, int axis, vec_t *v) { vec3_t b; int j, k; - b[0] = s*4800;//2300; - b[1] = t*4800;//2300; - b[2] = 4800;//2300; + b[0] = s * 4800; //2300; + b[1] = t * 4800; //2300; + b[2] = 4800; //2300; - for (j=0 ; j<3 ; j++) - { + for (j = 0; j < 3; j++) { k = st_to_vec[axis][j]; if (k < 0) v[j] = -b[-k - 1]; @@ -293,8 +278,8 @@ static void MakeSkyVec (float s, float t, int axis, vec_t *v) } // avoid bilerp seam - s = (s+1)*0.5; - t = (t+1)*0.5; + s = (s + 1) * 0.5; + t = (t + 1) * 0.5; if (s < sky_min) s = sky_min; @@ -309,23 +294,24 @@ static void MakeSkyVec (float s, float t, int axis, vec_t *v) v[4] = 1.0 - t; } -#define SKY_VISIBLE( side ) \ - ( skymins[0][side] < skymaxs[0][side] && \ - skymins[1][side] < skymaxs[1][side] ) +#define SKY_VISIBLE(side) \ + (skymins[0][side] < skymaxs[0][side] && \ + skymins[1][side] < skymaxs[1][side]) /* ============== R_DrawSkyBox ============== */ -void R_DrawSkyBox( void ) { - static const int skytexorder[6] = {0,2,1,3,4,5}; +void R_DrawSkyBox(void) +{ + static const int skytexorder[6] = {0, 2, 1, 3, 4, 5}; vec5_t verts[4]; int i; - if( skyrotate ) { + if (skyrotate) { // hack, forces full sky to draw when rotating - for( i = 0; i < 6; i++ ) { + for (i = 0; i < 6; i++) { skymins[0][i] = -1; skymins[1][i] = -1; skymaxs[0][i] = 1; @@ -333,50 +319,51 @@ void R_DrawSkyBox( void ) { } } else { // check for no sky at all - for( i = 0; i < 6; i++ ) { - if( SKY_VISIBLE( i ) ) { + for (i = 0; i < 6; i++) { + if (SKY_VISIBLE(i)) { break; } } - if( i == 6 ) { + if (i == 6) { return; // nothing visible } } - qglPushMatrix (); - qglTranslatef (glr.fd.vieworg[0], glr.fd.vieworg[1], glr.fd.vieworg[2]); - if( skyrotate ) { - qglRotatef (glr.fd.time * skyrotate, skyaxis[0], skyaxis[1], skyaxis[2]); + qglPushMatrix(); + qglTranslatef(glr.fd.vieworg[0], glr.fd.vieworg[1], glr.fd.vieworg[2]); + if (skyrotate) { + qglRotatef(glr.fd.time * skyrotate, skyaxis[0], skyaxis[1], skyaxis[2]); } - GL_TexEnv( GL_REPLACE ); - GL_Bits( GLS_DEFAULT ); + GL_TexEnv(GL_REPLACE); + GL_Bits(GLS_DEFAULT); - qglVertexPointer( 3, GL_FLOAT, 5*4, &verts[0][0] ); - qglTexCoordPointer( 2, GL_FLOAT, 5*4, &verts[0][3] ); + qglVertexPointer(3, GL_FLOAT, 5 * 4, &verts[0][0]); + qglTexCoordPointer(2, GL_FLOAT, 5 * 4, &verts[0][3]); - for( i = 0; i < 6; i++ ) { - if( !SKY_VISIBLE( i ) ) { + for (i = 0; i < 6; i++) { + if (!SKY_VISIBLE(i)) { continue; } - GL_BindTexture (sky_images[skytexorder[i]]); + GL_BindTexture(sky_images[skytexorder[i]]); - MakeSkyVec (skymaxs[0][i], skymins[1][i], i, verts[0]); - MakeSkyVec (skymins[0][i], skymins[1][i], i, verts[1]); - MakeSkyVec (skymaxs[0][i], skymaxs[1][i], i, verts[2]); - MakeSkyVec (skymins[0][i], skymaxs[1][i], i, verts[3]); - qglDrawArrays( GL_TRIANGLE_STRIP, 0, 4 ); + MakeSkyVec(skymaxs[0][i], skymins[1][i], i, verts[0]); + MakeSkyVec(skymins[0][i], skymins[1][i], i, verts[1]); + MakeSkyVec(skymaxs[0][i], skymaxs[1][i], i, verts[2]); + MakeSkyVec(skymins[0][i], skymaxs[1][i], i, verts[3]); + qglDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } - qglPopMatrix (); + qglPopMatrix(); } -static void R_UnsetSky( void ) { +static void R_UnsetSky(void) +{ int i; skyrotate = 0; - for( i = 0; i < 6; i++ ) { + for (i = 0; i < 6; i++) { sky_images[i] = TEXNUM_BLACK; } } @@ -386,7 +373,8 @@ static void R_UnsetSky( void ) { R_SetSky ============ */ -void R_SetSky( const char *name, float rotate, vec3_t axis ) { +void R_SetSky(const char *name, float rotate, vec3_t axis) +{ int i; char pathname[MAX_QPATH]; image_t *image; @@ -394,24 +382,24 @@ void R_SetSky( const char *name, float rotate, vec3_t axis ) { // 3dstudio environment map names static const char suf[6][3] = { "rt", "bk", "lf", "ft", "up", "dn" }; - if( !gl_drawsky->integer ) { + if (!gl_drawsky->integer) { R_UnsetSky(); return; } skyrotate = rotate; - VectorCopy (axis, skyaxis); + VectorCopy(axis, skyaxis); - for( i = 0; i < 6; i++ ) { - len = Q_concat( pathname, sizeof( pathname ), - "env/", name, suf[i], ".tga", NULL ); - if( len >= sizeof( pathname ) ) { + for (i = 0; i < 6; i++) { + len = Q_concat(pathname, sizeof(pathname), + "env/", name, suf[i], ".tga", NULL); + if (len >= sizeof(pathname)) { R_UnsetSky(); return; } - FS_NormalizePath( pathname, pathname ); - image = IMG_Find( pathname, it_sky ); - if( image->texnum == TEXNUM_DEFAULT ) { + FS_NormalizePath(pathname, pathname); + image = IMG_Find(pathname, it_sky); + if (image->texnum == TEXNUM_DEFAULT) { R_UnsetSky(); return; } |