1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc. 3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or 5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License 6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2 7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version. 8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful, 10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of 11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details. 14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License 16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software 17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 20cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// gl_warp.c -- sky and water polygons 21cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 22cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include "quakedef.h" 23cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichextern model_t *loadmodel; 25cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 26cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//int skytexturenum; 27cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 28cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint solidskytexture; 29cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint alphaskytexture; 30cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfloat speedscale; // for top sky and bottom sky 31cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 32cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmsurface_t *warpface; 33cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 34cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichextern cvar_t gl_subdivide_size; 35cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 36cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid BoundPoly (int numverts, float *verts, vec3_t mins, vec3_t maxs) 37cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 38cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, j; 39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *v; 40cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mins[0] = mins[1] = mins[2] = 9999; 42cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich maxs[0] = maxs[1] = maxs[2] = -9999; 43cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich v = verts; 44cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<numverts ; i++) 45cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++, v++) 46cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 47cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (*v < mins[j]) 48cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mins[j] = *v; 49cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (*v > maxs[j]) 50cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich maxs[j] = *v; 51cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 52cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 53cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 54cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid SubdividePolygon (int numverts, float *verts) 55cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 56cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, j, k; 57cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t mins, maxs; 58cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float m; 59cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *v; 60cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t front[64], back[64]; 61cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int f, b; 62cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float dist[64]; 63cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float frac; 64cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glpoly_t *poly; 65cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float s, t; 66cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 67cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (numverts > 60) 68cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("numverts = %i", numverts); 69cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 70cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich BoundPoly (numverts, verts, mins, maxs); 71cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 72cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<3 ; i++) 73cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 74cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich m = (mins[i] + maxs[i]) * 0.5; 75cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich m = gl_subdivide_size.value * floor (m/gl_subdivide_size.value + 0.5); 76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (maxs[i] - m < 8) 77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (m - mins[i] < 8) 79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 80cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 81cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // cut it 82cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich v = verts + i; 83cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<numverts ; j++, v+= 3) 84cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dist[j] = *v - m; 85cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 86cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // wrap cases 87cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dist[j] = dist[0]; 88cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich v-=i; 89cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (verts, v); 90cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 91cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich f = b = 0; 92cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich v = verts; 93cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<numverts ; j++, v+= 3) 94cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 95cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (dist[j] >= 0) 96cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 97cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (v, front[f]); 98cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich f++; 99cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (dist[j] <= 0) 101cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 102cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (v, back[b]); 103cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich b++; 104cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 105cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (dist[j] == 0 || dist[j+1] == 0) 106cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 107cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if ( (dist[j] > 0) != (dist[j+1] > 0) ) 108cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 109cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // clip point 110cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich frac = dist[j] / (dist[j] - dist[j+1]); 111cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (k=0 ; k<3 ; k++) 112cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich front[f][k] = back[b][k] = v[k] + frac*(v[3+k] - v[k]); 113cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich f++; 114cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich b++; 115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 116cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 117cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 118cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SubdividePolygon (f, front[0]); 119cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SubdividePolygon (b, back[0]); 120cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 121cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 122cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 123cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich poly = (glpoly_t*) Hunk_Alloc (sizeof(glpoly_t) + (numverts-4) * VERTEXSIZE*sizeof(float)); 124cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich poly->next = warpface->polys; 125cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich warpface->polys = poly; 126cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich poly->numverts = numverts; 127cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<numverts ; i++, verts+= 3) 128cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 129cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (verts, poly->verts[i]); 130cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = DotProduct (verts, warpface->texinfo->vecs[0]); 131cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t = DotProduct (verts, warpface->texinfo->vecs[1]); 132cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich poly->verts[i][3] = s; 133cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich poly->verts[i][4] = t; 134cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 135cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 136cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 137cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 138cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================ 139cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichGL_SubdivideSurface 140cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 141cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichBreaks a polygon up along axial 64 unit 142cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichboundaries so that turbulent and sky warps 143cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcan be done reasonably. 144cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================ 145cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 146cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid GL_SubdivideSurface (msurface_t *fa) 147cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 148cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t verts[64]; 149cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int numverts; 150cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 151cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int lindex; 152cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *vec; 153cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich texture_t *t; 154cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 155cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich warpface = fa; 156cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 157cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // 158cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // convert edges back to a normal polygon 159cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // 160cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich numverts = 0; 161cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<fa->numedges ; i++) 162cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 163cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich lindex = loadmodel->surfedges[fa->firstedge + i]; 164cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 165cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (lindex > 0) 166cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec = loadmodel->vertexes[loadmodel->edges[lindex].v[0]].position; 167cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 168cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec = loadmodel->vertexes[loadmodel->edges[-lindex].v[1]].position; 169cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (vec, verts[numverts]); 170cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich numverts++; 171cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 172cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 173cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich SubdividePolygon (numverts, verts[0]); 174cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 175cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 176cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//========================================================= 177cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 178cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 179cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 180cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// speed up sin calculations - Ed 181cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfloat turbsin[] = 182cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 183cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich #include "gl_warp_sin.h" 184cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}; 185cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define TURBSCALE (256.0 / (2 * M_PI)) 186cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 187cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 188cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============= 189cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichEmitWaterPolys 190cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 191cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichDoes a water warp on the pre-fragmented glpoly_t chain 192cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============= 193cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 194cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid EmitWaterPolys (msurface_t *fa) 195cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 196cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glpoly_t *p; 197cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *v; 198cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 199cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float s, t, os, ot; 200cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 201cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 202cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (p=fa->polys ; p ; p=p->next) 203cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 204cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef USE_OPENGLES 205cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 206cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float* pUV = gTexCoordBuffer; 207cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0,v=p->verts[0] ; i<p->numverts ; i++, v+=VERTEXSIZE) 208cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 209cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich os = v[3]; 210cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ot = v[4]; 211cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 212cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = os + turbsin[(int)((ot*0.125+realtime) * TURBSCALE) & 255]; 213cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s *= (1.0/64); 214cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 215cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t = ot + turbsin[(int)((os*0.125+realtime) * TURBSCALE) & 255]; 216cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t *= (1.0/64); 217cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 218cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pUV++ = s; 219cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pUV++ = t; 220cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 221cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 222cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 223cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glVertexPointer(3, GL_FLOAT, VERTEXSIZE*sizeof(float), &p->verts[0][0]); 224cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexCoordPointer(2, GL_FLOAT, 0, gTexCoordBuffer); 225cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glDrawArrays(GL_TRIANGLE_FAN, 0, p->numverts); 226cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else 227cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glBegin (GL_POLYGON); 228cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0,v=p->verts[0] ; i<p->numverts ; i++, v+=VERTEXSIZE) 229cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 230cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich os = v[3]; 231cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ot = v[4]; 232cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 233cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = os + turbsin[(int)((ot*0.125+realtime) * TURBSCALE) & 255]; 234cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s *= (1.0/64); 235cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 236cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t = ot + turbsin[(int)((os*0.125+realtime) * TURBSCALE) & 255]; 237cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t *= (1.0/64); 238cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 239cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexCoord2f (s, t); 240cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glVertex3fv (v); 241cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 242cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glEnd (); 243cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 244cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 245cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 246cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 247cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 248cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 249cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 250cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 251cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============= 252cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichEmitSkyPolys 253cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============= 254cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 255cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid EmitSkyPolys (msurface_t *fa) 256cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 257cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glpoly_t *p; 258cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *v; 259cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 260cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float s, t; 261cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t dir; 262cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float length; 263cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 264cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (p=fa->polys ; p ; p=p->next) 265cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 266cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef USE_OPENGLES 267cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 268cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float* pUV = gTexCoordBuffer; 269cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0,v=p->verts[0] ; i<p->numverts ; i++, v+=VERTEXSIZE) 270cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 271cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorSubtract (v, r_origin, dir); 272cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir[2] *= 3; // flatten the sphere 273cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 274cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich length = dir[0]*dir[0] + dir[1]*dir[1] + dir[2]*dir[2]; 275cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich length = sqrt (length); 276cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich length = 6*63/length; 277cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 278cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir[0] *= length; 279cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir[1] *= length; 280cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 281cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = (speedscale + dir[0]) * (1.0/128); 282cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t = (speedscale + dir[1]) * (1.0/128); 283cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 284cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pUV++ = s; 285cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pUV++ = t; 286cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 287cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 288cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 289cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glVertexPointer(3, GL_FLOAT, VERTEXSIZE*sizeof(float), &p->verts[0][0]); 290cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexCoordPointer(2, GL_FLOAT, 0, gTexCoordBuffer); 291cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glDrawArrays(GL_TRIANGLE_FAN, 0, p->numverts); 292cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#else 293cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glBegin (GL_POLYGON); 294cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0,v=p->verts[0] ; i<p->numverts ; i++, v+=VERTEXSIZE) 295cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 296cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorSubtract (v, r_origin, dir); 297cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir[2] *= 3; // flatten the sphere 298cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 299cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich length = dir[0]*dir[0] + dir[1]*dir[1] + dir[2]*dir[2]; 300cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich length = sqrt (length); 301cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich length = 6*63/length; 302cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 303cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir[0] *= length; 304cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dir[1] *= length; 305cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 306cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = (speedscale + dir[0]) * (1.0/128); 307cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t = (speedscale + dir[1]) * (1.0/128); 308cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 309cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexCoord2f (s, t); 310cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glVertex3fv (v); 311cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 312cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glEnd (); 313cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 314cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 315cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 316cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 317cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 318cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 319cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichEmitBothSkyLayers 320cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 321cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichDoes a sky warp on the pre-fragmented glpoly_t chain 322cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis will be called for brushmodels, the world 323cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichwill have them chained together. 324cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 325cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 326cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid EmitBothSkyLayers (msurface_t *fa) 327cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 328cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 329cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int lindex; 330cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *vec; 331cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 332cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich GL_DisableMultitexture(); 333cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 334cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich GL_Bind (solidskytexture); 335cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich speedscale = realtime*8; 336cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich speedscale -= (int)speedscale & ~127 ; 337cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 338cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich EmitSkyPolys (fa); 339cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 340cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glEnable (GL_BLEND); 341cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich GL_Bind (alphaskytexture); 342cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich speedscale = realtime*16; 343cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich speedscale -= (int)speedscale & ~127 ; 344cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 345cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich EmitSkyPolys (fa); 346cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 347cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glDisable (GL_BLEND); 348cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 349cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 350cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifndef QUAKE2 351cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 352cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 353cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_DrawSkyChain 354cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 355cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 356cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_DrawSkyChain (msurface_t *s) 357cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 358cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich msurface_t *fa; 359cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 360cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich GL_DisableMultitexture(); 361cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 362cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // used when gl_texsort is on 363cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich GL_Bind(solidskytexture); 364cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich speedscale = realtime*8; 365cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich speedscale -= (int)speedscale & ~127 ; 366cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 367cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (fa=s ; fa ; fa=fa->texturechain) 368cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich EmitSkyPolys (fa); 369cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 370cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glEnable (GL_BLEND); 371cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich GL_Bind (alphaskytexture); 372cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich speedscale = realtime*16; 373cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich speedscale -= (int)speedscale & ~127 ; 374cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 375cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (fa=s ; fa ; fa=fa->texturechain) 376cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich EmitSkyPolys (fa); 377cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 378cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glDisable (GL_BLEND); 379cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 380cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 381cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 382cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 383cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 384cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================================================================= 385cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 386cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Quake 2 environment sky 387cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 388cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================================================================= 389cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 390cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 391cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#ifdef QUAKE2 392cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 393cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 394cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define SKY_TEX 2000 395cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 396cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 397cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================================================================= 398cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 399cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich PCX Loading 400cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 401cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================================================================= 402cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 403cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 404cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct 405cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 406cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char manufacturer; 407cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char version; 408cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char encoding; 409cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char bits_per_pixel; 410cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned short xmin,ymin,xmax,ymax; 411cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned short hres,vres; 412cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned char palette[48]; 413cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char reserved; 414cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char color_planes; 415cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned short bytes_per_line; 416cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned short palette_type; 417cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char filler[58]; 418cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned data; // unbounded 419cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} pcx_t; 420cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 421cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbyte *pcx_rgb; 422cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 423cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 424cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 425cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichLoadPCX 426cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 427cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 428cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid LoadPCX (FILE *f) 429cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 430cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pcx_t *pcx, pcxbuf; 431cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich byte palette[768]; 432cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich byte *pix; 433cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int x, y; 434cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int dataByte, runLength; 435cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int count; 436cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 437cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// 438cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// parse the PCX file 439cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// 440cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich fread (&pcxbuf, 1, sizeof(pcxbuf), f); 441cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 442cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pcx = &pcxbuf; 443cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 444cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (pcx->manufacturer != 0x0a 445cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich || pcx->version != 5 446cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich || pcx->encoding != 1 447cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich || pcx->bits_per_pixel != 8 448cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich || pcx->xmax >= 320 449cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich || pcx->ymax >= 256) 450cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 451cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("Bad pcx file\n"); 452cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 453cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 454cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 455cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // seek to palette 456cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich fseek (f, -768, SEEK_END); 457cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich fread (palette, 1, 768, f); 458cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 459cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich fseek (f, sizeof(pcxbuf) - 4, SEEK_SET); 460cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 461cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich count = (pcx->xmax+1) * (pcx->ymax+1); 462cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pcx_rgb = malloc( count * 4); 463cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 464cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (y=0 ; y<=pcx->ymax ; y++) 465cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 466cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pix = pcx_rgb + 4*y*(pcx->xmax+1); 467cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (x=0 ; x<=pcx->ymax ; ) 468cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 469cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dataByte = fgetc(f); 470cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 471cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if((dataByte & 0xC0) == 0xC0) 472cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 473cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich runLength = dataByte & 0x3F; 474cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dataByte = fgetc(f); 475cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 476cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 477cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich runLength = 1; 478cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 479cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich while(runLength-- > 0) 480cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 481cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pix[0] = palette[dataByte*3]; 482cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pix[1] = palette[dataByte*3+1]; 483cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pix[2] = palette[dataByte*3+2]; 484cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pix[3] = 255; 485cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pix += 4; 486cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich x++; 487cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 488cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 489cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 490cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 491cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 492cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 493cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich========================================================= 494cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 495cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichTARGA LOADING 496cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 497cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich========================================================= 498cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 499cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 500cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct _TargaHeader { 501cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned char id_length, colormap_type, image_type; 502cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned short colormap_index, colormap_length; 503cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned char colormap_size; 504cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned short x_origin, y_origin, width, height; 505cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned char pixel_size, attributes; 506cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} TargaHeader; 507cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 508cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 509cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichTargaHeader targa_header; 510cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbyte *targa_rgba; 511cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 512cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint fgetLittleShort (FILE *f) 513cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 514cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich byte b1, b2; 515cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 516cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich b1 = fgetc(f); 517cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich b2 = fgetc(f); 518cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 519cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return (short)(b1 + b2*256); 520cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 521cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 522cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint fgetLittleLong (FILE *f) 523cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 524cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich byte b1, b2, b3, b4; 525cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 526cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich b1 = fgetc(f); 527cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich b2 = fgetc(f); 528cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich b3 = fgetc(f); 529cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich b4 = fgetc(f); 530cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 531cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return b1 + (b2<<8) + (b3<<16) + (b4<<24); 532cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 533cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 534cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 535cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 536cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============= 537cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichLoadTGA 538cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============= 539cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 540cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid LoadTGA (FILE *fin) 541cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 542cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int columns, rows, numPixels; 543cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich byte *pixbuf; 544cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int row, column; 545cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 546cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich targa_header.id_length = fgetc(fin); 547cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich targa_header.colormap_type = fgetc(fin); 548cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich targa_header.image_type = fgetc(fin); 549cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 550cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich targa_header.colormap_index = fgetLittleShort(fin); 551cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich targa_header.colormap_length = fgetLittleShort(fin); 552cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich targa_header.colormap_size = fgetc(fin); 553cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich targa_header.x_origin = fgetLittleShort(fin); 554cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich targa_header.y_origin = fgetLittleShort(fin); 555cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich targa_header.width = fgetLittleShort(fin); 556cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich targa_header.height = fgetLittleShort(fin); 557cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich targa_header.pixel_size = fgetc(fin); 558cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich targa_header.attributes = fgetc(fin); 559cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 560cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (targa_header.image_type!=2 561cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich && targa_header.image_type!=10) 562cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("LoadTGA: Only type 2 and 10 targa RGB images supported\n"); 563cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 564cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (targa_header.colormap_type !=0 565cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich || (targa_header.pixel_size!=32 && targa_header.pixel_size!=24)) 566cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("Texture_LoadTGA: Only 32 or 24 bit images supported (no colormaps)\n"); 567cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 568cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich columns = targa_header.width; 569cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich rows = targa_header.height; 570cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich numPixels = columns * rows; 571cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 572cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich targa_rgba = malloc (numPixels*4); 573cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 574cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (targa_header.id_length != 0) 575cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich fseek(fin, targa_header.id_length, SEEK_CUR); // skip TARGA image comment 576cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 577cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (targa_header.image_type==2) { // Uncompressed, RGB images 578cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for(row=rows-1; row>=0; row--) { 579cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pixbuf = targa_rgba + row*columns*4; 580cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for(column=0; column<columns; column++) { 581cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned char red,green,blue,alphabyte; 582cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich switch (targa_header.pixel_size) { 583cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case 24: 584cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 585cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich blue = getc(fin); 586cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich green = getc(fin); 587cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich red = getc(fin); 588cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++ = red; 589cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++ = green; 590cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++ = blue; 591cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++ = 255; 592cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 593cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case 32: 594cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich blue = getc(fin); 595cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich green = getc(fin); 596cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich red = getc(fin); 597cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich alphabyte = getc(fin); 598cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++ = red; 599cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++ = green; 600cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++ = blue; 601cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++ = alphabyte; 602cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 603cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 604cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 605cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 606cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 607cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else if (targa_header.image_type==10) { // Runlength encoded RGB images 608cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned char red,green,blue,alphabyte,packetHeader,packetSize,j; 609cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for(row=rows-1; row>=0; row--) { 610cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pixbuf = targa_rgba + row*columns*4; 611cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for(column=0; column<columns; ) { 612cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich packetHeader=getc(fin); 613cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich packetSize = 1 + (packetHeader & 0x7f); 614cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (packetHeader & 0x80) { // run-length packet 615cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich switch (targa_header.pixel_size) { 616cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case 24: 617cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich blue = getc(fin); 618cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich green = getc(fin); 619cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich red = getc(fin); 620cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich alphabyte = 255; 621cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 622cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case 32: 623cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich blue = getc(fin); 624cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich green = getc(fin); 625cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich red = getc(fin); 626cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich alphabyte = getc(fin); 627cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 628cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 629cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 630cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for(j=0;j<packetSize;j++) { 631cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++=red; 632cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++=green; 633cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++=blue; 634cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++=alphabyte; 635cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich column++; 636cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (column==columns) { // run spans across rows 637cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich column=0; 638cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (row>0) 639cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich row--; 640cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 641cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich goto breakOut; 642cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pixbuf = targa_rgba + row*columns*4; 643cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 644cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 645cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 646cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else { // non run-length packet 647cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for(j=0;j<packetSize;j++) { 648cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich switch (targa_header.pixel_size) { 649cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case 24: 650cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich blue = getc(fin); 651cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich green = getc(fin); 652cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich red = getc(fin); 653cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++ = red; 654cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++ = green; 655cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++ = blue; 656cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++ = 255; 657cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 658cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case 32: 659cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich blue = getc(fin); 660cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich green = getc(fin); 661cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich red = getc(fin); 662cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich alphabyte = getc(fin); 663cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++ = red; 664cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++ = green; 665cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++ = blue; 666cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *pixbuf++ = alphabyte; 667cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 668cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 669cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich column++; 670cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (column==columns) { // pixel packet run spans across rows 671cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich column=0; 672cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (row>0) 673cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich row--; 674cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 675cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich goto breakOut; 676cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich pixbuf = targa_rgba + row*columns*4; 677cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 678cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 679cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 680cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 681cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich breakOut:; 682cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 683cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 684cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 685cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich fclose(fin); 686cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 687cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 688cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 689cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================== 690cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_LoadSkys 691cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================== 692cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 693cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichchar *suf[6] = {"rt", "bk", "lf", "ft", "up", "dn"}; 694cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_LoadSkys (void) 695cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 696cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 697cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich FILE *f; 698cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char name[64]; 699cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 700cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<6 ; i++) 701cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 702cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich GL_Bind (SKY_TEX + i); 703cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sprintf (name, "gfx/env/bkgtst%s.tga", suf[i]); 704cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich COM_FOpenFile (name, &f); 705cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!f) 706cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 707cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Con_Printf ("Couldn't load %s\n", name); 708cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 709cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 710cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich LoadTGA (f); 711cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// LoadPCX (f); 712cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 713cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexImage2DHelper (GL_TEXTURE_2D, 0, gl_solid_format, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, targa_rgba); 714cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// glTexImage2DHelper (GL_TEXTURE_2D, 0, gl_solid_format, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, pcx_rgb); 715cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 716cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich free (targa_rgba); 717cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// free (pcx_rgb); 718cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 719cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 720cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 721cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 722cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 723cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 724cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 725cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvec3_t skyclip[6] = { 726cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {1,1,0}, 727cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {1,-1,0}, 728cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {0,-1,1}, 729cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {0,1,1}, 730cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {1,0,1}, 731cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {-1,0,1} 732cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}; 733cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint c_sky; 734cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 735cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// 1 = s, 2 = t, 3 = 2048 736cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint st_to_vec[6][3] = 737cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 738cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {3,-1,2}, 739cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {-3,1,2}, 740cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 741cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {1,3,2}, 742cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {-1,-3,2}, 743cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 744cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {-2,-1,3}, // 0 degrees yaw, look straight up 745cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {2,-1,-3} // look straight down 746cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 747cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// {-1,2,3}, 748cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// {1,2,-3} 749cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}; 750cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 751cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// s = [0]/[2], t = [1]/[2] 752cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint vec_to_st[6][3] = 753cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 754cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {-2,3,1}, 755cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {2,3,-1}, 756cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 757cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {1,3,2}, 758cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {-1,3,-2}, 759cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 760cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {-2,-1,3}, 761cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich {-2,1,-3} 762cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 763cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// {-1,2,3}, 764cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// {1,2,-3} 765cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}; 766cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 767cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfloat skymins[2][6], skymaxs[2][6]; 768cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 769cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid DrawSkyPolygon (int nump, vec3_t vecs) 770cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 771cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i,j; 772cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t v, av; 773cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float s, t, dv; 774cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int axis; 775cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *vp; 776cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 777cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich c_sky++; 778cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#if 0 779cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichglBegin (GL_POLYGON); 780cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfor (i=0 ; i<nump ; i++, vecs+=3) 781cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 782cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorAdd(vecs, r_origin, v); 783cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glVertex3fv (v); 784cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 785cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichglEnd(); 786cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichreturn; 787cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 788cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // decide which face it maps to 789cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (vec3_origin, v); 790cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0, vp=vecs ; i<nump ; i++, vp+=3) 791cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 792cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorAdd (vp, v, v); 793cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 794cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich av[0] = fabs(v[0]); 795cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich av[1] = fabs(v[1]); 796cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich av[2] = fabs(v[2]); 797cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (av[0] > av[1] && av[0] > av[2]) 798cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 799cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (v[0] < 0) 800cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich axis = 1; 801cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 802cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich axis = 0; 803cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 804cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else if (av[1] > av[2] && av[1] > av[0]) 805cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 806cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (v[1] < 0) 807cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich axis = 3; 808cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 809cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich axis = 2; 810cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 811cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 812cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 813cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (v[2] < 0) 814cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich axis = 5; 815cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 816cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich axis = 4; 817cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 818cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 819cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // project new texture coords 820cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<nump ; i++, vecs+=3) 821cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 822cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich j = vec_to_st[axis][2]; 823cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (j > 0) 824cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dv = vecs[j - 1]; 825cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 826cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dv = -vecs[-j - 1]; 827cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 828cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich j = vec_to_st[axis][0]; 829cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (j < 0) 830cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = -vecs[-j -1] / dv; 831cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 832cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = vecs[j-1] / dv; 833cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich j = vec_to_st[axis][1]; 834cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (j < 0) 835cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t = -vecs[-j -1] / dv; 836cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 837cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t = vecs[j-1] / dv; 838cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 839cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (s < skymins[0][axis]) 840cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich skymins[0][axis] = s; 841cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (t < skymins[1][axis]) 842cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich skymins[1][axis] = t; 843cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (s > skymaxs[0][axis]) 844cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich skymaxs[0][axis] = s; 845cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (t > skymaxs[1][axis]) 846cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich skymaxs[1][axis] = t; 847cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 848cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 849cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 850cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define MAX_CLIP_VERTS 64 851cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid ClipSkyPolygon (int nump, vec3_t vecs, int stage) 852cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 853cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *norm; 854cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float *v; 855cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich qboolean front, back; 856cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float d, e; 857cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float dists[MAX_CLIP_VERTS]; 858cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int sides[MAX_CLIP_VERTS]; 859cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t newv[2][MAX_CLIP_VERTS]; 860cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int newc[2]; 861cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, j; 862cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 863cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (nump > MAX_CLIP_VERTS-2) 864cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("ClipSkyPolygon: MAX_CLIP_VERTS"); 865cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (stage == 6) 866cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { // fully clipped, so draw it 867cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich DrawSkyPolygon (nump, vecs); 868cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 869cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 870cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 871cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich front = back = false; 872cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich norm = skyclip[stage]; 873cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0, v = vecs ; i<nump ; i++, v+=3) 874cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 875cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich d = DotProduct (v, norm); 876cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (d > ON_EPSILON) 877cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 878cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich front = true; 879cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sides[i] = SIDE_FRONT; 880cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 881cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else if (d < ON_EPSILON) 882cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 883cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich back = true; 884cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sides[i] = SIDE_BACK; 885cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 886cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 887cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sides[i] = SIDE_ON; 888cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dists[i] = d; 889cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 890cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 891cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!front || !back) 892cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { // not clipped 893cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ClipSkyPolygon (nump, vecs, stage+1); 894cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return; 895cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 896cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 897cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // clip it 898cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sides[i] = sides[0]; 899cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dists[i] = dists[0]; 900cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (vecs, (vecs+(i*3)) ); 901cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich newc[0] = newc[1] = 0; 902cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 903cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0, v = vecs ; i<nump ; i++, v+=3) 904cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 905cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich switch (sides[i]) 906cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 907cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case SIDE_FRONT: 908cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (v, newv[0][newc[0]]); 909cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich newc[0]++; 910cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 911cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case SIDE_BACK: 912cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (v, newv[1][newc[1]]); 913cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich newc[1]++; 914cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 915cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case SIDE_ON: 916cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (v, newv[0][newc[0]]); 917cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich newc[0]++; 918cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorCopy (v, newv[1][newc[1]]); 919cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich newc[1]++; 920cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 921cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 922cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 923cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (sides[i] == SIDE_ON || sides[i+1] == SIDE_ON || sides[i+1] == sides[i]) 924cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 925cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 926cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich d = dists[i] / (dists[i] - dists[i+1]); 927cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 928cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 929cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich e = v[j] + d*(v[j+3] - v[j]); 930cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich newv[0][newc[0]][j] = e; 931cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich newv[1][newc[1]][j] = e; 932cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 933cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich newc[0]++; 934cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich newc[1]++; 935cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 936cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 937cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // continue 938cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ClipSkyPolygon (newc[0], newv[0][0], stage+1); 939cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ClipSkyPolygon (newc[1], newv[1][0], stage+1); 940cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 941cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 942cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 943cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 944cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_DrawSkyChain 945cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================= 946cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 947cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_DrawSkyChain (msurface_t *s) 948cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 949cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich msurface_t *fa; 950cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 951cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 952cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t verts[MAX_CLIP_VERTS]; 953cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glpoly_t *p; 954cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 955cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich c_sky = 0; 956cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich GL_Bind(solidskytexture); 957cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 958cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // calculate vertex values for sky box 959cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 960cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (fa=s ; fa ; fa=fa->texturechain) 961cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 962cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (p=fa->polys ; p ; p=p->next) 963cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 964cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<p->numverts ; i++) 965cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 966cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VectorSubtract (p->verts[i], r_origin, verts[i]); 967cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 968cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ClipSkyPolygon (p->numverts, verts[0], 0); 969cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 970cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 971cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 972cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 973cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 974cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 975cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============== 976cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_ClearSkyBox 977cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============== 978cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 979cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_ClearSkyBox (void) 980cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 981cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i; 982cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 983cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<6 ; i++) 984cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 985cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich skymins[0][i] = skymins[1][i] = 9999; 986cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich skymaxs[0][i] = skymaxs[1][i] = -9999; 987cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 988cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 989cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 990cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 991cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid MakeSkyVec (float s, float t, int axis) 992cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 993cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t v, b; 994cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int j, k; 995cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 996cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich b[0] = s*2048; 997cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich b[1] = t*2048; 998cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich b[2] = 2048; 999cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1000cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<3 ; j++) 1001cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1002cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich k = st_to_vec[axis][j]; 1003cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (k < 0) 1004cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich v[j] = -b[-k - 1]; 1005cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 1006cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich v[j] = b[k - 1]; 1007cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich v[j] += r_origin[j]; 1008cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1009cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1010cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // avoid bilerp seam 1011cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = (s+1)*0.5; 1012cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t = (t+1)*0.5; 1013cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1014cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (s < 1.0/512) 1015cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = 1.0/512; 1016cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else if (s > 511.0/512) 1017cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = 511.0/512; 1018cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (t < 1.0/512) 1019cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t = 1.0/512; 1020cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else if (t > 511.0/512) 1021cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t = 511.0/512; 1022cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1023cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t = 1.0 - t; 1024cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexCoord2f (s, t); 1025cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glVertex3fv (v); 1026cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1027cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1028cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 1029cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============== 1030cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_DrawSkyBox 1031cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============== 1032cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 1033cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint skytexorder[6] = {0,2,1,3,4,5}; 1034cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_DrawSkyBox (void) 1035cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1036cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, j, k; 1037cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vec3_t v; 1038cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich float s, t; 1039cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1040cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#if 0 1041cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichglEnable (GL_BLEND); 1042cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichglTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 1043cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichglColor4f (1,1,1,0.5); 1044cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichglDisable (GL_DEPTH_TEST); 1045cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 1046cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<6 ; i++) 1047cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1048cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (skymins[0][i] >= skymaxs[0][i] 1049cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich || skymins[1][i] >= skymaxs[1][i]) 1050cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich continue; 1051cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1052cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich GL_Bind (SKY_TEX+skytexorder[i]); 1053cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#if 0 1054cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichskymins[0][i] = -1; 1055cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichskymins[1][i] = -1; 1056cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichskymaxs[0][i] = 1; 1057cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichskymaxs[1][i] = 1; 1058cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 1059cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glBegin (GL_QUADS); 1060cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MakeSkyVec (skymins[0][i], skymins[1][i], i); 1061cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MakeSkyVec (skymins[0][i], skymaxs[1][i], i); 1062cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MakeSkyVec (skymaxs[0][i], skymaxs[1][i], i); 1063cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich MakeSkyVec (skymaxs[0][i], skymins[1][i], i); 1064cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glEnd (); 1065cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1066cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#if 0 1067cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichglDisable (GL_BLEND); 1068cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichglTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1069cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichglColor4f (1,1,1,0.5); 1070cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichglEnable (GL_DEPTH_TEST); 1071cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 1072cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1073cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1074cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1075cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif 1076cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1077cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//=============================================================== 1078cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1079cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic texture_t* current_sky_mt; 1080cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1081cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 1082cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============= 1083cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichR_InitSky 1084cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1085cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichA sky texture is 256*128, with the right side being a masked overlay 1086cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============== 1087cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 1088cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_InitSky (texture_t *mt) 1089cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1090cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int i, j, p; 1091cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich byte *src; 1092cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned trans[128*128]; 1093cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned transpix; 1094cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int r, g, b; 1095cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich unsigned *rgba; 1096cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // extern int skytexturenum; 1097cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1098cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich current_sky_mt = mt; 1099cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich src = (byte *)mt + mt->offsets[0]; 1101cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1102cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // make an average value for the back to avoid 1103cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // a fringe on the top level 1104cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1105cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich r = g = b = 0; 1106cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<128 ; i++) 1107cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<128 ; j++) 1108cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1109cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p = src[i*256 + j + 128]; 1110cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich rgba = &d_8to24table[p]; 1111cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich trans[(i*128) + j] = *rgba; 1112cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich r += ((byte *)rgba)[0]; 1113cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich g += ((byte *)rgba)[1]; 1114cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich b += ((byte *)rgba)[2]; 1115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1116cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1117cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ((byte *)&transpix)[0] = r/(128*128); 1118cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ((byte *)&transpix)[1] = g/(128*128); 1119cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ((byte *)&transpix)[2] = b/(128*128); 1120cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ((byte *)&transpix)[3] = 0; 1121cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1122cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1123cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!solidskytexture) 1124cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich solidskytexture = texture_extension_number++; 1125cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich GL_Bind (solidskytexture ); 1126cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexImage2DHelper (GL_TEXTURE_2D, 0, gl_solid_format, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, trans); 1127cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 1128cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 1129cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1130cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1131cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (i=0 ; i<128 ; i++) 1132cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for (j=0 ; j<128 ; j++) 1133cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 1134cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich p = src[i*256 + j]; 1135cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (p == 0) 1136cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich trans[(i*128) + j] = transpix; 1137cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else 1138cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich trans[(i*128) + j] = d_8to24table[p]; 1139cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1140cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1141cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!alphaskytexture) 1142cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich alphaskytexture = texture_extension_number++; 1143cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich GL_Bind(alphaskytexture); 1144cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexImage2DHelper (GL_TEXTURE_2D, 0, gl_alpha_format, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, trans); 1145cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 1146cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 1147cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1148cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1149cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid R_ReloadSky() { 1150cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (current_sky_mt) { 1151cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich R_InitSky(current_sky_mt); 1152cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 1153cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 1154