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