From 03bfc581e24cf6d2a22f4519f5ec419fc3c84102 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Thu, 12 Oct 2023 00:29:47 +0300 Subject: [PATCH] gl1,gl3,gl4,vk: Parial share of warp code --- Makefile | 4 + src/client/refresh/files/warp.c | 310 ++++++++++++++++++++++++++ src/client/refresh/gl1/gl1_surf.c | 4 +- src/client/refresh/gl1/gl1_warp.c | 277 +---------------------- src/client/refresh/gl1/header/local.h | 4 +- src/client/refresh/gl3/gl3_surf.c | 4 +- src/client/refresh/gl3/gl3_warp.c | 277 +---------------------- src/client/refresh/gl3/header/local.h | 4 +- src/client/refresh/gl4/gl4_surf.c | 2 +- src/client/refresh/gl4/gl4_warp.c | 273 +---------------------- src/client/refresh/gl4/header/local.h | 2 +- src/client/refresh/ref_shared.h | 7 + src/client/refresh/vk/header/local.h | 4 +- src/client/refresh/vk/vk_surf.c | 4 +- src/client/refresh/vk/vk_warp.c | 277 +---------------------- 15 files changed, 353 insertions(+), 1100 deletions(-) create mode 100644 src/client/refresh/files/warp.c diff --git a/Makefile b/Makefile index c77d47de..566817c9 100644 --- a/Makefile +++ b/Makefile @@ -1004,6 +1004,7 @@ REFGL1_OBJS_ := \ src/client/refresh/files/pcx.o \ src/client/refresh/files/stb.o \ src/client/refresh/files/wal.o \ + src/client/refresh/files/warp.o \ src/client/refresh/files/pvs.o \ src/common/shared/shared.o \ src/common/shared/utils.o \ @@ -1039,6 +1040,7 @@ REFGL3_OBJS_ := \ src/client/refresh/files/pcx.o \ src/client/refresh/files/stb.o \ src/client/refresh/files/wal.o \ + src/client/refresh/files/warp.o \ src/client/refresh/files/pvs.o \ src/common/shared/shared.o \ src/common/shared/utils.o \ @@ -1080,6 +1082,7 @@ REFGL4_OBJS_ := \ src/client/refresh/files/pcx.o \ src/client/refresh/files/stb.o \ src/client/refresh/files/wal.o \ + src/client/refresh/files/warp.o \ src/client/refresh/files/pvs.o \ src/common/shared/shared.o \ src/common/cmodels.o \ @@ -1165,6 +1168,7 @@ REFVK_OBJS_ := \ src/client/refresh/files/pcx.o \ src/client/refresh/files/stb.o \ src/client/refresh/files/wal.o \ + src/client/refresh/files/warp.o \ src/client/refresh/files/pvs.o \ src/common/shared/shared.o \ src/common/shared/utils.o \ diff --git a/src/client/refresh/files/warp.c b/src/client/refresh/files/warp.c new file mode 100644 index 00000000..270d1d19 --- /dev/null +++ b/src/client/refresh/files/warp.c @@ -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; + } +} diff --git a/src/client/refresh/gl1/gl1_surf.c b/src/client/refresh/gl1/gl1_surf.c index d7542002..ed1ede90 100644 --- a/src/client/refresh/gl1/gl1_surf.c +++ b/src/client/refresh/gl1/gl1_surf.c @@ -892,7 +892,7 @@ R_RecursiveWorldNode(entity_t *currententity, mnode_t *node) if (surf->texinfo->flags & SURF_SKY) { /* just adds to visible sky bounds */ - R_AddSkySurface(surf); + RE_AddSkySurface(surf); } else if (surf->texinfo->flags & (SURF_TRANS33 | SURF_TRANS66)) { @@ -943,7 +943,7 @@ R_DrawWorld(void) glColor4f(1, 1, 1, 1); memset(gl_lms.lightmap_surfaces, 0, sizeof(gl_lms.lightmap_surfaces)); - R_ClearSkyBox(); + RE_ClearSkyBox(); R_RecursiveWorldNode(&ent, r_worldmodel->nodes); R_DrawTextureChains(&ent); R_BlendLightmaps(currentmodel); diff --git a/src/client/refresh/gl1/gl1_warp.c b/src/client/refresh/gl1/gl1_warp.c index 7e205c08..e50065b2 100644 --- a/src/client/refresh/gl1/gl1_warp.c +++ b/src/client/refresh/gl1/gl1_warp.c @@ -48,15 +48,6 @@ float r_turbsin[] = { #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] = { {3, -1, 2}, {-3, 1, 2}, @@ -68,17 +59,6 @@ static const int st_to_vec[6][3] = { {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 sky_min, sky_max; @@ -153,263 +133,16 @@ R_EmitWaterPolys(msurface_t *fa) YQ2_VLAFREE( tex ); } -static void -R_DrawSkyPolygon(int nump, vec3_t vecs) +void +RE_AddSkySurface(msurface_t *fa) { - 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); + R_AddSkySurface(fa, skymins, skymaxs, r_origin); } void -R_AddSkySurface(msurface_t *fa) +RE_ClearSkyBox(void) { - 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); - } -} - -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; - } + R_ClearSkyBox(skymins, skymaxs); } static void diff --git a/src/client/refresh/gl1/header/local.h b/src/client/refresh/gl1/header/local.h index 412a0b5b..2daedf13 100644 --- a/src/client/refresh/gl1/header/local.h +++ b/src/client/refresh/gl1/header/local.h @@ -257,8 +257,8 @@ void R_MarkLeaves(void); extern int r_dlightframecount; mpoly_t *WaterWarpPolyVerts(mpoly_t *p); void R_EmitWaterPolys(msurface_t *fa); -void R_AddSkySurface(msurface_t *fa); -void R_ClearSkyBox(void); +void RE_AddSkySurface(msurface_t *fa); +void RE_ClearSkyBox(void); void R_DrawSkyBox(void); void R_MarkSurfaceLights(dlight_t *light, int bit, mnode_t *node, int r_dlightframecount); diff --git a/src/client/refresh/gl3/gl3_surf.c b/src/client/refresh/gl3/gl3_surf.c index e9c3847d..a0156d49 100644 --- a/src/client/refresh/gl3/gl3_surf.c +++ b/src/client/refresh/gl3/gl3_surf.c @@ -723,7 +723,7 @@ RecursiveWorldNode(entity_t *currententity, mnode_t *node) if (surf->texinfo->flags & SURF_SKY) { /* just adds to visible sky bounds */ - R_AddSkySurface(surf); + RE_AddSkySurface(surf); } else if (surf->texinfo->flags & (SURF_TRANS33 | SURF_TRANS66)) { @@ -780,7 +780,7 @@ GL3_DrawWorld(void) gl3state.currenttexture = -1; - R_ClearSkyBox(); + RE_ClearSkyBox(); RecursiveWorldNode(&ent, gl3_worldmodel->nodes); DrawTextureChains(&ent); GL3_DrawSkyBox(); diff --git a/src/client/refresh/gl3/gl3_warp.c b/src/client/refresh/gl3/gl3_warp.c index ca70a358..29d9b4ef 100644 --- a/src/client/refresh/gl3/gl3_warp.c +++ b/src/client/refresh/gl3/gl3_warp.c @@ -92,15 +92,6 @@ static const int skytexorder[6] = {0, 2, 1, 3, 4, 5}; /* 3dstudio environment map names */ 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] = { {3, -1, 2}, {-3, 1, 2}, @@ -112,17 +103,6 @@ static const int st_to_vec[6][3] = { {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 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; } -static void -R_DrawSkyPolygon(int nump, vec3_t vecs) +void +RE_AddSkySurface(msurface_t *fa) { - 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); + R_AddSkySurface(fa, skymins, skymaxs, gl3_origin); } void -R_AddSkySurface(msurface_t *fa) +RE_ClearSkyBox(void) { - 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, 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; - } + R_ClearSkyBox(skymins, skymaxs); } static void diff --git a/src/client/refresh/gl3/header/local.h b/src/client/refresh/gl3/header/local.h index 39ca8ba8..307a8eea 100644 --- a/src/client/refresh/gl3/header/local.h +++ b/src/client/refresh/gl3/header/local.h @@ -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_DrawSkyBox(void); -extern void R_ClearSkyBox(void); -extern void R_AddSkySurface(msurface_t *fa); +extern void RE_ClearSkyBox(void); +extern void RE_AddSkySurface(msurface_t *fa); // gl3_surf.c diff --git a/src/client/refresh/gl4/gl4_surf.c b/src/client/refresh/gl4/gl4_surf.c index dba40b23..5c153f83 100644 --- a/src/client/refresh/gl4/gl4_surf.c +++ b/src/client/refresh/gl4/gl4_surf.c @@ -780,7 +780,7 @@ GL4_DrawWorld(void) gl4state.currenttexture = -1; - R_ClearSkyBox(); + RE_ClearSkyBox(); RecursiveWorldNode(&ent, gl4_worldmodel->nodes); DrawTextureChains(&ent); GL4_DrawSkyBox(); diff --git a/src/client/refresh/gl4/gl4_warp.c b/src/client/refresh/gl4/gl4_warp.c index d351c442..5b6eea2b 100644 --- a/src/client/refresh/gl4/gl4_warp.c +++ b/src/client/refresh/gl4/gl4_warp.c @@ -92,15 +92,6 @@ static const int skytexorder[6] = {0, 2, 1, 3, 4, 5}; /* 3dstudio environment map names */ 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] = { {3, -1, 2}, {-3, 1, 2}, @@ -112,17 +103,6 @@ static const int st_to_vec[6][3] = { {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 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; } -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 GL4_AddSkySurface(msurface_t *fa) { - 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, gl4_origin, verts[i]); - } - - R_ClipSkyPolygon(p->numverts, verts[0], 0); - } + R_AddSkySurface(fa, skymins, skymaxs, gl4_origin); } void -R_ClearSkyBox(void) +RE_ClearSkyBox(void) { - int i; - - for (i = 0; i < 6; i++) - { - skymins[0][i] = skymins[1][i] = 9999; - skymaxs[0][i] = skymaxs[1][i] = -9999; - } + R_ClearSkyBox(skymins, skymaxs); } static void diff --git a/src/client/refresh/gl4/header/local.h b/src/client/refresh/gl4/header/local.h index b942db89..10c792bb 100644 --- a/src/client/refresh/gl4/header/local.h +++ b/src/client/refresh/gl4/header/local.h @@ -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_DrawSkyBox(void); -extern void R_ClearSkyBox(void); +extern void RE_ClearSkyBox(void); extern void GL4_AddSkySurface(msurface_t *fa); diff --git a/src/client/refresh/ref_shared.h b/src/client/refresh/ref_shared.h index c4359a02..ffd6f504 100644 --- a/src/client/refresh/ref_shared.h +++ b/src/client/refresh/ref_shared.h @@ -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, 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_ */ diff --git a/src/client/refresh/vk/header/local.h b/src/client/refresh/vk/header/local.h index e1d833ee..1b3c2b57 100644 --- a/src/client/refresh/vk/header/local.h +++ b/src/client/refresh/vk/header/local.h @@ -203,8 +203,8 @@ void R_MarkLeaves(void); void EmitWaterPolys(msurface_t *fa, image_t *texture, float *modelMatrix, const float *color, qboolean solid_surface); -void R_AddSkySurface(msurface_t *fa); -void R_ClearSkyBox(void); +void RE_AddSkySurface(msurface_t *fa); +void RE_ClearSkyBox(void); void R_DrawSkyBox(void); void R_MarkSurfaceLights(dlight_t *light, int bit, mnode_t *node, int r_dlightframecount); diff --git a/src/client/refresh/vk/vk_surf.c b/src/client/refresh/vk/vk_surf.c index f14c95ba..b7c55560 100644 --- a/src/client/refresh/vk/vk_surf.c +++ b/src/client/refresh/vk/vk_surf.c @@ -853,7 +853,7 @@ R_RecursiveWorldNode(entity_t *currententity, mnode_t *node) if (surf->texinfo->flags & SURF_SKY) { /* just adds to visible sky bounds */ - R_AddSkySurface(surf); + RE_AddSkySurface(surf); } 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)); - R_ClearSkyBox(); + RE_ClearSkyBox(); R_RecursiveWorldNode(&ent, r_worldmodel->nodes); /* diff --git a/src/client/refresh/vk/vk_warp.c b/src/client/refresh/vk/vk_warp.c index c6ce151a..d378f968 100644 --- a/src/client/refresh/vk/vk_warp.c +++ b/src/client/refresh/vk/vk_warp.c @@ -39,15 +39,6 @@ static const int skytexorder[6] = {0, 2, 1, 3, 4, 5}; /* 3dstudio environment map names */ 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] = { {3, -1, 2}, {-3, 1, 2}, @@ -59,17 +50,6 @@ static const int st_to_vec[6][3] = { {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 sky_min, sky_max; @@ -182,263 +162,16 @@ EmitWaterPolys(msurface_t *fa, image_t *texture, float *modelMatrix, } } -static void -R_DrawSkyPolygon(int nump, vec3_t vecs) +void +RE_AddSkySurface(msurface_t *fa) { - 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); + R_AddSkySurface(fa, skymins, skymaxs, r_origin); } void -R_AddSkySurface(msurface_t *fa) +RE_ClearSkyBox(void) { - 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); - } -} - -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; - } + R_ClearSkyBox(skymins, skymaxs); } static void