mirror of
https://git.code.sf.net/p/quake/newtree
synced 2024-11-25 21:41:57 +00:00
try to insert the cube vertexen into the correct spot in the face poly vertex
list.
This commit is contained in:
parent
c36a485851
commit
141fb8b7a5
1 changed files with 57 additions and 23 deletions
|
@ -30,6 +30,8 @@
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "console.h"
|
#include "console.h"
|
||||||
#include "glquake.h"
|
#include "glquake.h"
|
||||||
|
|
||||||
|
@ -54,8 +56,12 @@ static const vec_t face_offset[] = {1024, 1024, 1024, -1024, -1024, -1024};
|
||||||
|
|
||||||
/* our cube */
|
/* our cube */
|
||||||
struct box_def {
|
struct box_def {
|
||||||
int tex, enter, leave;
|
int tex; // texture to bind to
|
||||||
glpoly_t poly;
|
int enter_face; // cube face this face was entered from
|
||||||
|
int leave_face; // cube face departed to
|
||||||
|
int enter_vertex; // vertex number entered on
|
||||||
|
int leave_vertex; // vertex number left on
|
||||||
|
glpoly_t poly; // describe the polygon of this face
|
||||||
float verts[32][VERTEXSIZE];
|
float verts[32][VERTEXSIZE];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -156,9 +162,8 @@ find_intersect (int face1, vec3_t x1, int face2, vec3_t x2, vec3_t y)
|
||||||
(wish I could find a cleaner way of calculating s and t).
|
(wish I could find a cleaner way of calculating s and t).
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
set_vertex (struct box_def *box, vec3_t v, int face)
|
set_vertex (struct box_def *box, int face, int ind, vec3_t v)
|
||||||
{
|
{
|
||||||
int ind = box[face].poly.numverts++;
|
|
||||||
VectorCopy (v, box[face].poly.verts[ind]);
|
VectorCopy (v, box[face].poly.verts[ind]);
|
||||||
VectorAdd (v, r_refdef.vieworg, box[face].poly.verts[ind]);
|
VectorAdd (v, r_refdef.vieworg, box[face].poly.verts[ind]);
|
||||||
switch (face) {
|
switch (face) {
|
||||||
|
@ -189,6 +194,15 @@ set_vertex (struct box_def *box, vec3_t v, int face)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
add_vertex
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
add_vertex (struct box_def *box, int face, vec3_t v)
|
||||||
|
{
|
||||||
|
set_vertex (box, face, box[face].poly.numverts++, v);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
find_cube_vertex
|
find_cube_vertex
|
||||||
|
|
||||||
|
@ -215,15 +229,16 @@ find_cube_vertex (int face1, int face2, int face3, vec3_t v)
|
||||||
static void
|
static void
|
||||||
enter_face (struct box_def *box, int prev_face, int face)
|
enter_face (struct box_def *box, int prev_face, int face)
|
||||||
{
|
{
|
||||||
if (box[face].leave >=0 && (box[face].leave % 3) != (prev_face % 3)) {
|
if (box[face].leave_face >=0 && (box[face].leave_face % 3) != (prev_face % 3)) {
|
||||||
vec3_t t;
|
vec3_t t;
|
||||||
find_cube_vertex (prev_face, face, box[face].leave, t);
|
box[face].enter_vertex = box[face].poly.numverts;
|
||||||
set_vertex(box, t, face);
|
find_cube_vertex (prev_face, face, box[face].leave_face, t);
|
||||||
box[face].enter = -1;
|
add_vertex(box, face, t);
|
||||||
|
box[face].enter_face = -1;
|
||||||
} else {
|
} else {
|
||||||
box[face].enter = prev_face;
|
box[face].enter_face = prev_face;
|
||||||
}
|
}
|
||||||
box[face].leave = -1;
|
box[face].leave_face = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -235,15 +250,16 @@ enter_face (struct box_def *box, int prev_face, int face)
|
||||||
static void
|
static void
|
||||||
leave_face (struct box_def *box, int prev_face, int face)
|
leave_face (struct box_def *box, int prev_face, int face)
|
||||||
{
|
{
|
||||||
if (box[prev_face].enter >=0 && (box[prev_face].enter) % 3 != (face % 3)) {
|
if (box[prev_face].enter_face >=0 && (box[prev_face].enter_face) % 3 != (face % 3)) {
|
||||||
vec3_t t;
|
vec3_t t;
|
||||||
find_cube_vertex (prev_face, face, box[prev_face].enter, t);
|
box[face].leave_vertex = box[face].poly.numverts;
|
||||||
set_vertex(box, t, prev_face);
|
find_cube_vertex (prev_face, face, box[prev_face].enter_face, t);
|
||||||
box[prev_face].leave = -1;
|
add_vertex(box, prev_face, t);
|
||||||
|
box[prev_face].leave_face = -1;
|
||||||
} else {
|
} else {
|
||||||
box[prev_face].leave = face;
|
box[prev_face].leave_face = face;
|
||||||
}
|
}
|
||||||
box[prev_face].enter = -1;
|
box[prev_face].enter_face = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -285,11 +301,29 @@ fixup_center_face (struct box_def *box, int c_face)
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
find_cube_vertex (c_face, face_loop[c_face][i],
|
find_cube_vertex (c_face, face_loop[c_face][i],
|
||||||
face_loop[c_face][i + 1], v[i]);
|
face_loop[c_face][i + 1], v[i]);
|
||||||
set_vertex(box, v[i], c_face);
|
add_vertex(box, c_face, v[i]);
|
||||||
}
|
}
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
set_vertex (box, v[i], face_loop[c_face][i]);
|
int ind = face_loop[c_face][i];
|
||||||
set_vertex (box, v[(i - 1) & 3], face_loop[c_face][i]);
|
|
||||||
|
if (box[ind].leave_vertex == box[ind].poly.numverts - 1) {
|
||||||
|
// the vertex the sky poly left this cube fase through is very
|
||||||
|
// conveniently the last vertex of the face poly. this means we
|
||||||
|
// can just append the two vetexen
|
||||||
|
add_vertex (box, ind, v[i]);
|
||||||
|
add_vertex (box, ind, v[(i - 1) & 3]);
|
||||||
|
} else {
|
||||||
|
// we have to insert the two cube vertexen into the face poly
|
||||||
|
// vertex list
|
||||||
|
int ins = box[ind].leave_vertex + 1;
|
||||||
|
glpoly_t *p = &box[ind].poly;
|
||||||
|
const int vert_size = sizeof (p->verts[0]);
|
||||||
|
|
||||||
|
memmove (p->verts[ins + 2], p->verts[ins], 2 * vert_size);
|
||||||
|
p->numverts += 2;
|
||||||
|
set_vertex (box, ind, ins, v[i]);
|
||||||
|
set_vertex (box, ind, ins + 1, v[(i - 1) & 3]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,10 +343,10 @@ cross_cube_edge (struct box_def *box, int face1, vec3_t v1, int face2,
|
||||||
|
|
||||||
find_intersect (face1, v1, face2, v2, l);
|
find_intersect (face1, v1, face2, v2, l);
|
||||||
|
|
||||||
set_vertex(box, l, face1);
|
add_vertex(box, face1, l);
|
||||||
leave_face (box, face1, face2);
|
leave_face (box, face1, face2);
|
||||||
enter_face (box, face1, face2);
|
enter_face (box, face1, face2);
|
||||||
set_vertex(box, l, face2);
|
add_vertex(box, face2, l);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -333,7 +367,7 @@ R_DrawSkyBoxPoly (glpoly_t *poly)
|
||||||
memset (box, 0, sizeof (box));
|
memset (box, 0, sizeof (box));
|
||||||
for (i = 0; i < 6; i++) {
|
for (i = 0; i < 6; i++) {
|
||||||
box[i].tex = SKY_TEX + skytex_offs[i];
|
box[i].tex = SKY_TEX + skytex_offs[i];
|
||||||
box[i].enter = box[i].leave = -1;
|
box[i].enter_face = box[i].leave_face = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (poly->numverts>=32) {
|
if (poly->numverts>=32) {
|
||||||
|
@ -363,7 +397,7 @@ R_DrawSkyBoxPoly (glpoly_t *poly)
|
||||||
cross_cube_edge (box, prev_face, last_v, face, v);
|
cross_cube_edge (box, prev_face, last_v, face, v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
set_vertex(box, v, face);
|
add_vertex(box, face, v);
|
||||||
|
|
||||||
VectorCopy (v, last_v);
|
VectorCopy (v, last_v);
|
||||||
prev_face = face;
|
prev_face = face;
|
||||||
|
|
Loading…
Reference in a new issue