pass though indent, correct a comment and change vertexen to vertices

This commit is contained in:
Bill Currie 2000-12-02 06:09:18 +00:00
parent c90adba9dc
commit bd47fcf241

View file

@ -42,6 +42,7 @@ extern vec5_t skyvec[6][4];
/* cube face to sky texture offset conversion */ /* cube face to sky texture offset conversion */
static const int skytex_offs[] = { 3, 0, 4, 1, 2, 5 }; static const int skytex_offs[] = { 3, 0, 4, 1, 2, 5 };
/* clockwise loop through the cube faces adjoining the current face */ /* clockwise loop through the cube faces adjoining the current face */
static const int face_loop[6][5] = { static const int face_loop[6][5] = {
{1, 2, 4, 5, 1}, {1, 2, 4, 5, 1},
@ -51,16 +52,20 @@ static const int face_loop[6][5] = {
{0, 2, 3, 5, 0}, {0, 2, 3, 5, 0},
{0, 4, 3, 1, 0}, {0, 4, 3, 1, 0},
}; };
/* convert axis and face distance into face */ /* convert axis and face distance into face */
static const int faces_table[3][6] = { static const int faces_table[3][6] = {
{-1, 0, 0, -1, 3, 3}, {-1, 0, 0, -1, 3, 3},
{-1, 4, 4, -1, 1, 1}, {-1, 4, 4, -1, 1, 1},
{-1, 2, 2, -1, 5, 5}, {-1, 2, 2, -1, 5, 5},
}; };
/* convert face magic bit mask to index into visit array */ /* convert face magic bit mask to index into visit array */
static const int faces_bit_magic[] = { 2, 1, -1, 0, 3, -1, 4, -1 }; static const int faces_bit_magic[] = { 2, 1, -1, 0, 3, -1, 4, -1 };
/* axis the cube face cuts (also index into vec3_t and n % 3 for 0 <= n < 6) */ /* axis the cube face cuts (also index into vec3_t and n % 3 for 0 <= n < 6) */
static const int face_axis[] = { 0, 1, 2, 0, 1, 2 }; static const int face_axis[] = { 0, 1, 2, 0, 1, 2 };
/* offset on the axis the cube face cuts */ /* offset on the axis the cube face cuts */
static const vec_t face_offset[] = { 1024, 1024, 1024, -1024, -1024, -1024 }; static const vec_t face_offset[] = { 1024, 1024, 1024, -1024, -1024, -1024 };
@ -152,11 +157,15 @@ determine_face (vec3_t v)
static int static int
find_intersect (int face1, vec3_t x1, int face2, vec3_t x2, vec3_t y) find_intersect (int face1, vec3_t x1, int face2, vec3_t x2, vec3_t y)
{ {
vec3_t n; // normal to the plane formed by the eye and vec3_t n; // normal to the plane formed by the
// the two points on the cube. // eye and the two points on the cube.
vec3_t x = {0, 0, 0}; // point on cube edge of adjoining faces.
// always on an axis plane. vec3_t x = { 0, 0, 0 }; // point on cube edge of adjoining
vec3_t v = {0, 0, 0}; // direction vector of cube edge. always +ve // faces. always on an axis plane.
vec3_t v = { 0, 0, 0 }; // direction vector of cube edge.
// always +ve
vec_t x_n, v_n; // x.n and v.n vec_t x_n, v_n; // x.n and v.n
int axis; int axis;
vec3_t t; vec3_t t;
@ -247,13 +256,14 @@ add_vertex (struct box_def *box, int face, vec3_t v)
} }
/* /*
insert_cube_vertexen insert_cube_vertices
insert the given cube vertexen into the vertex list of the poly in the insert the given cube vertices into the vertex list of the poly in the
correct location. correct location.
*/ */
static void static void
insert_cube_vertexen (struct box_def *box, struct visit_def visit, int count, ...) insert_cube_vertices (struct box_def *box, struct visit_def visit, int count,
...)
{ {
int i; int i;
vec3_t **v; vec3_t **v;
@ -263,6 +273,7 @@ insert_cube_vertexen (struct box_def *box, struct visit_def visit, int count, ..
va_start (args, count); va_start (args, count);
v = (vec3_t **) alloca (count * sizeof (vec3_t *)); v = (vec3_t **) alloca (count * sizeof (vec3_t *));
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
v[i] = va_arg (args, vec3_t *); v[i] = va_arg (args, vec3_t *);
} }
@ -271,15 +282,16 @@ insert_cube_vertexen (struct box_def *box, struct visit_def visit, int count, ..
if (ind == box->face[face].poly.numverts) { if (ind == box->face[face].poly.numverts) {
// the vertex the sky poly left this cube fase through is very // the vertex the sky poly left this cube fase through is very
// conveniently the last vertex of the face poly. this means we // conveniently the last vertex of the face poly. this means we
// can just append the two vetexen // can just append the vetexen
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
add_vertex (box, face, *v[i]); add_vertex (box, face, *v[i]);
} else { } else {
// we have to insert the cube vertexen into the face poly // we have to insert the cube vertices into the face poly
// vertex list // vertex list
glpoly_t *p = &box->face[face].poly; glpoly_t *p = &box->face[face].poly;
int c = p->numverts - ind; int c = p->numverts - ind;
const int vert_size = sizeof (p->verts[0]); const int vert_size = sizeof (p->verts[0]);
memmove (p->verts[ind + count], p->verts[ind], c * vert_size); memmove (p->verts[ind + count], p->verts[ind], c * vert_size);
p->numverts += count; p->numverts += count;
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
@ -310,12 +322,14 @@ cross_cube_edge (struct box_def *box, int face1, vec3_t v1, int face2,
face = axis + 3; face = axis + 3;
if (face > 0) { if (face > 0) {
vec3_t x; vec3_t x;
VectorAdd (v1, v2, x); VectorAdd (v1, v2, x);
VectorScale (x, 0.5, x); VectorScale (x, 0.5, x);
cross_cube_edge (box, face1, v1, face, x); cross_cube_edge (box, face1, v1, face, x);
cross_cube_edge (box, face, x, face2, v2); cross_cube_edge (box, face, x, face2, v2);
} else { } else {
struct visit_def *visit = box->visited_faces; struct visit_def *visit = box->visited_faces;
visit[box->face_count - 1].leave = box->face[face1].poly.numverts; visit[box->face_count - 1].leave = box->face[face1].poly.numverts;
visit[box->face_count].face = face2; visit[box->face_count].face = face2;
box->face_count++; box->face_count++;
@ -360,10 +374,11 @@ process_corners (struct box_def *box)
// one corner, no edges // one corner, no edges
{ {
vec3_t v; vec3_t v;
find_cube_vertex (visit[0].face, visit[1].face, visit[2].face, v); find_cube_vertex (visit[0].face, visit[1].face, visit[2].face, v);
insert_cube_vertexen (box, visit[0], 1, v); insert_cube_vertices (box, visit[0], 1, v);
insert_cube_vertexen (box, visit[1], 1, v); insert_cube_vertices (box, visit[1], 1, v);
insert_cube_vertexen (box, visit[2], 1, v); insert_cube_vertices (box, visit[2], 1, v);
} }
break; break;
case 4: case 4:
@ -371,7 +386,7 @@ process_corners (struct box_def *box)
return; return;
if (abs (visit[2].face - visit[0].face) == 3 if (abs (visit[2].face - visit[0].face) == 3
&& abs (visit[3].face - visit[1].face) == 3) { && abs (visit[3].face - visit[1].face) == 3) {
// 4 vertexen // 4 vertices
int sum, diff; int sum, diff;
vec3_t v[4]; vec3_t v[4];
@ -382,13 +397,14 @@ process_corners (struct box_def *box)
center = faces_table[sum][diff]; center = faces_table[sum][diff];
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
find_cube_vertex (visit[i].face, visit[(i + 1) & 3].face, center, v[i]); find_cube_vertex (visit[i].face, visit[(i + 1) & 3].face,
center, v[i]);
add_vertex (box, center, v[i]); add_vertex (box, center, v[i]);
} }
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
insert_cube_vertexen (box, visit[i], 2, v[i], v[(i - 1) & 3]); insert_cube_vertices (box, visit[i], 2, v[i], v[(i - 1) & 3]);
} else { } else {
// 2 vertexen // 2 vertices
int l_f, t_f, r_f, b_f; int l_f, t_f, r_f, b_f;
vec3_t v_l, v_r; vec3_t v_l, v_r;
@ -405,45 +421,54 @@ process_corners (struct box_def *box)
} else { } else {
return; return;
} }
find_cube_vertex (visit[l_f].face, visit[t_f].face, visit[b_f].face, v_l); find_cube_vertex (visit[l_f].face, visit[t_f].face, visit[b_f].face,
find_cube_vertex (visit[r_f].face, visit[t_f].face, visit[b_f].face, v_r); v_l);
find_cube_vertex (visit[r_f].face, visit[t_f].face, visit[b_f].face,
v_r);
insert_cube_vertexen (box, visit[t_f], 2, v_r, v_l); insert_cube_vertices (box, visit[t_f], 2, v_r, v_l);
insert_cube_vertexen (box, visit[b_f], 2, v_l, v_r); insert_cube_vertices (box, visit[b_f], 2, v_l, v_r);
insert_cube_vertexen (box, visit[l_f], 1, v_l); insert_cube_vertices (box, visit[l_f], 1, v_l);
insert_cube_vertexen (box, visit[r_f], 1, v_r); insert_cube_vertices (box, visit[r_f], 1, v_r);
} }
break; break;
case 5: case 5:
if (max_visit > 1) { if (max_visit > 1) {
// one vertex // one vertex
vec3_t v; vec3_t v;
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
// don't need to check the 5th visit // don't need to check the 5th visit
if (visit[(i + 2) % 5].face == visit[(i + 4) % 5].face) if (visit[(i + 2) % 5].face == visit[(i + 4) % 5].face)
break; break;
} }
find_cube_vertex (visit[i].face, visit[(i + 1) % 5].face, visit[(i + 2) % 5].face, v); find_cube_vertex (visit[i].face, visit[(i + 1) % 5].face,
insert_cube_vertexen (box, visit[i], 1, v); visit[(i + 2) % 5].face, v);
insert_cube_vertexen (box, visit[(i + 1) % 5], 1, v); insert_cube_vertices (box, visit[i], 1, v);
insert_cube_vertexen (box, visit[(i + 4) % 5], 1, v); insert_cube_vertices (box, visit[(i + 1) % 5], 1, v);
insert_cube_vertices (box, visit[(i + 4) % 5], 1, v);
} else { } else {
// 3 vertexen // 3 vertices
unsigned int sel = (((abs (visit[2].face - visit[0].face) == 3) << 2) unsigned int sel =
| ((abs (visit[3].face - visit[1].face) == 3) << 1) (((abs (visit[2].face - visit[0].face) == 3) << 2) |
((abs (visit[3].face - visit[1].face) == 3) << 1)
| ((abs (visit[4].face - visit[2].face) == 3) << 0)); | ((abs (visit[4].face - visit[2].face) == 3) << 0));
vec3_t v[3]; vec3_t v[3];
center = faces_bit_magic[sel]; center = faces_bit_magic[sel];
printf ("%02o %d %d %d %d %d %d\n", sel, center, visit[0].face, visit[1].face, visit[2].face, visit[3].face, visit[4].face); printf ("%02o %d %d %d %d %d %d\n", sel, center, visit[0].face,
visit[1].face, visit[2].face, visit[3].face, visit[4].face);
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
find_cube_vertex (visit[center].face, visit[(center + 1 + i) % 5].face, visit[(center + 2 + i) % 5].face, v[i]); find_cube_vertex (visit[center].face,
insert_cube_vertexen (box, visit[center], 3, v[0], v[1], v[2]); visit[(center + 1 + i) % 5].face,
insert_cube_vertexen (box, visit[(center + 1) % 5], 1, v[0]); visit[(center + 2 + i) % 5].face, v[i]);
insert_cube_vertexen (box, visit[(center + 2) % 5], 2, v[1], v[0]); insert_cube_vertices (box, visit[center], 3, v[0], v[1], v[2]);
insert_cube_vertexen (box, visit[(center + 3) % 5], 2, v[2], v[1]); insert_cube_vertices (box, visit[(center + 1) % 5], 1, v[0]);
insert_cube_vertexen (box, visit[(center + 4) % 5], 1, v[2]); insert_cube_vertices (box, visit[(center + 2) % 5], 2, v[1], v[0]);
insert_cube_vertices (box, visit[(center + 3) % 5], 2, v[2], v[1]);
insert_cube_vertices (box, visit[(center + 4) % 5], 1, v[2]);
} }
break; break;
case 6: case 6:
@ -456,32 +481,36 @@ process_corners (struct box_def *box)
break; break;
} }
if (visit[(i + 3) % 6].face == visit[(i + 5) % 6].face) { if (visit[(i + 3) % 6].face == visit[(i + 5) % 6].face) {
// adjacant vertexen // adjacant vertices
vec3_t v[2]; vec3_t v[2];
find_cube_vertex (visit[i].face, visit[(i + 1) % 6].face, visit[(i + 2) % 6].face, v[0]); find_cube_vertex (visit[i].face, visit[(i + 1) % 6].face,
find_cube_vertex (visit[(i + 1) % 6].face, visit[(i + 2) % 6].face, visit[(i + 3) % 6].face, v[1]); visit[(i + 2) % 6].face, v[0]);
find_cube_vertex (visit[(i + 1) % 6].face, visit[(i + 2) % 6].face,
visit[(i + 3) % 6].face, v[1]);
insert_cube_vertexen (box, visit[(i + 5) % 6], 2, v[2], v[1]); insert_cube_vertices (box, visit[(i + 5) % 6], 2, v[2], v[1]);
insert_cube_vertexen (box, visit[i], 1, v[0]); insert_cube_vertices (box, visit[i], 1, v[0]);
insert_cube_vertexen (box, visit[(i + 1) % 6], 2, v[1], v[0]); insert_cube_vertices (box, visit[(i + 1) % 6], 2, v[1], v[0]);
insert_cube_vertexen (box, visit[(i + 2) % 6], 1, v[1]); insert_cube_vertices (box, visit[(i + 2) % 6], 1, v[1]);
} else { } else {
// opposing vertexen // opposing vertices
vec3_t v[2]; vec3_t v[2];
find_cube_vertex (visit[i].face, visit[(i + 1) % 6].face, visit[(i + 2) % 6].face, v[0]); find_cube_vertex (visit[i].face, visit[(i + 1) % 6].face,
find_cube_vertex (visit[(i + 3) % 6].face, visit[(i + 4) % 6].face, visit[(i + 5) % 6].face, v[1]); visit[(i + 2) % 6].face, v[0]);
find_cube_vertex (visit[(i + 3) % 6].face, visit[(i + 4) % 6].face,
visit[(i + 5) % 6].face, v[1]);
insert_cube_vertexen (box, visit[i], 1, v[0]); insert_cube_vertices (box, visit[i], 1, v[0]);
insert_cube_vertexen (box, visit[(i + 1) % 6], 1, v[0]); insert_cube_vertices (box, visit[(i + 1) % 6], 1, v[0]);
insert_cube_vertexen (box, visit[(i + 3) % 6], 1, v[1]); insert_cube_vertices (box, visit[(i + 3) % 6], 1, v[1]);
insert_cube_vertexen (box, visit[(i + 4) % 6], 1, v[1]); insert_cube_vertices (box, visit[(i + 4) % 6], 1, v[1]);
insert_cube_vertexen (box, visit[(i + 2) % 6], 1, v[1]); insert_cube_vertices (box, visit[(i + 2) % 6], 1, v[1]);
insert_cube_vertexen (box, visit[(i + 5) % 6], 1, v[0]); insert_cube_vertices (box, visit[(i + 5) % 6], 1, v[0]);
} }
break; break;
case 7: case 7:
@ -493,11 +522,13 @@ process_corners (struct box_def *box)
} }
{ {
vec3_t v; vec3_t v;
find_cube_vertex (visit[i].face, visit[(i + 1) % 6].face, visit[(i + 2) % 6].face, v);
insert_cube_vertexen (box, visit[i], 1, v); find_cube_vertex (visit[i].face, visit[(i + 1) % 6].face,
insert_cube_vertexen (box, visit[(i + 1) % 7], 1, v); visit[(i + 2) % 6].face, v);
insert_cube_vertexen (box, visit[(i + 6) % 7], 1, v);
insert_cube_vertices (box, visit[i], 1, v);
insert_cube_vertices (box, visit[(i + 1) % 7], 1, v);
insert_cube_vertices (box, visit[(i + 6) % 7], 1, v);
} }
break; break;
} }
@ -506,7 +537,7 @@ process_corners (struct box_def *box)
/* /*
render_box render_box
draws all faces of the cube with 3 or more vertexen. draws all faces of the cube with 3 or more vertices.
*/ */
static void static void
render_box (struct box_def *box) render_box (struct box_def *box)
@ -531,9 +562,11 @@ R_DrawSkyBoxPoly (glpoly_t *poly)
{ {
int i; int i;
struct box_def box; struct box_def box;
/* projected vertex and face of the previous sky poly vertex */ /* projected vertex and face of the previous sky poly vertex */
vec3_t last_v; vec3_t last_v;
int prev_face; int prev_face;
/* projected vertex and face of the current sky poly vertex */ /* projected vertex and face of the current sky poly vertex */
vec3_t v; vec3_t v;
int face; int face;
@ -603,10 +636,12 @@ void
R_DrawSkyChain (msurface_t *sky_chain) R_DrawSkyChain (msurface_t *sky_chain)
{ {
msurface_t *sc = sky_chain; msurface_t *sc = sky_chain;
if (skyloaded) { if (skyloaded) {
glDepthRange (gldepthmax, gldepthmax); glDepthRange (gldepthmax, gldepthmax);
while (sc) { while (sc) {
glpoly_t *p = sc->polys; glpoly_t *p = sc->polys;
while (p) { while (p) {
R_DrawSkyBoxPoly (p); R_DrawSkyBoxPoly (p);
p = p->next; p = p->next;
@ -617,6 +652,7 @@ R_DrawSkyChain (msurface_t *sky_chain)
} else { } else {
while (sc) { while (sc) {
glpoly_t *p = sc->polys; glpoly_t *p = sc->polys;
while (p) { while (p) {
R_DrawSkyDomePoly (p); R_DrawSkyDomePoly (p);
p = p->next; p = p->next;
@ -630,8 +666,10 @@ R_DrawSkyChain (msurface_t *sky_chain)
glColor3f (1, 1, 1); glColor3f (1, 1, 1);
while (sc) { while (sc) {
glpoly_t *p = sc->polys; glpoly_t *p = sc->polys;
while (p) { while (p) {
int i; int i;
glBegin (GL_LINE_LOOP); glBegin (GL_LINE_LOOP);
for (i = 0; i < p->numverts; i++) { for (i = 0; i < p->numverts; i++) {
glVertex3fv (p->verts[i]); glVertex3fv (p->verts[i]);
@ -646,9 +684,11 @@ R_DrawSkyChain (msurface_t *sky_chain)
glBegin (GL_POINTS); glBegin (GL_POINTS);
while (sc) { while (sc) {
glpoly_t *p = sc->polys; glpoly_t *p = sc->polys;
while (p) { while (p) {
int i; int i;
vec3_t x, c = { 0, 0, 0 }; vec3_t x, c = { 0, 0, 0 };
for (i = 0; i < p->numverts; i++) { for (i = 0; i < p->numverts; i++) {
VectorSubtract (p->verts[i], r_refdef.vieworg, x); VectorSubtract (p->verts[i], r_refdef.vieworg, x);
VectorAdd (x, c, c); VectorAdd (x, c, c);
@ -663,9 +703,11 @@ R_DrawSkyChain (msurface_t *sky_chain)
glEnd (); glEnd ();
if (skyloaded) { if (skyloaded) {
int i, j; int i, j;
glColor3f (1, 0, 0); glColor3f (1, 0, 0);
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
vec3_t v; vec3_t v;
glBegin (GL_LINE_LOOP); glBegin (GL_LINE_LOOP);
for (j = 0; j < 4; j++) { for (j = 0; j < 4; j++) {
memcpy (v, &skyvec[i][j][2], sizeof (v)); memcpy (v, &skyvec[i][j][2], sizeof (v));