mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2024-11-29 15:51:45 +00:00
gl1,gl3,gl4,vk: Parial share of warp code
This commit is contained in:
parent
d47d27ca00
commit
03bfc581e2
15 changed files with 353 additions and 1100 deletions
4
Makefile
4
Makefile
|
@ -1004,6 +1004,7 @@ REFGL1_OBJS_ := \
|
||||||
src/client/refresh/files/pcx.o \
|
src/client/refresh/files/pcx.o \
|
||||||
src/client/refresh/files/stb.o \
|
src/client/refresh/files/stb.o \
|
||||||
src/client/refresh/files/wal.o \
|
src/client/refresh/files/wal.o \
|
||||||
|
src/client/refresh/files/warp.o \
|
||||||
src/client/refresh/files/pvs.o \
|
src/client/refresh/files/pvs.o \
|
||||||
src/common/shared/shared.o \
|
src/common/shared/shared.o \
|
||||||
src/common/shared/utils.o \
|
src/common/shared/utils.o \
|
||||||
|
@ -1039,6 +1040,7 @@ REFGL3_OBJS_ := \
|
||||||
src/client/refresh/files/pcx.o \
|
src/client/refresh/files/pcx.o \
|
||||||
src/client/refresh/files/stb.o \
|
src/client/refresh/files/stb.o \
|
||||||
src/client/refresh/files/wal.o \
|
src/client/refresh/files/wal.o \
|
||||||
|
src/client/refresh/files/warp.o \
|
||||||
src/client/refresh/files/pvs.o \
|
src/client/refresh/files/pvs.o \
|
||||||
src/common/shared/shared.o \
|
src/common/shared/shared.o \
|
||||||
src/common/shared/utils.o \
|
src/common/shared/utils.o \
|
||||||
|
@ -1080,6 +1082,7 @@ REFGL4_OBJS_ := \
|
||||||
src/client/refresh/files/pcx.o \
|
src/client/refresh/files/pcx.o \
|
||||||
src/client/refresh/files/stb.o \
|
src/client/refresh/files/stb.o \
|
||||||
src/client/refresh/files/wal.o \
|
src/client/refresh/files/wal.o \
|
||||||
|
src/client/refresh/files/warp.o \
|
||||||
src/client/refresh/files/pvs.o \
|
src/client/refresh/files/pvs.o \
|
||||||
src/common/shared/shared.o \
|
src/common/shared/shared.o \
|
||||||
src/common/cmodels.o \
|
src/common/cmodels.o \
|
||||||
|
@ -1165,6 +1168,7 @@ REFVK_OBJS_ := \
|
||||||
src/client/refresh/files/pcx.o \
|
src/client/refresh/files/pcx.o \
|
||||||
src/client/refresh/files/stb.o \
|
src/client/refresh/files/stb.o \
|
||||||
src/client/refresh/files/wal.o \
|
src/client/refresh/files/wal.o \
|
||||||
|
src/client/refresh/files/warp.o \
|
||||||
src/client/refresh/files/pvs.o \
|
src/client/refresh/files/pvs.o \
|
||||||
src/common/shared/shared.o \
|
src/common/shared/shared.o \
|
||||||
src/common/shared/utils.o \
|
src/common/shared/utils.o \
|
||||||
|
|
310
src/client/refresh/files/warp.c
Normal file
310
src/client/refresh/files/warp.c
Normal file
|
@ -0,0 +1,310 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997-2001 Id Software, Inc.
|
||||||
|
* Copyright (C) 2018-2019 Krzysztof Kondrak
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* =======================================================================
|
||||||
|
*
|
||||||
|
* Warps. Used on water surfaces und for skybox rotation.
|
||||||
|
*
|
||||||
|
* =======================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../ref_shared.h"
|
||||||
|
|
||||||
|
#define ON_EPSILON 0.1 /* point on plane side epsilon */
|
||||||
|
#define MAX_CLIP_VERTS 64
|
||||||
|
|
||||||
|
static const vec3_t skyclip[6] = {
|
||||||
|
{1, 1, 0},
|
||||||
|
{1, -1, 0},
|
||||||
|
{0, -1, 1},
|
||||||
|
{0, 1, 1},
|
||||||
|
{1, 0, 1},
|
||||||
|
{-1, 0, 1}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const int vec_to_st[6][3] = {
|
||||||
|
{-2, 3, 1},
|
||||||
|
{2, 3, -1},
|
||||||
|
|
||||||
|
{1, 3, 2},
|
||||||
|
{-1, 3, -2},
|
||||||
|
|
||||||
|
{-2, -1, 3},
|
||||||
|
{-2, 1, -3}
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
R_DrawSkyPolygon(int nump, vec3_t vecs, float skymins[2][6], float skymaxs[2][6])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
vec3_t v, av;
|
||||||
|
float s, t, dv;
|
||||||
|
int axis;
|
||||||
|
float *vp;
|
||||||
|
|
||||||
|
/* decide which face it maps to */
|
||||||
|
VectorCopy(vec3_origin, v);
|
||||||
|
|
||||||
|
for (i = 0, vp = vecs; i < nump; i++, vp += 3)
|
||||||
|
{
|
||||||
|
VectorAdd(vp, v, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
av[0] = fabs(v[0]);
|
||||||
|
av[1] = fabs(v[1]);
|
||||||
|
av[2] = fabs(v[2]);
|
||||||
|
|
||||||
|
if ((av[0] > av[1]) && (av[0] > av[2]))
|
||||||
|
{
|
||||||
|
if (v[0] < 0)
|
||||||
|
{
|
||||||
|
axis = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
axis = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((av[1] > av[2]) && (av[1] > av[0]))
|
||||||
|
{
|
||||||
|
if (v[1] < 0)
|
||||||
|
{
|
||||||
|
axis = 3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
axis = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (v[2] < 0)
|
||||||
|
{
|
||||||
|
axis = 5;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
axis = 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* project new texture coords */
|
||||||
|
for (i = 0; i < nump; i++, vecs += 3)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
|
||||||
|
j = vec_to_st[axis][2];
|
||||||
|
|
||||||
|
if (j > 0)
|
||||||
|
{
|
||||||
|
dv = vecs[j - 1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dv = -vecs[-j - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dv < 0.001)
|
||||||
|
{
|
||||||
|
continue; /* don't divide by zero */
|
||||||
|
}
|
||||||
|
|
||||||
|
j = vec_to_st[axis][0];
|
||||||
|
|
||||||
|
if (j < 0)
|
||||||
|
{
|
||||||
|
s = -vecs[-j - 1] / dv;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
s = vecs[j - 1] / dv;
|
||||||
|
}
|
||||||
|
|
||||||
|
j = vec_to_st[axis][1];
|
||||||
|
|
||||||
|
if (j < 0)
|
||||||
|
{
|
||||||
|
t = -vecs[-j - 1] / dv;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
t = vecs[j - 1] / dv;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s < skymins[0][axis])
|
||||||
|
{
|
||||||
|
skymins[0][axis] = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (t < skymins[1][axis])
|
||||||
|
{
|
||||||
|
skymins[1][axis] = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s > skymaxs[0][axis])
|
||||||
|
{
|
||||||
|
skymaxs[0][axis] = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (t > skymaxs[1][axis])
|
||||||
|
{
|
||||||
|
skymaxs[1][axis] = t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
R_ClipSkyPolygon(int nump, vec3_t vecs, int stage, float skymins[2][6], float skymaxs[2][6])
|
||||||
|
{
|
||||||
|
const float *norm;
|
||||||
|
float *v;
|
||||||
|
qboolean front, back;
|
||||||
|
float d, e;
|
||||||
|
float dists[MAX_CLIP_VERTS];
|
||||||
|
int sides[MAX_CLIP_VERTS];
|
||||||
|
vec3_t newv[2][MAX_CLIP_VERTS];
|
||||||
|
int newc[2];
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
if (nump > MAX_CLIP_VERTS - 2)
|
||||||
|
{
|
||||||
|
Com_Error(ERR_DROP, "%s: MAX_CLIP_VERTS", __func__);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stage == 6)
|
||||||
|
{
|
||||||
|
/* fully clipped, so draw it */
|
||||||
|
R_DrawSkyPolygon(nump, vecs, skymins, skymaxs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
front = back = false;
|
||||||
|
norm = skyclip[stage];
|
||||||
|
|
||||||
|
for (i = 0, v = vecs; i < nump; i++, v += 3)
|
||||||
|
{
|
||||||
|
d = DotProduct(v, norm);
|
||||||
|
|
||||||
|
if (d > ON_EPSILON)
|
||||||
|
{
|
||||||
|
front = true;
|
||||||
|
sides[i] = SIDE_FRONT;
|
||||||
|
}
|
||||||
|
else if (d < -ON_EPSILON)
|
||||||
|
{
|
||||||
|
back = true;
|
||||||
|
sides[i] = SIDE_BACK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sides[i] = SIDE_ON;
|
||||||
|
}
|
||||||
|
|
||||||
|
dists[i] = d;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!front || !back)
|
||||||
|
{
|
||||||
|
/* not clipped */
|
||||||
|
R_ClipSkyPolygon(nump, vecs, stage + 1, skymins, skymaxs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* clip it */
|
||||||
|
sides[i] = sides[0];
|
||||||
|
dists[i] = dists[0];
|
||||||
|
VectorCopy(vecs, (vecs + (i * 3)));
|
||||||
|
newc[0] = newc[1] = 0;
|
||||||
|
|
||||||
|
for (i = 0, v = vecs; i < nump; i++, v += 3)
|
||||||
|
{
|
||||||
|
switch (sides[i])
|
||||||
|
{
|
||||||
|
case SIDE_FRONT:
|
||||||
|
VectorCopy(v, newv[0][newc[0]]);
|
||||||
|
newc[0]++;
|
||||||
|
break;
|
||||||
|
case SIDE_BACK:
|
||||||
|
VectorCopy(v, newv[1][newc[1]]);
|
||||||
|
newc[1]++;
|
||||||
|
break;
|
||||||
|
case SIDE_ON:
|
||||||
|
VectorCopy(v, newv[0][newc[0]]);
|
||||||
|
newc[0]++;
|
||||||
|
VectorCopy(v, newv[1][newc[1]]);
|
||||||
|
newc[1]++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((sides[i] == SIDE_ON) ||
|
||||||
|
(sides[i + 1] == SIDE_ON) ||
|
||||||
|
(sides[i + 1] == sides[i]))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
d = dists[i] / (dists[i] - dists[i + 1]);
|
||||||
|
|
||||||
|
for (j = 0; j < 3; j++)
|
||||||
|
{
|
||||||
|
e = v[j] + d * (v[j + 3] - v[j]);
|
||||||
|
newv[0][newc[0]][j] = e;
|
||||||
|
newv[1][newc[1]][j] = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
newc[0]++;
|
||||||
|
newc[1]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* continue */
|
||||||
|
R_ClipSkyPolygon(newc[0], newv[0][0], stage + 1, skymins, skymaxs);
|
||||||
|
R_ClipSkyPolygon(newc[1], newv[1][0], stage + 1, skymins, skymaxs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
R_AddSkySurface(msurface_t *fa, float skymins[2][6], float skymaxs[2][6], vec3_t r_origin)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
vec3_t verts[MAX_CLIP_VERTS];
|
||||||
|
mpoly_t *p;
|
||||||
|
|
||||||
|
/* calculate vertex values for sky box */
|
||||||
|
for (p = fa->polys; p; p = p->next)
|
||||||
|
{
|
||||||
|
for (i = 0; i < p->numverts; i++)
|
||||||
|
{
|
||||||
|
VectorSubtract(p->verts[i].pos, r_origin, verts[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
R_ClipSkyPolygon(p->numverts, verts[0], 0, skymins, skymaxs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
R_ClearSkyBox(float skymins[2][6], float skymaxs[2][6])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 6; i++)
|
||||||
|
{
|
||||||
|
skymins[0][i] = skymins[1][i] = 9999;
|
||||||
|
skymaxs[0][i] = skymaxs[1][i] = -9999;
|
||||||
|
}
|
||||||
|
}
|
|
@ -892,7 +892,7 @@ R_RecursiveWorldNode(entity_t *currententity, mnode_t *node)
|
||||||
if (surf->texinfo->flags & SURF_SKY)
|
if (surf->texinfo->flags & SURF_SKY)
|
||||||
{
|
{
|
||||||
/* just adds to visible sky bounds */
|
/* just adds to visible sky bounds */
|
||||||
R_AddSkySurface(surf);
|
RE_AddSkySurface(surf);
|
||||||
}
|
}
|
||||||
else if (surf->texinfo->flags & (SURF_TRANS33 | SURF_TRANS66))
|
else if (surf->texinfo->flags & (SURF_TRANS33 | SURF_TRANS66))
|
||||||
{
|
{
|
||||||
|
@ -943,7 +943,7 @@ R_DrawWorld(void)
|
||||||
glColor4f(1, 1, 1, 1);
|
glColor4f(1, 1, 1, 1);
|
||||||
memset(gl_lms.lightmap_surfaces, 0, sizeof(gl_lms.lightmap_surfaces));
|
memset(gl_lms.lightmap_surfaces, 0, sizeof(gl_lms.lightmap_surfaces));
|
||||||
|
|
||||||
R_ClearSkyBox();
|
RE_ClearSkyBox();
|
||||||
R_RecursiveWorldNode(&ent, r_worldmodel->nodes);
|
R_RecursiveWorldNode(&ent, r_worldmodel->nodes);
|
||||||
R_DrawTextureChains(&ent);
|
R_DrawTextureChains(&ent);
|
||||||
R_BlendLightmaps(currentmodel);
|
R_BlendLightmaps(currentmodel);
|
||||||
|
|
|
@ -48,15 +48,6 @@ float r_turbsin[] = {
|
||||||
#include "../constants/warpsin.h"
|
#include "../constants/warpsin.h"
|
||||||
};
|
};
|
||||||
|
|
||||||
static const vec3_t skyclip[6] = {
|
|
||||||
{1, 1, 0},
|
|
||||||
{1, -1, 0},
|
|
||||||
{0, -1, 1},
|
|
||||||
{0, 1, 1},
|
|
||||||
{1, 0, 1},
|
|
||||||
{-1, 0, 1}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const int st_to_vec[6][3] = {
|
static const int st_to_vec[6][3] = {
|
||||||
{3, -1, 2},
|
{3, -1, 2},
|
||||||
{-3, 1, 2},
|
{-3, 1, 2},
|
||||||
|
@ -68,17 +59,6 @@ static const int st_to_vec[6][3] = {
|
||||||
{2, -1, -3} /* look straight down */
|
{2, -1, -3} /* look straight down */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int vec_to_st[6][3] = {
|
|
||||||
{-2, 3, 1},
|
|
||||||
{2, 3, -1},
|
|
||||||
|
|
||||||
{1, 3, 2},
|
|
||||||
{-1, 3, -2},
|
|
||||||
|
|
||||||
{-2, -1, 3},
|
|
||||||
{-2, 1, -3}
|
|
||||||
};
|
|
||||||
|
|
||||||
static float skymins[2][6], skymaxs[2][6];
|
static float skymins[2][6], skymaxs[2][6];
|
||||||
static float sky_min, sky_max;
|
static float sky_min, sky_max;
|
||||||
|
|
||||||
|
@ -153,263 +133,16 @@ R_EmitWaterPolys(msurface_t *fa)
|
||||||
YQ2_VLAFREE( tex );
|
YQ2_VLAFREE( tex );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
R_DrawSkyPolygon(int nump, vec3_t vecs)
|
RE_AddSkySurface(msurface_t *fa)
|
||||||
{
|
{
|
||||||
int i;
|
R_AddSkySurface(fa, skymins, skymaxs, r_origin);
|
||||||
vec3_t v, av;
|
|
||||||
float s, t, dv;
|
|
||||||
int axis;
|
|
||||||
float *vp;
|
|
||||||
|
|
||||||
/* decide which face it maps to */
|
|
||||||
VectorCopy(vec3_origin, v);
|
|
||||||
|
|
||||||
for (i = 0, vp = vecs; i < nump; i++, vp += 3)
|
|
||||||
{
|
|
||||||
VectorAdd(vp, v, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
av[0] = fabs(v[0]);
|
|
||||||
av[1] = fabs(v[1]);
|
|
||||||
av[2] = fabs(v[2]);
|
|
||||||
|
|
||||||
if ((av[0] > av[1]) && (av[0] > av[2]))
|
|
||||||
{
|
|
||||||
if (v[0] < 0)
|
|
||||||
{
|
|
||||||
axis = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
axis = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((av[1] > av[2]) && (av[1] > av[0]))
|
|
||||||
{
|
|
||||||
if (v[1] < 0)
|
|
||||||
{
|
|
||||||
axis = 3;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
axis = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (v[2] < 0)
|
|
||||||
{
|
|
||||||
axis = 5;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
axis = 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* project new texture coords */
|
|
||||||
for (i = 0; i < nump; i++, vecs += 3)
|
|
||||||
{
|
|
||||||
int j;
|
|
||||||
|
|
||||||
j = vec_to_st[axis][2];
|
|
||||||
|
|
||||||
if (j > 0)
|
|
||||||
{
|
|
||||||
dv = vecs[j - 1];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dv = -vecs[-j - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dv < 0.001)
|
|
||||||
{
|
|
||||||
continue; /* don't divide by zero */
|
|
||||||
}
|
|
||||||
|
|
||||||
j = vec_to_st[axis][0];
|
|
||||||
|
|
||||||
if (j < 0)
|
|
||||||
{
|
|
||||||
s = -vecs[-j - 1] / dv;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s = vecs[j - 1] / dv;
|
|
||||||
}
|
|
||||||
|
|
||||||
j = vec_to_st[axis][1];
|
|
||||||
|
|
||||||
if (j < 0)
|
|
||||||
{
|
|
||||||
t = -vecs[-j - 1] / dv;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
t = vecs[j - 1] / dv;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s < skymins[0][axis])
|
|
||||||
{
|
|
||||||
skymins[0][axis] = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (t < skymins[1][axis])
|
|
||||||
{
|
|
||||||
skymins[1][axis] = t;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s > skymaxs[0][axis])
|
|
||||||
{
|
|
||||||
skymaxs[0][axis] = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (t > skymaxs[1][axis])
|
|
||||||
{
|
|
||||||
skymaxs[1][axis] = t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
R_ClipSkyPolygon(int nump, vec3_t vecs, int stage)
|
|
||||||
{
|
|
||||||
const float *norm;
|
|
||||||
float *v;
|
|
||||||
qboolean front, back;
|
|
||||||
float d, e;
|
|
||||||
float dists[MAX_CLIP_VERTS];
|
|
||||||
int sides[MAX_CLIP_VERTS];
|
|
||||||
vec3_t newv[2][MAX_CLIP_VERTS];
|
|
||||||
int newc[2];
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
if (nump > MAX_CLIP_VERTS - 2)
|
|
||||||
{
|
|
||||||
Com_Error(ERR_DROP, "%s: MAX_CLIP_VERTS", __func__);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stage == 6)
|
|
||||||
{
|
|
||||||
/* fully clipped, so draw it */
|
|
||||||
R_DrawSkyPolygon(nump, vecs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
front = back = false;
|
|
||||||
norm = skyclip[stage];
|
|
||||||
|
|
||||||
for (i = 0, v = vecs; i < nump; i++, v += 3)
|
|
||||||
{
|
|
||||||
d = DotProduct(v, norm);
|
|
||||||
|
|
||||||
if (d > ON_EPSILON)
|
|
||||||
{
|
|
||||||
front = true;
|
|
||||||
sides[i] = SIDE_FRONT;
|
|
||||||
}
|
|
||||||
else if (d < -ON_EPSILON)
|
|
||||||
{
|
|
||||||
back = true;
|
|
||||||
sides[i] = SIDE_BACK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sides[i] = SIDE_ON;
|
|
||||||
}
|
|
||||||
|
|
||||||
dists[i] = d;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!front || !back)
|
|
||||||
{
|
|
||||||
/* not clipped */
|
|
||||||
R_ClipSkyPolygon(nump, vecs, stage + 1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* clip it */
|
|
||||||
sides[i] = sides[0];
|
|
||||||
dists[i] = dists[0];
|
|
||||||
VectorCopy(vecs, (vecs + (i * 3)));
|
|
||||||
newc[0] = newc[1] = 0;
|
|
||||||
|
|
||||||
for (i = 0, v = vecs; i < nump; i++, v += 3)
|
|
||||||
{
|
|
||||||
switch (sides[i])
|
|
||||||
{
|
|
||||||
case SIDE_FRONT:
|
|
||||||
VectorCopy(v, newv[0][newc[0]]);
|
|
||||||
newc[0]++;
|
|
||||||
break;
|
|
||||||
case SIDE_BACK:
|
|
||||||
VectorCopy(v, newv[1][newc[1]]);
|
|
||||||
newc[1]++;
|
|
||||||
break;
|
|
||||||
case SIDE_ON:
|
|
||||||
VectorCopy(v, newv[0][newc[0]]);
|
|
||||||
newc[0]++;
|
|
||||||
VectorCopy(v, newv[1][newc[1]]);
|
|
||||||
newc[1]++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((sides[i] == SIDE_ON) ||
|
|
||||||
(sides[i + 1] == SIDE_ON) ||
|
|
||||||
(sides[i + 1] == sides[i]))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
d = dists[i] / (dists[i] - dists[i + 1]);
|
|
||||||
|
|
||||||
for (j = 0; j < 3; j++)
|
|
||||||
{
|
|
||||||
e = v[j] + d * (v[j + 3] - v[j]);
|
|
||||||
newv[0][newc[0]][j] = e;
|
|
||||||
newv[1][newc[1]][j] = e;
|
|
||||||
}
|
|
||||||
|
|
||||||
newc[0]++;
|
|
||||||
newc[1]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* continue */
|
|
||||||
R_ClipSkyPolygon(newc[0], newv[0][0], stage + 1);
|
|
||||||
R_ClipSkyPolygon(newc[1], newv[1][0], stage + 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
R_AddSkySurface(msurface_t *fa)
|
RE_ClearSkyBox(void)
|
||||||
{
|
{
|
||||||
int i;
|
R_ClearSkyBox(skymins, skymaxs);
|
||||||
vec3_t verts[MAX_CLIP_VERTS];
|
|
||||||
mpoly_t *p;
|
|
||||||
|
|
||||||
/* calculate vertex values for sky box */
|
|
||||||
for (p = fa->polys; p; p = p->next)
|
|
||||||
{
|
|
||||||
for (i = 0; i < p->numverts; i++)
|
|
||||||
{
|
|
||||||
VectorSubtract(p->verts[i].pos, r_origin, verts[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
R_ClipSkyPolygon(p->numverts, verts[0], 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
R_ClearSkyBox(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 6; i++)
|
|
||||||
{
|
|
||||||
skymins[0][i] = skymins[1][i] = 9999;
|
|
||||||
skymaxs[0][i] = skymaxs[1][i] = -9999;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -257,8 +257,8 @@ void R_MarkLeaves(void);
|
||||||
extern int r_dlightframecount;
|
extern int r_dlightframecount;
|
||||||
mpoly_t *WaterWarpPolyVerts(mpoly_t *p);
|
mpoly_t *WaterWarpPolyVerts(mpoly_t *p);
|
||||||
void R_EmitWaterPolys(msurface_t *fa);
|
void R_EmitWaterPolys(msurface_t *fa);
|
||||||
void R_AddSkySurface(msurface_t *fa);
|
void RE_AddSkySurface(msurface_t *fa);
|
||||||
void R_ClearSkyBox(void);
|
void RE_ClearSkyBox(void);
|
||||||
void R_DrawSkyBox(void);
|
void R_DrawSkyBox(void);
|
||||||
void R_MarkSurfaceLights(dlight_t *light, int bit, mnode_t *node,
|
void R_MarkSurfaceLights(dlight_t *light, int bit, mnode_t *node,
|
||||||
int r_dlightframecount);
|
int r_dlightframecount);
|
||||||
|
|
|
@ -723,7 +723,7 @@ RecursiveWorldNode(entity_t *currententity, mnode_t *node)
|
||||||
if (surf->texinfo->flags & SURF_SKY)
|
if (surf->texinfo->flags & SURF_SKY)
|
||||||
{
|
{
|
||||||
/* just adds to visible sky bounds */
|
/* just adds to visible sky bounds */
|
||||||
R_AddSkySurface(surf);
|
RE_AddSkySurface(surf);
|
||||||
}
|
}
|
||||||
else if (surf->texinfo->flags & (SURF_TRANS33 | SURF_TRANS66))
|
else if (surf->texinfo->flags & (SURF_TRANS33 | SURF_TRANS66))
|
||||||
{
|
{
|
||||||
|
@ -780,7 +780,7 @@ GL3_DrawWorld(void)
|
||||||
|
|
||||||
gl3state.currenttexture = -1;
|
gl3state.currenttexture = -1;
|
||||||
|
|
||||||
R_ClearSkyBox();
|
RE_ClearSkyBox();
|
||||||
RecursiveWorldNode(&ent, gl3_worldmodel->nodes);
|
RecursiveWorldNode(&ent, gl3_worldmodel->nodes);
|
||||||
DrawTextureChains(&ent);
|
DrawTextureChains(&ent);
|
||||||
GL3_DrawSkyBox();
|
GL3_DrawSkyBox();
|
||||||
|
|
|
@ -92,15 +92,6 @@ static const int skytexorder[6] = {0, 2, 1, 3, 4, 5};
|
||||||
/* 3dstudio environment map names */
|
/* 3dstudio environment map names */
|
||||||
static const char *suf[6] = {"rt", "bk", "lf", "ft", "up", "dn"};
|
static const char *suf[6] = {"rt", "bk", "lf", "ft", "up", "dn"};
|
||||||
|
|
||||||
static const vec3_t skyclip[6] = {
|
|
||||||
{1, 1, 0},
|
|
||||||
{1, -1, 0},
|
|
||||||
{0, -1, 1},
|
|
||||||
{0, 1, 1},
|
|
||||||
{1, 0, 1},
|
|
||||||
{-1, 0, 1}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const int st_to_vec[6][3] = {
|
static const int st_to_vec[6][3] = {
|
||||||
{3, -1, 2},
|
{3, -1, 2},
|
||||||
{-3, 1, 2},
|
{-3, 1, 2},
|
||||||
|
@ -112,17 +103,6 @@ static const int st_to_vec[6][3] = {
|
||||||
{2, -1, -3} /* look straight down */
|
{2, -1, -3} /* look straight down */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int vec_to_st[6][3] = {
|
|
||||||
{-2, 3, 1},
|
|
||||||
{2, 3, -1},
|
|
||||||
|
|
||||||
{1, 3, 2},
|
|
||||||
{-1, 3, -2},
|
|
||||||
|
|
||||||
{-2, -1, 3},
|
|
||||||
{-2, 1, -3}
|
|
||||||
};
|
|
||||||
|
|
||||||
static float skymins[2][6], skymaxs[2][6];
|
static float skymins[2][6], skymaxs[2][6];
|
||||||
static float sky_min, sky_max;
|
static float sky_min, sky_max;
|
||||||
|
|
||||||
|
@ -158,263 +138,16 @@ GL3_SetSky(const char *name, float rotate, int autorotate, const vec3_t axis)
|
||||||
sky_max = 511.0 / 512;
|
sky_max = 511.0 / 512;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
R_DrawSkyPolygon(int nump, vec3_t vecs)
|
RE_AddSkySurface(msurface_t *fa)
|
||||||
{
|
{
|
||||||
int i;
|
R_AddSkySurface(fa, skymins, skymaxs, gl3_origin);
|
||||||
vec3_t v, av;
|
|
||||||
float s, t, dv;
|
|
||||||
int axis;
|
|
||||||
float *vp;
|
|
||||||
|
|
||||||
/* decide which face it maps to */
|
|
||||||
VectorCopy(vec3_origin, v);
|
|
||||||
|
|
||||||
for (i = 0, vp = vecs; i < nump; i++, vp += 3)
|
|
||||||
{
|
|
||||||
VectorAdd(vp, v, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
av[0] = fabs(v[0]);
|
|
||||||
av[1] = fabs(v[1]);
|
|
||||||
av[2] = fabs(v[2]);
|
|
||||||
|
|
||||||
if ((av[0] > av[1]) && (av[0] > av[2]))
|
|
||||||
{
|
|
||||||
if (v[0] < 0)
|
|
||||||
{
|
|
||||||
axis = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
axis = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((av[1] > av[2]) && (av[1] > av[0]))
|
|
||||||
{
|
|
||||||
if (v[1] < 0)
|
|
||||||
{
|
|
||||||
axis = 3;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
axis = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (v[2] < 0)
|
|
||||||
{
|
|
||||||
axis = 5;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
axis = 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* project new texture coords */
|
|
||||||
for (i = 0; i < nump; i++, vecs += 3)
|
|
||||||
{
|
|
||||||
int j;
|
|
||||||
|
|
||||||
j = vec_to_st[axis][2];
|
|
||||||
|
|
||||||
if (j > 0)
|
|
||||||
{
|
|
||||||
dv = vecs[j - 1];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dv = -vecs[-j - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dv < 0.001)
|
|
||||||
{
|
|
||||||
continue; /* don't divide by zero */
|
|
||||||
}
|
|
||||||
|
|
||||||
j = vec_to_st[axis][0];
|
|
||||||
|
|
||||||
if (j < 0)
|
|
||||||
{
|
|
||||||
s = -vecs[-j - 1] / dv;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s = vecs[j - 1] / dv;
|
|
||||||
}
|
|
||||||
|
|
||||||
j = vec_to_st[axis][1];
|
|
||||||
|
|
||||||
if (j < 0)
|
|
||||||
{
|
|
||||||
t = -vecs[-j - 1] / dv;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
t = vecs[j - 1] / dv;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s < skymins[0][axis])
|
|
||||||
{
|
|
||||||
skymins[0][axis] = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (t < skymins[1][axis])
|
|
||||||
{
|
|
||||||
skymins[1][axis] = t;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s > skymaxs[0][axis])
|
|
||||||
{
|
|
||||||
skymaxs[0][axis] = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (t > skymaxs[1][axis])
|
|
||||||
{
|
|
||||||
skymaxs[1][axis] = t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
R_ClipSkyPolygon(int nump, vec3_t vecs, int stage)
|
|
||||||
{
|
|
||||||
const float *norm;
|
|
||||||
float *v;
|
|
||||||
qboolean front, back;
|
|
||||||
float d, e;
|
|
||||||
float dists[MAX_CLIP_VERTS];
|
|
||||||
int sides[MAX_CLIP_VERTS];
|
|
||||||
vec3_t newv[2][MAX_CLIP_VERTS];
|
|
||||||
int newc[2];
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
if (nump > MAX_CLIP_VERTS - 2)
|
|
||||||
{
|
|
||||||
Com_Error(ERR_DROP, "%s: MAX_CLIP_VERTS", __func__);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stage == 6)
|
|
||||||
{
|
|
||||||
/* fully clipped, so draw it */
|
|
||||||
R_DrawSkyPolygon(nump, vecs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
front = back = false;
|
|
||||||
norm = skyclip[stage];
|
|
||||||
|
|
||||||
for (i = 0, v = vecs; i < nump; i++, v += 3)
|
|
||||||
{
|
|
||||||
d = DotProduct(v, norm);
|
|
||||||
|
|
||||||
if (d > ON_EPSILON)
|
|
||||||
{
|
|
||||||
front = true;
|
|
||||||
sides[i] = SIDE_FRONT;
|
|
||||||
}
|
|
||||||
else if (d < -ON_EPSILON)
|
|
||||||
{
|
|
||||||
back = true;
|
|
||||||
sides[i] = SIDE_BACK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sides[i] = SIDE_ON;
|
|
||||||
}
|
|
||||||
|
|
||||||
dists[i] = d;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!front || !back)
|
|
||||||
{
|
|
||||||
/* not clipped */
|
|
||||||
R_ClipSkyPolygon(nump, vecs, stage + 1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* clip it */
|
|
||||||
sides[i] = sides[0];
|
|
||||||
dists[i] = dists[0];
|
|
||||||
VectorCopy(vecs, (vecs + (i * 3)));
|
|
||||||
newc[0] = newc[1] = 0;
|
|
||||||
|
|
||||||
for (i = 0, v = vecs; i < nump; i++, v += 3)
|
|
||||||
{
|
|
||||||
switch (sides[i])
|
|
||||||
{
|
|
||||||
case SIDE_FRONT:
|
|
||||||
VectorCopy(v, newv[0][newc[0]]);
|
|
||||||
newc[0]++;
|
|
||||||
break;
|
|
||||||
case SIDE_BACK:
|
|
||||||
VectorCopy(v, newv[1][newc[1]]);
|
|
||||||
newc[1]++;
|
|
||||||
break;
|
|
||||||
case SIDE_ON:
|
|
||||||
VectorCopy(v, newv[0][newc[0]]);
|
|
||||||
newc[0]++;
|
|
||||||
VectorCopy(v, newv[1][newc[1]]);
|
|
||||||
newc[1]++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((sides[i] == SIDE_ON) ||
|
|
||||||
(sides[i + 1] == SIDE_ON) ||
|
|
||||||
(sides[i + 1] == sides[i]))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
d = dists[i] / (dists[i] - dists[i + 1]);
|
|
||||||
|
|
||||||
for (j = 0; j < 3; j++)
|
|
||||||
{
|
|
||||||
e = v[j] + d * (v[j + 3] - v[j]);
|
|
||||||
newv[0][newc[0]][j] = e;
|
|
||||||
newv[1][newc[1]][j] = e;
|
|
||||||
}
|
|
||||||
|
|
||||||
newc[0]++;
|
|
||||||
newc[1]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* continue */
|
|
||||||
R_ClipSkyPolygon(newc[0], newv[0][0], stage + 1);
|
|
||||||
R_ClipSkyPolygon(newc[1], newv[1][0], stage + 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
R_AddSkySurface(msurface_t *fa)
|
RE_ClearSkyBox(void)
|
||||||
{
|
{
|
||||||
int i;
|
R_ClearSkyBox(skymins, skymaxs);
|
||||||
vec3_t verts[MAX_CLIP_VERTS];
|
|
||||||
mpoly_t *p;
|
|
||||||
|
|
||||||
/* calculate vertex values for sky box */
|
|
||||||
for (p = fa->polys; p; p = p->next)
|
|
||||||
{
|
|
||||||
for (i = 0; i < p->numverts; i++)
|
|
||||||
{
|
|
||||||
VectorSubtract(p->verts[i].pos, gl3_origin, verts[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
R_ClipSkyPolygon(p->numverts, verts[0], 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
R_ClearSkyBox(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 6; i++)
|
|
||||||
{
|
|
||||||
skymins[0][i] = skymins[1][i] = 9999;
|
|
||||||
skymaxs[0][i] = skymaxs[1][i] = -9999;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -477,8 +477,8 @@ extern void GL3_EmitWaterPolys(msurface_t *fa);
|
||||||
|
|
||||||
extern void GL3_SetSky(const char *name, float rotate, int autorotate, const vec3_t axis);
|
extern void GL3_SetSky(const char *name, float rotate, int autorotate, const vec3_t axis);
|
||||||
extern void GL3_DrawSkyBox(void);
|
extern void GL3_DrawSkyBox(void);
|
||||||
extern void R_ClearSkyBox(void);
|
extern void RE_ClearSkyBox(void);
|
||||||
extern void R_AddSkySurface(msurface_t *fa);
|
extern void RE_AddSkySurface(msurface_t *fa);
|
||||||
|
|
||||||
|
|
||||||
// gl3_surf.c
|
// gl3_surf.c
|
||||||
|
|
|
@ -780,7 +780,7 @@ GL4_DrawWorld(void)
|
||||||
|
|
||||||
gl4state.currenttexture = -1;
|
gl4state.currenttexture = -1;
|
||||||
|
|
||||||
R_ClearSkyBox();
|
RE_ClearSkyBox();
|
||||||
RecursiveWorldNode(&ent, gl4_worldmodel->nodes);
|
RecursiveWorldNode(&ent, gl4_worldmodel->nodes);
|
||||||
DrawTextureChains(&ent);
|
DrawTextureChains(&ent);
|
||||||
GL4_DrawSkyBox();
|
GL4_DrawSkyBox();
|
||||||
|
|
|
@ -92,15 +92,6 @@ static const int skytexorder[6] = {0, 2, 1, 3, 4, 5};
|
||||||
/* 3dstudio environment map names */
|
/* 3dstudio environment map names */
|
||||||
static const char *suf[6] = {"rt", "bk", "lf", "ft", "up", "dn"};
|
static const char *suf[6] = {"rt", "bk", "lf", "ft", "up", "dn"};
|
||||||
|
|
||||||
static const vec3_t skyclip[6] = {
|
|
||||||
{1, 1, 0},
|
|
||||||
{1, -1, 0},
|
|
||||||
{0, -1, 1},
|
|
||||||
{0, 1, 1},
|
|
||||||
{1, 0, 1},
|
|
||||||
{-1, 0, 1}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const int st_to_vec[6][3] = {
|
static const int st_to_vec[6][3] = {
|
||||||
{3, -1, 2},
|
{3, -1, 2},
|
||||||
{-3, 1, 2},
|
{-3, 1, 2},
|
||||||
|
@ -112,17 +103,6 @@ static const int st_to_vec[6][3] = {
|
||||||
{2, -1, -3} /* look straight down */
|
{2, -1, -3} /* look straight down */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int vec_to_st[6][3] = {
|
|
||||||
{-2, 3, 1},
|
|
||||||
{2, 3, -1},
|
|
||||||
|
|
||||||
{1, 3, 2},
|
|
||||||
{-1, 3, -2},
|
|
||||||
|
|
||||||
{-2, -1, 3},
|
|
||||||
{-2, 1, -3}
|
|
||||||
};
|
|
||||||
|
|
||||||
static float skymins[2][6], skymaxs[2][6];
|
static float skymins[2][6], skymaxs[2][6];
|
||||||
static float sky_min, sky_max;
|
static float sky_min, sky_max;
|
||||||
|
|
||||||
|
@ -158,263 +138,16 @@ GL4_SetSky(const char *name, float rotate, int autorotate, const vec3_t axis)
|
||||||
sky_max = 511.0 / 512;
|
sky_max = 511.0 / 512;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
R_DrawSkyPolygon(int nump, vec3_t vecs)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
vec3_t v, av;
|
|
||||||
float s, t, dv;
|
|
||||||
int axis;
|
|
||||||
float *vp;
|
|
||||||
|
|
||||||
/* decide which face it maps to */
|
|
||||||
VectorCopy(vec3_origin, v);
|
|
||||||
|
|
||||||
for (i = 0, vp = vecs; i < nump; i++, vp += 3)
|
|
||||||
{
|
|
||||||
VectorAdd(vp, v, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
av[0] = fabs(v[0]);
|
|
||||||
av[1] = fabs(v[1]);
|
|
||||||
av[2] = fabs(v[2]);
|
|
||||||
|
|
||||||
if ((av[0] > av[1]) && (av[0] > av[2]))
|
|
||||||
{
|
|
||||||
if (v[0] < 0)
|
|
||||||
{
|
|
||||||
axis = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
axis = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((av[1] > av[2]) && (av[1] > av[0]))
|
|
||||||
{
|
|
||||||
if (v[1] < 0)
|
|
||||||
{
|
|
||||||
axis = 3;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
axis = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (v[2] < 0)
|
|
||||||
{
|
|
||||||
axis = 5;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
axis = 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* project new texture coords */
|
|
||||||
for (i = 0; i < nump; i++, vecs += 3)
|
|
||||||
{
|
|
||||||
int j;
|
|
||||||
|
|
||||||
j = vec_to_st[axis][2];
|
|
||||||
|
|
||||||
if (j > 0)
|
|
||||||
{
|
|
||||||
dv = vecs[j - 1];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dv = -vecs[-j - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dv < 0.001)
|
|
||||||
{
|
|
||||||
continue; /* don't divide by zero */
|
|
||||||
}
|
|
||||||
|
|
||||||
j = vec_to_st[axis][0];
|
|
||||||
|
|
||||||
if (j < 0)
|
|
||||||
{
|
|
||||||
s = -vecs[-j - 1] / dv;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s = vecs[j - 1] / dv;
|
|
||||||
}
|
|
||||||
|
|
||||||
j = vec_to_st[axis][1];
|
|
||||||
|
|
||||||
if (j < 0)
|
|
||||||
{
|
|
||||||
t = -vecs[-j - 1] / dv;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
t = vecs[j - 1] / dv;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s < skymins[0][axis])
|
|
||||||
{
|
|
||||||
skymins[0][axis] = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (t < skymins[1][axis])
|
|
||||||
{
|
|
||||||
skymins[1][axis] = t;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s > skymaxs[0][axis])
|
|
||||||
{
|
|
||||||
skymaxs[0][axis] = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (t > skymaxs[1][axis])
|
|
||||||
{
|
|
||||||
skymaxs[1][axis] = t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
R_ClipSkyPolygon(int nump, vec3_t vecs, int stage)
|
|
||||||
{
|
|
||||||
const float *norm;
|
|
||||||
float *v;
|
|
||||||
qboolean front, back;
|
|
||||||
float d, e;
|
|
||||||
float dists[MAX_CLIP_VERTS];
|
|
||||||
int sides[MAX_CLIP_VERTS];
|
|
||||||
vec3_t newv[2][MAX_CLIP_VERTS];
|
|
||||||
int newc[2];
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
if (nump > MAX_CLIP_VERTS - 2)
|
|
||||||
{
|
|
||||||
Com_Error(ERR_DROP, "%s: MAX_CLIP_VERTS", __func__);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stage == 6)
|
|
||||||
{
|
|
||||||
/* fully clipped, so draw it */
|
|
||||||
R_DrawSkyPolygon(nump, vecs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
front = back = false;
|
|
||||||
norm = skyclip[stage];
|
|
||||||
|
|
||||||
for (i = 0, v = vecs; i < nump; i++, v += 3)
|
|
||||||
{
|
|
||||||
d = DotProduct(v, norm);
|
|
||||||
|
|
||||||
if (d > ON_EPSILON)
|
|
||||||
{
|
|
||||||
front = true;
|
|
||||||
sides[i] = SIDE_FRONT;
|
|
||||||
}
|
|
||||||
else if (d < -ON_EPSILON)
|
|
||||||
{
|
|
||||||
back = true;
|
|
||||||
sides[i] = SIDE_BACK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sides[i] = SIDE_ON;
|
|
||||||
}
|
|
||||||
|
|
||||||
dists[i] = d;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!front || !back)
|
|
||||||
{
|
|
||||||
/* not clipped */
|
|
||||||
R_ClipSkyPolygon(nump, vecs, stage + 1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* clip it */
|
|
||||||
sides[i] = sides[0];
|
|
||||||
dists[i] = dists[0];
|
|
||||||
VectorCopy(vecs, (vecs + (i * 3)));
|
|
||||||
newc[0] = newc[1] = 0;
|
|
||||||
|
|
||||||
for (i = 0, v = vecs; i < nump; i++, v += 3)
|
|
||||||
{
|
|
||||||
switch (sides[i])
|
|
||||||
{
|
|
||||||
case SIDE_FRONT:
|
|
||||||
VectorCopy(v, newv[0][newc[0]]);
|
|
||||||
newc[0]++;
|
|
||||||
break;
|
|
||||||
case SIDE_BACK:
|
|
||||||
VectorCopy(v, newv[1][newc[1]]);
|
|
||||||
newc[1]++;
|
|
||||||
break;
|
|
||||||
case SIDE_ON:
|
|
||||||
VectorCopy(v, newv[0][newc[0]]);
|
|
||||||
newc[0]++;
|
|
||||||
VectorCopy(v, newv[1][newc[1]]);
|
|
||||||
newc[1]++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((sides[i] == SIDE_ON) ||
|
|
||||||
(sides[i + 1] == SIDE_ON) ||
|
|
||||||
(sides[i + 1] == sides[i]))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
d = dists[i] / (dists[i] - dists[i + 1]);
|
|
||||||
|
|
||||||
for (j = 0; j < 3; j++)
|
|
||||||
{
|
|
||||||
e = v[j] + d * (v[j + 3] - v[j]);
|
|
||||||
newv[0][newc[0]][j] = e;
|
|
||||||
newv[1][newc[1]][j] = e;
|
|
||||||
}
|
|
||||||
|
|
||||||
newc[0]++;
|
|
||||||
newc[1]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* continue */
|
|
||||||
R_ClipSkyPolygon(newc[0], newv[0][0], stage + 1);
|
|
||||||
R_ClipSkyPolygon(newc[1], newv[1][0], stage + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
GL4_AddSkySurface(msurface_t *fa)
|
GL4_AddSkySurface(msurface_t *fa)
|
||||||
{
|
{
|
||||||
int i;
|
R_AddSkySurface(fa, skymins, skymaxs, gl4_origin);
|
||||||
vec3_t verts[MAX_CLIP_VERTS];
|
|
||||||
mpoly_t *p;
|
|
||||||
|
|
||||||
/* calculate vertex values for sky box */
|
|
||||||
for (p = fa->polys; p; p = p->next)
|
|
||||||
{
|
|
||||||
for (i = 0; i < p->numverts; i++)
|
|
||||||
{
|
|
||||||
VectorSubtract(p->verts[i].pos, gl4_origin, verts[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
R_ClipSkyPolygon(p->numverts, verts[0], 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
R_ClearSkyBox(void)
|
RE_ClearSkyBox(void)
|
||||||
{
|
{
|
||||||
int i;
|
R_ClearSkyBox(skymins, skymaxs);
|
||||||
|
|
||||||
for (i = 0; i < 6; i++)
|
|
||||||
{
|
|
||||||
skymins[0][i] = skymins[1][i] = 9999;
|
|
||||||
skymaxs[0][i] = skymaxs[1][i] = -9999;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -477,7 +477,7 @@ extern void GL4_EmitWaterPolys(msurface_t *fa);
|
||||||
|
|
||||||
extern void GL4_SetSky(const char *name, float rotate, int autorotate, const vec3_t axis);
|
extern void GL4_SetSky(const char *name, float rotate, int autorotate, const vec3_t axis);
|
||||||
extern void GL4_DrawSkyBox(void);
|
extern void GL4_DrawSkyBox(void);
|
||||||
extern void R_ClearSkyBox(void);
|
extern void RE_ClearSkyBox(void);
|
||||||
extern void GL4_AddSkySurface(msurface_t *fa);
|
extern void GL4_AddSkySurface(msurface_t *fa);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -380,4 +380,11 @@ extern bspxlightgrid_t *Mod_LoadBSPXLightGrid(const bspx_header_t *bspx_header,
|
||||||
extern void R_LightPoint(const bspxlightgrid_t *grid, const entity_t *currententity, refdef_t *refdef, const msurface_t *surfaces,
|
extern void R_LightPoint(const bspxlightgrid_t *grid, const entity_t *currententity, refdef_t *refdef, const msurface_t *surfaces,
|
||||||
const mnode_t *nodes, vec3_t p, vec3_t color, float modulate, vec3_t lightspot);
|
const mnode_t *nodes, vec3_t p, vec3_t color, float modulate, vec3_t lightspot);
|
||||||
|
|
||||||
|
/* Warp Sky logic */
|
||||||
|
extern void R_ClipSkyPolygon(int nump, vec3_t vecs, int stage,
|
||||||
|
float skymins[2][6], float skymaxs[2][6]);
|
||||||
|
extern void R_AddSkySurface(msurface_t *fa,
|
||||||
|
float skymins[2][6], float skymaxs[2][6], vec3_t r_origin);
|
||||||
|
extern void R_ClearSkyBox(float skymins[2][6], float skymaxs[2][6]);
|
||||||
|
|
||||||
#endif /* SRC_CLIENT_REFRESH_REF_SHARED_H_ */
|
#endif /* SRC_CLIENT_REFRESH_REF_SHARED_H_ */
|
||||||
|
|
|
@ -203,8 +203,8 @@ void R_MarkLeaves(void);
|
||||||
void EmitWaterPolys(msurface_t *fa, image_t *texture,
|
void EmitWaterPolys(msurface_t *fa, image_t *texture,
|
||||||
float *modelMatrix, const float *color,
|
float *modelMatrix, const float *color,
|
||||||
qboolean solid_surface);
|
qboolean solid_surface);
|
||||||
void R_AddSkySurface(msurface_t *fa);
|
void RE_AddSkySurface(msurface_t *fa);
|
||||||
void R_ClearSkyBox(void);
|
void RE_ClearSkyBox(void);
|
||||||
void R_DrawSkyBox(void);
|
void R_DrawSkyBox(void);
|
||||||
void R_MarkSurfaceLights(dlight_t *light, int bit, mnode_t *node,
|
void R_MarkSurfaceLights(dlight_t *light, int bit, mnode_t *node,
|
||||||
int r_dlightframecount);
|
int r_dlightframecount);
|
||||||
|
|
|
@ -853,7 +853,7 @@ R_RecursiveWorldNode(entity_t *currententity, mnode_t *node)
|
||||||
if (surf->texinfo->flags & SURF_SKY)
|
if (surf->texinfo->flags & SURF_SKY)
|
||||||
{
|
{
|
||||||
/* just adds to visible sky bounds */
|
/* just adds to visible sky bounds */
|
||||||
R_AddSkySurface(surf);
|
RE_AddSkySurface(surf);
|
||||||
}
|
}
|
||||||
else if (surf->texinfo->flags & (SURF_TRANS33 | SURF_TRANS66))
|
else if (surf->texinfo->flags & (SURF_TRANS33 | SURF_TRANS66))
|
||||||
{
|
{
|
||||||
|
@ -906,7 +906,7 @@ R_DrawWorld(void)
|
||||||
|
|
||||||
memset(vk_lms.lightmap_surfaces, 0, sizeof(vk_lms.lightmap_surfaces));
|
memset(vk_lms.lightmap_surfaces, 0, sizeof(vk_lms.lightmap_surfaces));
|
||||||
|
|
||||||
R_ClearSkyBox();
|
RE_ClearSkyBox();
|
||||||
R_RecursiveWorldNode(&ent, r_worldmodel->nodes);
|
R_RecursiveWorldNode(&ent, r_worldmodel->nodes);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -39,15 +39,6 @@ static const int skytexorder[6] = {0, 2, 1, 3, 4, 5};
|
||||||
/* 3dstudio environment map names */
|
/* 3dstudio environment map names */
|
||||||
static const char *suf[6] = {"rt", "bk", "lf", "ft", "up", "dn"};
|
static const char *suf[6] = {"rt", "bk", "lf", "ft", "up", "dn"};
|
||||||
|
|
||||||
static const vec3_t skyclip[6] = {
|
|
||||||
{1, 1, 0},
|
|
||||||
{1, -1, 0},
|
|
||||||
{0, -1, 1},
|
|
||||||
{0, 1, 1},
|
|
||||||
{1, 0, 1},
|
|
||||||
{-1, 0, 1}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const int st_to_vec[6][3] = {
|
static const int st_to_vec[6][3] = {
|
||||||
{3, -1, 2},
|
{3, -1, 2},
|
||||||
{-3, 1, 2},
|
{-3, 1, 2},
|
||||||
|
@ -59,17 +50,6 @@ static const int st_to_vec[6][3] = {
|
||||||
{2, -1, -3} /* look straight down */
|
{2, -1, -3} /* look straight down */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int vec_to_st[6][3] = {
|
|
||||||
{-2, 3, 1},
|
|
||||||
{2, 3, -1},
|
|
||||||
|
|
||||||
{1, 3, 2},
|
|
||||||
{-1, 3, -2},
|
|
||||||
|
|
||||||
{-2, -1, 3},
|
|
||||||
{-2, 1, -3}
|
|
||||||
};
|
|
||||||
|
|
||||||
static float skymins[2][6], skymaxs[2][6];
|
static float skymins[2][6], skymaxs[2][6];
|
||||||
static float sky_min, sky_max;
|
static float sky_min, sky_max;
|
||||||
|
|
||||||
|
@ -182,263 +162,16 @@ EmitWaterPolys(msurface_t *fa, image_t *texture, float *modelMatrix,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
R_DrawSkyPolygon(int nump, vec3_t vecs)
|
RE_AddSkySurface(msurface_t *fa)
|
||||||
{
|
{
|
||||||
int i;
|
R_AddSkySurface(fa, skymins, skymaxs, r_origin);
|
||||||
vec3_t v, av;
|
|
||||||
float s, t, dv;
|
|
||||||
int axis;
|
|
||||||
float *vp;
|
|
||||||
|
|
||||||
/* decide which face it maps to */
|
|
||||||
VectorCopy(vec3_origin, v);
|
|
||||||
|
|
||||||
for (i = 0, vp = vecs; i < nump; i++, vp += 3)
|
|
||||||
{
|
|
||||||
VectorAdd(vp, v, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
av[0] = fabs(v[0]);
|
|
||||||
av[1] = fabs(v[1]);
|
|
||||||
av[2] = fabs(v[2]);
|
|
||||||
|
|
||||||
if ((av[0] > av[1]) && (av[0] > av[2]))
|
|
||||||
{
|
|
||||||
if (v[0] < 0)
|
|
||||||
{
|
|
||||||
axis = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
axis = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((av[1] > av[2]) && (av[1] > av[0]))
|
|
||||||
{
|
|
||||||
if (v[1] < 0)
|
|
||||||
{
|
|
||||||
axis = 3;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
axis = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (v[2] < 0)
|
|
||||||
{
|
|
||||||
axis = 5;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
axis = 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* project new texture coords */
|
|
||||||
for (i = 0; i < nump; i++, vecs += 3)
|
|
||||||
{
|
|
||||||
int j;
|
|
||||||
|
|
||||||
j = vec_to_st[axis][2];
|
|
||||||
|
|
||||||
if (j > 0)
|
|
||||||
{
|
|
||||||
dv = vecs[j - 1];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dv = -vecs[-j - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dv < 0.001)
|
|
||||||
{
|
|
||||||
continue; /* don't divide by zero */
|
|
||||||
}
|
|
||||||
|
|
||||||
j = vec_to_st[axis][0];
|
|
||||||
|
|
||||||
if (j < 0)
|
|
||||||
{
|
|
||||||
s = -vecs[-j - 1] / dv;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s = vecs[j - 1] / dv;
|
|
||||||
}
|
|
||||||
|
|
||||||
j = vec_to_st[axis][1];
|
|
||||||
|
|
||||||
if (j < 0)
|
|
||||||
{
|
|
||||||
t = -vecs[-j - 1] / dv;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
t = vecs[j - 1] / dv;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s < skymins[0][axis])
|
|
||||||
{
|
|
||||||
skymins[0][axis] = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (t < skymins[1][axis])
|
|
||||||
{
|
|
||||||
skymins[1][axis] = t;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s > skymaxs[0][axis])
|
|
||||||
{
|
|
||||||
skymaxs[0][axis] = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (t > skymaxs[1][axis])
|
|
||||||
{
|
|
||||||
skymaxs[1][axis] = t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
R_ClipSkyPolygon(int nump, vec3_t vecs, int stage)
|
|
||||||
{
|
|
||||||
const float *norm;
|
|
||||||
float *v;
|
|
||||||
qboolean front, back;
|
|
||||||
float d, e;
|
|
||||||
float dists[MAX_CLIP_VERTS];
|
|
||||||
int sides[MAX_CLIP_VERTS];
|
|
||||||
vec3_t newv[2][MAX_CLIP_VERTS];
|
|
||||||
int newc[2];
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
if (nump > MAX_CLIP_VERTS - 2)
|
|
||||||
{
|
|
||||||
Com_Error(ERR_DROP, "%s: MAX_CLIP_VERTS", __func__);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stage == 6)
|
|
||||||
{
|
|
||||||
/* fully clipped, so draw it */
|
|
||||||
R_DrawSkyPolygon(nump, vecs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
front = back = false;
|
|
||||||
norm = skyclip[stage];
|
|
||||||
|
|
||||||
for (i = 0, v = vecs; i < nump; i++, v += 3)
|
|
||||||
{
|
|
||||||
d = DotProduct(v, norm);
|
|
||||||
|
|
||||||
if (d > ON_EPSILON)
|
|
||||||
{
|
|
||||||
front = true;
|
|
||||||
sides[i] = SIDE_FRONT;
|
|
||||||
}
|
|
||||||
else if (d < -ON_EPSILON)
|
|
||||||
{
|
|
||||||
back = true;
|
|
||||||
sides[i] = SIDE_BACK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sides[i] = SIDE_ON;
|
|
||||||
}
|
|
||||||
|
|
||||||
dists[i] = d;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!front || !back)
|
|
||||||
{
|
|
||||||
/* not clipped */
|
|
||||||
R_ClipSkyPolygon(nump, vecs, stage + 1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* clip it */
|
|
||||||
sides[i] = sides[0];
|
|
||||||
dists[i] = dists[0];
|
|
||||||
VectorCopy(vecs, (vecs + (i * 3)));
|
|
||||||
newc[0] = newc[1] = 0;
|
|
||||||
|
|
||||||
for (i = 0, v = vecs; i < nump; i++, v += 3)
|
|
||||||
{
|
|
||||||
switch (sides[i])
|
|
||||||
{
|
|
||||||
case SIDE_FRONT:
|
|
||||||
VectorCopy(v, newv[0][newc[0]]);
|
|
||||||
newc[0]++;
|
|
||||||
break;
|
|
||||||
case SIDE_BACK:
|
|
||||||
VectorCopy(v, newv[1][newc[1]]);
|
|
||||||
newc[1]++;
|
|
||||||
break;
|
|
||||||
case SIDE_ON:
|
|
||||||
VectorCopy(v, newv[0][newc[0]]);
|
|
||||||
newc[0]++;
|
|
||||||
VectorCopy(v, newv[1][newc[1]]);
|
|
||||||
newc[1]++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((sides[i] == SIDE_ON) ||
|
|
||||||
(sides[i + 1] == SIDE_ON) ||
|
|
||||||
(sides[i + 1] == sides[i]))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
d = dists[i] / (dists[i] - dists[i + 1]);
|
|
||||||
|
|
||||||
for (j = 0; j < 3; j++)
|
|
||||||
{
|
|
||||||
e = v[j] + d * (v[j + 3] - v[j]);
|
|
||||||
newv[0][newc[0]][j] = e;
|
|
||||||
newv[1][newc[1]][j] = e;
|
|
||||||
}
|
|
||||||
|
|
||||||
newc[0]++;
|
|
||||||
newc[1]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* continue */
|
|
||||||
R_ClipSkyPolygon(newc[0], newv[0][0], stage + 1);
|
|
||||||
R_ClipSkyPolygon(newc[1], newv[1][0], stage + 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
R_AddSkySurface(msurface_t *fa)
|
RE_ClearSkyBox(void)
|
||||||
{
|
{
|
||||||
int i;
|
R_ClearSkyBox(skymins, skymaxs);
|
||||||
vec3_t verts[MAX_CLIP_VERTS];
|
|
||||||
mpoly_t *p;
|
|
||||||
|
|
||||||
/* calculate vertex values for sky box */
|
|
||||||
for (p = fa->polys; p; p = p->next)
|
|
||||||
{
|
|
||||||
for (i = 0; i < p->numverts; i++)
|
|
||||||
{
|
|
||||||
VectorSubtract(p->verts[i].pos, r_origin, verts[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
R_ClipSkyPolygon(p->numverts, verts[0], 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
R_ClearSkyBox(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 6; i++)
|
|
||||||
{
|
|
||||||
skymins[0][i] = skymins[1][i] = 9999;
|
|
||||||
skymaxs[0][i] = skymaxs[1][i] = -9999;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in a new issue