summaryrefslogtreecommitdiff
path: root/source/sw_bsp.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/sw_bsp.c')
-rw-r--r--source/sw_bsp.c275
1 files changed, 120 insertions, 155 deletions
diff --git a/source/sw_bsp.c b/source/sw_bsp.c
index 36f784e..df0222b 100644
--- a/source/sw_bsp.c
+++ b/source/sw_bsp.c
@@ -153,12 +153,12 @@ R_RecursiveClipBPoly
Clip a bmodel poly down the world bsp tree
================
*/
-void R_RecursiveClipBPoly (bedge_t *pedges, mnode_t *pnode, msurface_t *psurf)
+void R_RecursiveClipBPoly (bedge_t *pedges, mnode_t *pnode, mface_t *psurf)
{
bedge_t *psideedges[2], *pnextedge, *ptedge;
int i, side, lastside;
float dist, frac, lastdist;
- mplane_t *splitplane, tplane;
+ cplane_t *splitplane, tplane;
mvertex_t *pvert, *plastvert, *ptvert;
mnode_t *pn;
int area;
@@ -183,7 +183,7 @@ void R_RecursiveClipBPoly (bedge_t *pedges, mnode_t *pnode, msurface_t *psurf)
// set the status for the last point as the previous point
// FIXME: cache this stuff somehow?
plastvert = pedges->v[0];
- lastdist = PlaneDiff (plastvert->position, &tplane);
+ lastdist = PlaneDiff (plastvert->point, &tplane);
if (lastdist > 0)
lastside = 0;
@@ -191,7 +191,7 @@ void R_RecursiveClipBPoly (bedge_t *pedges, mnode_t *pnode, msurface_t *psurf)
lastside = 1;
pvert = pedges->v[1];
- dist = PlaneDiff (pvert->position, &tplane);
+ dist = PlaneDiff (pvert->point, &tplane);
if (dist > 0)
side = 0;
@@ -207,15 +207,15 @@ void R_RecursiveClipBPoly (bedge_t *pedges, mnode_t *pnode, msurface_t *psurf)
// generate the clipped vertex
frac = lastdist / (lastdist - dist);
ptvert = &pbverts[numbverts++];
- ptvert->position[0] = plastvert->position[0] +
- frac * (pvert->position[0] -
- plastvert->position[0]);
- ptvert->position[1] = plastvert->position[1] +
- frac * (pvert->position[1] -
- plastvert->position[1]);
- ptvert->position[2] = plastvert->position[2] +
- frac * (pvert->position[2] -
- plastvert->position[2]);
+ ptvert->point[0] = plastvert->point[0] +
+ frac * (pvert->point[0] -
+ plastvert->point[0]);
+ ptvert->point[1] = plastvert->point[1] +
+ frac * (pvert->point[1] -
+ plastvert->point[1]);
+ ptvert->point[2] = plastvert->point[2] +
+ frac * (pvert->point[2] -
+ plastvert->point[2]);
// split into two edges, one on each side, and remember entering
// and exiting points
@@ -296,18 +296,19 @@ void R_RecursiveClipBPoly (bedge_t *pedges, mnode_t *pnode, msurface_t *psurf)
// we're done with this branch if the node or leaf isn't in the PVS
if (pn->visframe == r_visframecount)
{
- if (pn->contents != CONTENTS_NODE)
+ if (!pn->plane)
{
- if (pn->contents != CONTENTS_SOLID)
+ mleaf_t *pl = ( mleaf_t * )pn;
+ if (pl->contents != CONTENTS_SOLID)
{
if (r_newrefdef.areabits)
{
- area = ((mleaf_t *)pn)->area;
- if (! (r_newrefdef.areabits[area>>3] & (1<<(area&7)) ) )
+ area = pl->area;
+ if (!Q_IsBitSet(r_newrefdef.areabits, area) )
continue; // not visible
}
- r_currentbkey = ((mleaf_t *)pn)->key;
+ r_currentbkey = pl->key;
R_RenderBmodelFace (psideedges[i], psurf);
}
}
@@ -329,22 +330,21 @@ R_DrawSolidClippedSubmodelPolygons
Bmodel crosses multiple leafs
================
*/
-void R_DrawSolidClippedSubmodelPolygons (model_t *pmodel, mnode_t *topnode)
+void R_DrawSolidClippedSubmodelPolygons (mmodel_t *pmodel, mnode_t *topnode)
{
- int i, j, lindex;
+ int i, j;
vec_t dot;
- msurface_t *psurf;
+ mface_t *psurf;
int numsurfaces;
- mplane_t *pplane;
+ cplane_t *pplane;
mvertex_t bverts[MAX_BMODEL_VERTS];
bedge_t bedges[MAX_BMODEL_EDGES], *pbedge;
- medge_t *pedge, *pedges;
+ msurfedge_t *surfedge;
// FIXME: use bounding-box-based frustum clipping info?
- psurf = &pmodel->surfaces[pmodel->firstmodelsurface];
- numsurfaces = pmodel->nummodelsurfaces;
- pedges = pmodel->edges;
+ psurf = pmodel->firstface;
+ numsurfaces = pmodel->numfaces;
for (i=0 ; i<numsurfaces ; i++, psurf++)
{
@@ -354,8 +354,8 @@ void R_DrawSolidClippedSubmodelPolygons (model_t *pmodel, mnode_t *topnode)
dot = PlaneDiff (modelorg, pplane);
// draw the polygon
- if (( !(psurf->flags & SURF_PLANEBACK) && (dot < -BACKFACE_EPSILON)) ||
- ((psurf->flags & SURF_PLANEBACK) && (dot > BACKFACE_EPSILON)))
+ if (( !(psurf->drawflags & DSURF_PLANEBACK) && (dot < -BACKFACE_EPSILON)) ||
+ ((psurf->drawflags & DSURF_PLANEBACK) && (dot > BACKFACE_EPSILON)))
continue;
// FIXME: use bounding-box-based frustum clipping info?
@@ -368,32 +368,19 @@ void R_DrawSolidClippedSubmodelPolygons (model_t *pmodel, mnode_t *topnode)
pbedges = bedges;
numbverts = numbedges = 0;
pbedge = &bedges[numbedges];
- numbedges += psurf->numedges;
+ numbedges += psurf->numsurfedges;
- for (j=0 ; j<psurf->numedges ; j++)
+ surfedge = psurf->firstsurfedge;
+ for (j=0 ; j<psurf->numsurfedges ; j++, surfedge++)
{
- lindex = pmodel->surfedges[psurf->firstedge+j];
-
- if (lindex > 0)
- {
- pedge = &pedges[lindex];
- pbedge[j].v[0] = &r_pcurrentvertbase[pedge->v[0]];
- pbedge[j].v[1] = &r_pcurrentvertbase[pedge->v[1]];
- }
- else
- {
- lindex = -lindex;
- pedge = &pedges[lindex];
- pbedge[j].v[0] = &r_pcurrentvertbase[pedge->v[1]];
- pbedge[j].v[1] = &r_pcurrentvertbase[pedge->v[0]];
- }
-
+ pbedge[j].v[0] = surfedge->edge->v[surfedge->vert ];
+ pbedge[j].v[1] = surfedge->edge->v[surfedge->vert ^ 1];
pbedge[j].pnext = &pbedge[j+1];
}
pbedge[j-1].pnext = NULL; // mark end of edges
- if ( !( psurf->texinfo->flags & ( SURF_TRANS66 | SURF_TRANS33 ) ) )
+ if ( !( psurf->texinfo->c.flags & ( SURF_TRANS66 | SURF_TRANS33 ) ) )
R_RecursiveClipBPoly (pbedge, topnode, psurf);
else
R_RenderBmodelFace( pbedge, psurf );
@@ -408,18 +395,18 @@ R_DrawSubmodelPolygons
All in one leaf
================
*/
-void R_DrawSubmodelPolygons (model_t *pmodel, int clipflags, mnode_t *topnode)
+void R_DrawSubmodelPolygons (mmodel_t *pmodel, int clipflags, mnode_t *topnode)
{
int i;
vec_t dot;
- msurface_t *psurf;
+ mface_t *psurf;
int numsurfaces;
- mplane_t *pplane;
+ cplane_t *pplane;
// FIXME: use bounding-box-based frustum clipping info?
- psurf = &pmodel->surfaces[pmodel->firstmodelsurface];
- numsurfaces = pmodel->nummodelsurfaces;
+ psurf = pmodel->firstface;
+ numsurfaces = pmodel->numfaces;
for (i=0 ; i<numsurfaces ; i++, psurf++)
{
@@ -429,8 +416,8 @@ void R_DrawSubmodelPolygons (model_t *pmodel, int clipflags, mnode_t *topnode)
dot = PlaneDiff (modelorg, pplane);
// draw the polygon
- if (((psurf->flags & SURF_PLANEBACK) && (dot < -BACKFACE_EPSILON)) ||
- (!(psurf->flags & SURF_PLANEBACK) && (dot > BACKFACE_EPSILON)))
+ if (((psurf->drawflags & DSURF_PLANEBACK) && (dot < -BACKFACE_EPSILON)) ||
+ (!(psurf->drawflags & DSURF_PLANEBACK) && (dot > BACKFACE_EPSILON)))
{
r_currentkey = ((mleaf_t *)topnode)->key;
@@ -448,86 +435,76 @@ int c_drawnode;
R_RecursiveWorldNode
================
*/
-void R_RecursiveWorldNode (mnode_t *node, int clipflags)
-{
+void R_RecursiveWorldNode (mnode_t *node, int clipflags) {
int i, c, side, *pindex;
vec3_t acceptpt, rejectpt;
- mplane_t *plane;
- msurface_t *surf, **mark;
+ cplane_t *plane;
+ mface_t *surf, **mark;
float d, dot;
mleaf_t *pleaf;
- if (node->contents == CONTENTS_SOLID)
- return; // solid
-
- if (node->visframe != r_visframecount)
- return;
-
-// cull the clipping planes if not trivial accept
-// FIXME: the compiler is doing a lousy job of optimizing here; it could be
-// twice as fast in ASM
- if (clipflags)
- {
- for (i=0 ; i<4 ; i++)
- {
- if (! (clipflags & (1<<i)) )
- continue; // don't need to clip against it
-
- // generate accept and reject points
- // FIXME: do with fast look-ups or integer tests based on the sign bit
- // of the floating point values
-
- pindex = pfrustum_indexes[i];
-
- rejectpt[0] = (float)node->minmaxs[pindex[0]];
- rejectpt[1] = (float)node->minmaxs[pindex[1]];
- rejectpt[2] = (float)node->minmaxs[pindex[2]];
-
- d = PlaneDiff(rejectpt, &view_clipplanes[i]);
- if (d <= 0)
- return;
-
- acceptpt[0] = (float)node->minmaxs[pindex[3+0]];
- acceptpt[1] = (float)node->minmaxs[pindex[3+1]];
- acceptpt[2] = (float)node->minmaxs[pindex[3+2]];
-
- d = PlaneDiff (acceptpt, &view_clipplanes[i]);
- if (d >= 0)
- clipflags &= ~(1<<i); // node is entirely on screen
- }
- }
-
-c_drawnode++;
-
-// if a leaf node, draw stuff
- if (node->contents != -1)
- {
- pleaf = (mleaf_t *)node;
-
- // check for door connected areas
- if (r_newrefdef.areabits)
- {
- if (! (r_newrefdef.areabits[pleaf->area>>3] & (1<<(pleaf->area&7)) ) )
- return; // not visible
- }
-
- mark = pleaf->firstmarksurface;
- c = pleaf->nummarksurfaces;
-
- if (c)
- {
- do
- {
- (*mark)->visframe = r_framecount;
- mark++;
- } while (--c);
- }
-
- pleaf->key = r_currentkey;
- r_currentkey++; // all bmodels in a leaf share the same key
- }
- else
- {
+ while( node->visframe == r_visframecount) {
+ // cull the clipping planes if not trivial accept
+ // FIXME: the compiler is doing a lousy job of optimizing here; it could be
+ // twice as fast in ASM
+ if (clipflags) {
+ for (i=0 ; i<4 ; i++) {
+ if (! (clipflags & (1<<i)) )
+ continue; // don't need to clip against it
+
+ // generate accept and reject points
+ // FIXME: do with fast look-ups or integer tests based on the sign bit
+ // of the floating point values
+
+ pindex = pfrustum_indexes[i];
+
+ rejectpt[0] = (float)node->minmaxs[pindex[0]];
+ rejectpt[1] = (float)node->minmaxs[pindex[1]];
+ rejectpt[2] = (float)node->minmaxs[pindex[2]];
+
+ d = PlaneDiff(rejectpt, &view_clipplanes[i]);
+ if (d <= 0)
+ return;
+
+ acceptpt[0] = (float)node->minmaxs[pindex[3+0]];
+ acceptpt[1] = (float)node->minmaxs[pindex[3+1]];
+ acceptpt[2] = (float)node->minmaxs[pindex[3+2]];
+
+ d = PlaneDiff (acceptpt, &view_clipplanes[i]);
+ if (d >= 0)
+ clipflags &= ~(1<<i); // node is entirely on screen
+ }
+ }
+
+ c_drawnode++;
+
+ // if a leaf node, draw stuff
+ if (!node->plane) {
+ pleaf = (mleaf_t *)node;
+
+ if (pleaf->contents == CONTENTS_SOLID)
+ return; // solid
+
+ // check for door connected areas
+ if (r_newrefdef.areabits) {
+ if (! Q_IsBitSet(r_newrefdef.areabits, pleaf->area ) )
+ return; // not visible
+ }
+
+ mark = pleaf->firstleafface;
+ c = pleaf->numleaffaces;
+ if (c) {
+ do
+ {
+ (*mark)->drawframe = r_framecount;
+ mark++;
+ } while (--c);
+ }
+
+ pleaf->key = r_currentkey;
+ r_currentkey++; // all bmodels in a leaf share the same key
+ return;
+ }
// node is just a decision point, so go down the apropriate sides
// find which side of the node we are on
@@ -544,35 +521,25 @@ c_drawnode++;
R_RecursiveWorldNode (node->children[side], clipflags);
// draw stuff
- c = node->numsurfaces;
-
- if (c)
- {
- surf = r_worldmodel->surfaces + node->firstsurface;
-
- if (dot < -BACKFACE_EPSILON)
- {
- do
- {
- if ((surf->flags & SURF_PLANEBACK) &&
- (surf->visframe == r_framecount))
+ c = node->numfaces;
+ if (c) {
+ surf = node->firstface;
+ if (dot < -BACKFACE_EPSILON) {
+ do {
+ if ((surf->drawflags & DSURF_PLANEBACK) &&
+ (surf->drawframe == r_framecount))
{
R_RenderFace (surf, clipflags);
}
-
surf++;
} while (--c);
- }
- else if (dot > BACKFACE_EPSILON)
- {
- do
- {
- if (!(surf->flags & SURF_PLANEBACK) &&
- (surf->visframe == r_framecount))
+ } else if (dot > BACKFACE_EPSILON) {
+ do {
+ if (!(surf->drawflags & DSURF_PLANEBACK) &&
+ (surf->drawframe == r_framecount))
{
R_RenderFace (surf, clipflags);
}
-
surf++;
} while (--c);
}
@@ -582,8 +549,8 @@ c_drawnode++;
}
// recurse down the back side
- R_RecursiveWorldNode (node->children[!side], clipflags);
- }
+ node = node->children[side^1];
+ }
}
@@ -608,10 +575,8 @@ void R_RenderWorld (void)
currententity = &r_worldentity;
VectorCopy (r_origin, modelorg);
- currentmodel = r_worldmodel;
- r_pcurrentvertbase = currentmodel->vertexes;
- R_RecursiveWorldNode (currentmodel->nodes, 15);
+ R_RecursiveWorldNode (r_worldmodel->nodes, 15);
}