cvar_t r_dlightmap = {CVAR_SAVE, "r_dlightmap", "1"};
cvar_t r_drawportals = {0, "r_drawportals", "0"};
cvar_t r_testvis = {0, "r_testvis", "0"};
-cvar_t r_solidworldnode = {0, "r_solidworldnode", "1"};
+cvar_t r_solidworldnode = {0, "r_solidworldnode", "3"};
+cvar_t r_pvsworldnode = {0, "r_pvsworldnode", "1"};
qboolean lightmaprgba, nosubimagefragments, nosubimage;
int lightmapbytes;
Cvar_RegisterVariable(&r_drawportals);
Cvar_RegisterVariable(&r_testvis);
Cvar_RegisterVariable(&r_solidworldnode);
+ Cvar_RegisterVariable(&r_pvsworldnode);
R_RegisterModule("GL_Surf", gl_surf_start, gl_surf_shutdown, gl_surf_newmap);
}
*/
void R_DrawBrushModel (entity_t *e)
{
- int i, j;
+ int i, j, vertexlit;
vec3_t mins, maxs;
msurface_t *s;
model_t *clmodel;
VectorSubtract(cl_dlights[i].origin, currententity->render.origin, org);
R_NoVisMarkLights (org, &cl_dlights[i], 1<<(i&31), i >> 5, clmodel);
}
-// vertexlit = modelalpha != 1 || clmodel->firstmodelsurface == 0 || (currententity->render.effects & EF_FULLBRIGHT) || currententity->render.colormod[0] != 1 || currententity->render.colormod[2] != 1 || currententity->render.colormod[2] != 1;
+ vertexlit = modelalpha != 1 || clmodel->firstmodelsurface == 0 || (currententity->render.effects & EF_FULLBRIGHT) || currententity->render.colormod[0] != 1 || currententity->render.colormod[2] != 1 || currententity->render.colormod[2] != 1;
// draw texture
for (i = 0, s = &clmodel->surfaces[clmodel->firstmodelsurface];i < clmodel->nummodelsurfaces;i++, s++)
if (s->visframe == r_framecount)
{
// R_DrawSurf(s, true, vertexlit || s->texinfo->texture->transparent);
- for (p = s->polys;p;p = p->next)
+ if (r_ser.value)
{
- for (j = 0;j < p->numverts;j++)
- softwaretransform(&p->verts[j][0], bmverts + j * 3);
- R_Clip_AddPolygon(bmverts, p->numverts, 3 * sizeof(float), (s->flags & SURF_CLIPSOLID) != 0 && modelalpha == 1, RBrushModelSurf_Callback, s, e, NULL);
- }
- /*
- if (s->flags & (SURF_DRAWSKY | SURF_DRAWTURB))
- {
- // sky and liquid don't need sorting (skypoly/transpoly)
- if (s->flags & SURF_DRAWSKY)
- RSurf_DrawSky(s, true);
- else
- RSurf_DrawWater(s, R_TextureAnimation(s->texinfo->texture), true, s->flags & SURF_DRAWNOALPHA ? 255 : wateralpha);
+ for (p = s->polys;p;p = p->next)
+ {
+ for (j = 0;j < p->numverts;j++)
+ softwaretransform(&p->verts[j][0], bmverts + j * 3);
+ R_Clip_AddPolygon(bmverts, p->numverts, 3 * sizeof(float), (s->flags & SURF_CLIPSOLID) != 0 && modelalpha == 1, RBrushModelSurf_Callback, s, e, NULL);
+ }
}
else
{
- texture_t *t = R_TextureAnimation(s->texinfo->texture);
- if (vertexlit || s->texinfo->texture->transparent)
- RSurf_DrawWallVertex(s, t, true, true);
+ if (s->flags & (SURF_DRAWSKY | SURF_DRAWTURB))
+ {
+ // sky and liquid don't need sorting (skypoly/transpoly)
+ if (s->flags & SURF_DRAWSKY)
+ RSurf_DrawSky(s, true);
+ else
+ RSurf_DrawWater(s, R_TextureAnimation(s->texinfo->texture), true, s->flags & SURF_DRAWNOALPHA ? 255 : wateralpha);
+ }
else
- RSurf_DrawWall(s, t, true);
+ {
+ texture_t *t = R_TextureAnimation(s->texinfo->texture);
+ if (vertexlit || s->texinfo->texture->transparent)
+ RSurf_DrawWallVertex(s, t, true, true);
+ else
+ RSurf_DrawWall(s, t, true);
+ }
}
- */
}
}
UploadLightmaps();
void R_SolidWorldNode (void)
{
- if ((int) r_solidworldnode.value == 2)
+ if ((int) r_solidworldnode.value == 3)
{
- mnode_t *nodestack[8192], *node = cl.worldmodel->nodes;
- int nodestackpos = 0;
- glpoly_t *p;
+ int portalstack;
+ mportal_t *p, *pstack[8192];
+ msurface_t *surf, **mark, **endmark;
+ mleaf_t *leaf;
+ glpoly_t *poly;
+ tinyplane_t plane;
+
+ leaf = r_viewleaf;
+ leaf->worldnodeframe = r_framecount;
+ portalstack = 0;
+ loc0:
+ c_leafs++;
-loc0:
- if (node->numsurfaces)
+ leaf->visframe = r_framecount;
+
+ if (leaf->nummarksurfaces)
{
- msurface_t *surf = cl.worldmodel->surfaces + node->firstsurface, *surfend = surf + node->numsurfaces;
- tinyplane_t plane;
- if (PlaneDiff (r_origin, node->plane) < 0)
+ mark = leaf->firstmarksurface;
+ endmark = mark + leaf->nummarksurfaces;
+ if (r_ser.value)
{
- for (;surf < surfend;surf++)
+ do
{
- if (surf->flags & SURF_PLANEBACK)
+ surf = *mark++;
+ // make sure surfaces are only processed once
+ if (surf->worldnodeframe == r_framecount)
+ continue;
+ surf->worldnodeframe = r_framecount;
+ if (PlaneDist(r_origin, surf->plane) < surf->plane->dist)
+ {
+ if (surf->flags & SURF_PLANEBACK)
+ {
+ VectorNegate(surf->plane->normal, plane.normal);
+ plane.dist = -surf->plane->dist;
+ for (poly = surf->polys;poly;poly = poly->next)
+ R_Clip_AddPolygon((float *)poly->verts, poly->numverts, VERTEXSIZE * sizeof(float), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, &plane);
+ }
+ }
+ else
{
- VectorNegate(surf->plane->normal, plane.normal);
- plane.dist = -surf->plane->dist;
- for (p = surf->polys;p;p = p->next)
- R_Clip_AddPolygon((float *)p->verts, p->numverts, VERTEXSIZE * sizeof(float), surf->flags & SURF_CLIPSOLID, RSurf_Callback, surf, NULL, &plane);
+ if (!(surf->flags & SURF_PLANEBACK))
+ for (poly = surf->polys;poly;poly = poly->next)
+ R_Clip_AddPolygon((float *)poly->verts, poly->numverts, VERTEXSIZE * sizeof(float), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, (tinyplane_t *)surf->plane);
}
}
+ while (mark < endmark);
}
else
{
- for (;surf < surfend;surf++)
+ do
{
- if (!(surf->flags & SURF_PLANEBACK))
- for (p = surf->polys;p;p = p->next)
- R_Clip_AddPolygon((float *)p->verts, p->numverts, VERTEXSIZE * sizeof(float), surf->flags & SURF_CLIPSOLID, RSurf_Callback, surf, NULL, (tinyplane_t *)surf->plane);
+ surf = *mark++;
+ // make sure surfaces are only processed once
+ if (surf->worldnodeframe == r_framecount)
+ continue;
+ surf->worldnodeframe = r_framecount;
+ if (PlaneDist(r_origin, surf->plane) < surf->plane->dist)
+ {
+ if (surf->flags & SURF_PLANEBACK)
+ surf->visframe = r_framecount;
+ }
+ else
+ {
+ if (!(surf->flags & SURF_PLANEBACK))
+ surf->visframe = r_framecount;
+ }
}
+ while (mark < endmark);
}
}
- // recurse down the children
- if (node->children[0]->contents >= 0)
+ // follow portals into other leafs
+ p = leaf->portals;
+ for (;p;p = p->next)
{
- if (node->children[1]->contents >= 0)
+ if (DotProduct(r_origin, p->plane.normal) < p->plane.dist)
{
- if (nodestackpos < 8192)
- nodestack[nodestackpos++] = node->children[1];
- node = node->children[0];
- goto loc0;
+ leaf = p->past;
+ if (leaf->worldnodeframe != r_framecount)
+ {
+ leaf->worldnodeframe = r_framecount;
+ if (leaf->contents != CONTENTS_SOLID)
+ {
+ if (R_NotCulledBox(leaf->mins, leaf->maxs))
+ {
+ pstack[portalstack++] = p;
+ goto loc0;
+
+ loc1:
+ p = pstack[--portalstack];
+ }
+ }
+ }
}
- node = node->children[0];
- goto loc0;
}
- else if (node->children[1]->contents >= 0)
+
+ if (portalstack)
+ goto loc1;
+ }
+ else if ((int) r_solidworldnode.value == 2)
+ {
+ mnode_t *nodestack[8192], *node = cl.worldmodel->nodes;
+ int nodestackpos = 0;
+ glpoly_t *poly;
+
+loc2:
+ if (R_NotCulledBox(node->mins, node->maxs))
{
- node = node->children[1];
- goto loc0;
+ if (r_ser.value)
+ {
+ if (node->numsurfaces)
+ {
+ msurface_t *surf = cl.worldmodel->surfaces + node->firstsurface, *surfend = surf + node->numsurfaces;
+ tinyplane_t plane;
+ if (PlaneDiff (r_origin, node->plane) < 0)
+ {
+ for (;surf < surfend;surf++)
+ {
+ if (surf->flags & SURF_PLANEBACK)
+ {
+ VectorNegate(surf->plane->normal, plane.normal);
+ plane.dist = -surf->plane->dist;
+ for (poly = surf->polys;poly;poly = poly->next)
+ R_Clip_AddPolygon((float *)poly->verts, poly->numverts, VERTEXSIZE * sizeof(float), surf->flags & SURF_CLIPSOLID, RSurf_Callback, surf, NULL, &plane);
+ }
+ }
+ }
+ else
+ {
+ for (;surf < surfend;surf++)
+ {
+ if (!(surf->flags & SURF_PLANEBACK))
+ for (poly = surf->polys;poly;poly = poly->next)
+ R_Clip_AddPolygon((float *)poly->verts, poly->numverts, VERTEXSIZE * sizeof(float), surf->flags & SURF_CLIPSOLID, RSurf_Callback, surf, NULL, (tinyplane_t *)surf->plane);
+ }
+ }
+ }
+ }
+ else
+ {
+ if (node->numsurfaces)
+ {
+ msurface_t *surf = cl.worldmodel->surfaces + node->firstsurface, *surfend = surf + node->numsurfaces;
+ if (PlaneDiff (r_origin, node->plane) < 0)
+ {
+ for (;surf < surfend;surf++)
+ {
+ if (surf->flags & SURF_PLANEBACK)
+ surf->visframe = r_framecount;
+ }
+ }
+ else
+ {
+ for (;surf < surfend;surf++)
+ {
+ if (!(surf->flags & SURF_PLANEBACK))
+ surf->visframe = r_framecount;
+ }
+ }
+ }
+ }
+
+ // recurse down the children
+ if (node->children[0]->contents >= 0)
+ {
+ if (node->children[1]->contents >= 0)
+ {
+ if (nodestackpos < 8192)
+ nodestack[nodestackpos++] = node->children[1];
+ node = node->children[0];
+ goto loc2;
+ }
+ else
+ ((mleaf_t *)node->children[1])->visframe = r_framecount;
+ node = node->children[0];
+ goto loc2;
+ }
+ else
+ {
+ ((mleaf_t *)node->children[0])->visframe = r_framecount;
+ if (node->children[1]->contents >= 0)
+ {
+ node = node->children[1];
+ goto loc2;
+ }
+ else if (nodestackpos > 0)
+ {
+ ((mleaf_t *)node->children[1])->visframe = r_framecount;
+ node = nodestack[--nodestackpos];
+ goto loc2;
+ }
+ }
}
else if (nodestackpos > 0)
{
node = nodestack[--nodestackpos];
- goto loc0;
+ goto loc2;
}
}
- else if ((int) r_solidworldnode.value == 1)
+ else if ((int) r_solidworldnode.value == 1 && r_ser.value)
{
- glpoly_t *p;
+ glpoly_t *poly;
msurface_t *surf, *endsurf;
tinyplane_t plane;
-
surf = &cl.worldmodel->surfaces[cl.worldmodel->firstmodelsurface];
endsurf = surf + cl.worldmodel->nummodelsurfaces;
for (;surf < endsurf;surf++)
{
VectorNegate(surf->plane->normal, plane.normal);
plane.dist = -surf->plane->dist;
- for (p = surf->polys;p;p = p->next)
- R_Clip_AddPolygon((float *)p->verts, p->numverts, VERTEXSIZE * sizeof(float), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, &plane);
+ for (poly = surf->polys;poly;poly = poly->next)
+ R_Clip_AddPolygon((float *)poly->verts, poly->numverts, VERTEXSIZE * sizeof(float), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, &plane);
}
}
else
{
if (!(surf->flags & SURF_PLANEBACK))
- for (p = surf->polys;p;p = p->next)
- R_Clip_AddPolygon((float *)p->verts, p->numverts, VERTEXSIZE * sizeof(float), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, (tinyplane_t *)&surf->plane);
+ for (poly = surf->polys;poly;poly = poly->next)
+ R_Clip_AddPolygon((float *)poly->verts, poly->numverts, VERTEXSIZE * sizeof(float), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, (tinyplane_t *)&surf->plane);
}
}
}
int l;
mleaf_t *leaf;
msurface_t *surf, **mark, **endmark;
- glpoly_t *p;
+ glpoly_t *poly;
tinyplane_t plane;
for (l = 0, leaf = cl.worldmodel->leafs;l < cl.worldmodel->numleafs;l++, leaf++)
{
if (R_CullBox(leaf->mins, leaf->maxs))
continue;
-// leaf->visframe = r_framecount;
+ leaf->visframe = r_framecount;
c_leafs++;
if (leaf->nummarksurfaces)
{
{
mark = leaf->firstmarksurface;
endmark = mark + leaf->nummarksurfaces;
- do
+ if (r_ser.value)
{
- surf = *mark++;
- // make sure surfaces are only processed once
- if (surf->worldnodeframe == r_framecount)
- continue;
- surf->worldnodeframe = r_framecount;
- if (PlaneDist(r_origin, surf->plane) < surf->plane->dist)
+ do
{
- if (surf->flags & SURF_PLANEBACK)
+ surf = *mark++;
+ // make sure surfaces are only processed once
+ if (surf->worldnodeframe == r_framecount)
+ continue;
+ surf->worldnodeframe = r_framecount;
+ if (PlaneDist(r_origin, surf->plane) < surf->plane->dist)
{
- VectorNegate(surf->plane->normal, plane.normal);
- plane.dist = -surf->plane->dist;
- for (p = surf->polys;p;p = p->next)
- R_Clip_AddPolygon((float *)p->verts, p->numverts, VERTEXSIZE * sizeof(float), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, &plane);
+ if (surf->flags & SURF_PLANEBACK)
+ {
+ VectorNegate(surf->plane->normal, plane.normal);
+ plane.dist = -surf->plane->dist;
+ for (poly = surf->polys;poly;poly = poly->next)
+ R_Clip_AddPolygon((float *)poly->verts, poly->numverts, VERTEXSIZE * sizeof(float), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, &plane);
+ }
+ }
+ else
+ {
+ if (!(surf->flags & SURF_PLANEBACK))
+ for (poly = surf->polys;poly;poly = poly->next)
+ R_Clip_AddPolygon((float *)poly->verts, poly->numverts, VERTEXSIZE * sizeof(float), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, (tinyplane_t *)surf->plane);
}
}
- else
+ while (mark < endmark);
+ }
+ else
+ {
+ do
{
- if (!(surf->flags & SURF_PLANEBACK))
- for (p = surf->polys;p;p = p->next)
- R_Clip_AddPolygon((float *)p->verts, p->numverts, VERTEXSIZE * sizeof(float), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, (tinyplane_t *)surf->plane);
+ surf = *mark++;
+ // make sure surfaces are only processed once
+ if (surf->worldnodeframe == r_framecount)
+ continue;
+ surf->worldnodeframe = r_framecount;
+ if (PlaneDist(r_origin, surf->plane) < surf->plane->dist)
+ {
+ if (surf->flags & SURF_PLANEBACK)
+ surf->visframe = r_framecount;
+ }
+ else
+ {
+ if (!(surf->flags & SURF_PLANEBACK))
+ surf->visframe = r_framecount;
+ }
}
+ while (mark < endmark);
}
- while (mark < endmark);
}
}
}
void R_PVSWorldNode()
{
- int i/*, l*/, k, c, row, numbits, bit, leafnum, numleafs;
- mleaf_t *leaf;
- msurface_t *surf, **mark, **endmark;
- model_t *model = cl.worldmodel;
- byte *in;
-// mportal_t *portal;
- glpoly_t *p;
- tinyplane_t plane;
-
-// c_leafs++;
-// r_viewleaf->visframe = r_framecount;
- if (!r_testvis.value)
- r_portalframecount++;
-
- numleafs = model->numleafs;
- numbits = numleafs;
- k = 0;
- in = r_viewleaf->compressed_vis;
- row = (numbits + 7) >> 3;
- while (k < row)
+ if (r_pvsworldnode.value == 1)
{
- c = *in++;
- if (c)
+ int portalstack, i;
+ mportal_t *p, *pstack[8192];
+ msurface_t *surf, **mark, **endmark;
+ mleaf_t *leaf;
+ tinyplane_t plane;
+ glpoly_t *poly;
+ byte *worldvis;
+
+ worldvis = Mod_LeafPVS (r_viewleaf, cl.worldmodel);
+
+ leaf = r_viewleaf;
+ leaf->worldnodeframe = r_framecount;
+ portalstack = 0;
+ loc0:
+ c_leafs++;
+
+ leaf->visframe = r_framecount;
+
+ if (leaf->nummarksurfaces)
{
- for (i = 0, bit = 1;c;i++, bit <<= 1)
+ mark = leaf->firstmarksurface;
+ endmark = mark + leaf->nummarksurfaces;
+ if (r_ser.value)
{
- if (c & bit)
+ do
{
- leafnum = (k << 3)+i+1;
- if (leafnum > numleafs)
- return;
- c -= bit;
- leaf = &model->leafs[leafnum];
- if (R_NotCulledBox(leaf->mins, leaf->maxs))
+ surf = *mark++;
+ // make sure surfaces are only processed once
+ if (surf->worldnodeframe == r_framecount)
+ continue;
+ surf->worldnodeframe = r_framecount;
+ if (PlaneDist(modelorg, surf->plane) < surf->plane->dist)
{
- //for (portal = leaf->portals;portal;portal = portal->next)
- // if (DotProduct(r_origin, portal->plane.normal) > portal->plane.dist)
- // R_Clip_AddPolygon((float *)portal->points, portal->numpoints, sizeof(mvertex_t), false, R_Portal_Callback, leaf, portal, portal->plane);
- //leaf->visframe = r_framecount;
- c_leafs++;
- if (leaf->nummarksurfaces)
+ if (surf->flags & SURF_PLANEBACK)
{
- mark = leaf->firstmarksurface;
- endmark = mark + leaf->nummarksurfaces;
- do
- {
- surf = *mark++;
- // make sure surfaces are only processed once
- if (surf->worldnodeframe == r_framecount)
- continue;
- surf->worldnodeframe = r_framecount;
- if (PlaneDist(r_origin, surf->plane) < surf->plane->dist)
- {
- if (surf->flags & SURF_PLANEBACK)
- {
- VectorNegate(surf->plane->normal, plane.normal);
- plane.dist = -surf->plane->dist;
- for (p = surf->polys;p;p = p->next)
- R_Clip_AddPolygon((float *)p->verts, p->numverts, VERTEXSIZE * sizeof(float), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, &plane);
- }
- }
- else
- {
- if (!(surf->flags & SURF_PLANEBACK))
- for (p = surf->polys;p;p = p->next)
- R_Clip_AddPolygon((float *)p->verts, p->numverts, VERTEXSIZE * sizeof(float), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, (tinyplane_t *)surf->plane);
- }
- }
- while (mark < endmark);
+ VectorNegate(surf->plane->normal, plane.normal);
+ plane.dist = -surf->plane->dist;
+ for (poly = surf->polys;poly;poly = poly->next)
+ R_Clip_AddPolygon((float *)poly->verts, poly->numverts, VERTEXSIZE * sizeof(float), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, &plane);
}
}
+ else
+ {
+ if (!(surf->flags & SURF_PLANEBACK))
+ for (poly = surf->polys;poly;poly = poly->next)
+ R_Clip_AddPolygon((float *)poly->verts, poly->numverts, VERTEXSIZE * sizeof(float), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, (tinyplane_t *)surf->plane);
+ }
}
- }
- k++;
- }
- else
- k += *in++;
- }
-}
-
-/*
-void R_OldPortalWorldNode (void)
-{
- int portalstack, i;
- mportal_t *p, *pstack[8192];
- msurface_t *surf, **mark, **endmark;
- mleaf_t *leaf;
-
- leaf = r_viewleaf;
- leaf->worldnodeframe = r_framecount;
- portalstack = 0;
-loc0:
- c_leafs++;
-
- leaf->visframe = r_framecount;
-
- if (leaf->nummarksurfaces)
- {
- mark = leaf->firstmarksurface;
- endmark = mark + leaf->nummarksurfaces;
- do
- {
- surf = *mark++;
- // make sure surfaces are only processed once
- if (surf->worldnodeframe == r_framecount)
- continue;
- surf->worldnodeframe = r_framecount;
- if (PlaneDist(modelorg, surf->plane) < surf->plane->dist)
- {
- if (surf->flags & SURF_PLANEBACK)
- surf->visframe = r_framecount;
+ while (mark < endmark);
}
else
{
- if (!(surf->flags & SURF_PLANEBACK))
- surf->visframe = r_framecount;
+ do
+ {
+ surf = *mark++;
+ // make sure surfaces are only processed once
+ if (surf->worldnodeframe == r_framecount)
+ continue;
+ surf->worldnodeframe = r_framecount;
+ if (PlaneDist(modelorg, surf->plane) < surf->plane->dist)
+ {
+ if (surf->flags & SURF_PLANEBACK)
+ surf->visframe = r_framecount;
+ }
+ else
+ {
+ if (!(surf->flags & SURF_PLANEBACK))
+ surf->visframe = r_framecount;
+ }
+ }
+ while (mark < endmark);
}
}
- while (mark < endmark);
- }
- // follow portals into other leafs
- p = leaf->portals;
- for (;p;p = p->next)
- {
- leaf = p->past;
- if (leaf->worldnodeframe != r_framecount)
+ // follow portals into other leafs
+ p = leaf->portals;
+ for (;p;p = p->next)
{
- leaf->worldnodeframe = r_framecount;
- if (leaf->contents != CONTENTS_SOLID)
+ if (DotProduct(r_origin, p->plane.normal) < p->plane.dist)
{
- i = (leaf - cl.worldmodel->leafs) - 1;
- if (worldvis[i>>3] & (1<<(i&7)))
+ leaf = p->past;
+ if (leaf->worldnodeframe != r_framecount)
{
- if (R_NotCulledBox(leaf->mins, leaf->maxs))
+ leaf->worldnodeframe = r_framecount;
+ if (leaf->contents != CONTENTS_SOLID)
{
- pstack[portalstack++] = p;
- goto loc0;
+ i = (leaf - cl.worldmodel->leafs) - 1;
+ if (worldvis[i>>3] & (1<<(i&7)))
+ {
+ if (R_NotCulledBox(leaf->mins, leaf->maxs))
+ {
+ pstack[portalstack++] = p;
+ goto loc0;
-loc1:
- p = pstack[--portalstack];
+ loc1:
+ p = pstack[--portalstack];
+ }
+ }
}
}
}
}
- }
- if (portalstack)
- goto loc1;
+ if (portalstack)
+ goto loc1;
- i = 0;
- portalstack = 0;
- p = r_viewleaf->portals;
- for (;p;p = p->next)
+ i = 0;
+ portalstack = 0;
+ p = r_viewleaf->portals;
+ for (;p;p = p->next)
+ {
+ portalstack++;
+ if (p->past->worldnodeframe != r_framecount)
+ i++;
+ }
+ if (i)
+ Con_Printf("%i portals of viewleaf (%i portals) were not checked\n", i, portalstack);
+ }
+ else
{
- portalstack++;
- if (p->past->worldnodeframe != r_framecount)
- i++;
+ int i/*, l*/, k, c, row, numbits, bit, leafnum, numleafs;
+ mleaf_t *leaf;
+ msurface_t *surf, **mark, **endmark;
+ model_t *model = cl.worldmodel;
+ byte *in;
+ // mportal_t *portal;
+ glpoly_t *poly;
+ tinyplane_t plane;
+
+ // c_leafs++;
+ // r_viewleaf->visframe = r_framecount;
+ if (!r_testvis.value)
+ r_portalframecount++;
+
+ numleafs = model->numleafs;
+ numbits = numleafs;
+ k = 0;
+ in = r_viewleaf->compressed_vis;
+ row = (numbits + 7) >> 3;
+ while (k < row)
+ {
+ c = *in++;
+ if (c)
+ {
+ for (i = 0, bit = 1;c;i++, bit <<= 1)
+ {
+ if (c & bit)
+ {
+ leafnum = (k << 3)+i+1;
+ if (leafnum > numleafs)
+ return;
+ c -= bit;
+ leaf = &model->leafs[leafnum];
+ if (R_NotCulledBox(leaf->mins, leaf->maxs))
+ {
+ //for (portal = leaf->portals;portal;portal = portal->next)
+ // if (DotProduct(r_origin, portal->plane.normal) > portal->plane.dist)
+ // R_Clip_AddPolygon((float *)portal->points, portal->numpoints, sizeof(mvertex_t), false, R_Portal_Callback, leaf, portal, portal->plane);
+ //leaf->visframe = r_framecount;
+ c_leafs++;
+ if (leaf->nummarksurfaces)
+ {
+ mark = leaf->firstmarksurface;
+ endmark = mark + leaf->nummarksurfaces;
+ if (r_ser.value)
+ {
+ do
+ {
+ surf = *mark++;
+ // make sure surfaces are only processed once
+ if (surf->worldnodeframe == r_framecount)
+ continue;
+ surf->worldnodeframe = r_framecount;
+ if (PlaneDist(r_origin, surf->plane) < surf->plane->dist)
+ {
+ if (surf->flags & SURF_PLANEBACK)
+ {
+ VectorNegate(surf->plane->normal, plane.normal);
+ plane.dist = -surf->plane->dist;
+ for (poly = surf->polys;poly;poly = poly->next)
+ R_Clip_AddPolygon((float *)poly->verts, poly->numverts, VERTEXSIZE * sizeof(float), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, &plane);
+ }
+ }
+ else
+ {
+ if (!(surf->flags & SURF_PLANEBACK))
+ for (poly = surf->polys;poly;poly = poly->next)
+ R_Clip_AddPolygon((float *)poly->verts, poly->numverts, VERTEXSIZE * sizeof(float), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, (tinyplane_t *)surf->plane);
+ }
+ }
+ while (mark < endmark);
+ }
+ else
+ {
+ do
+ {
+ surf = *mark++;
+ // make sure surfaces are only processed once
+ if (surf->worldnodeframe == r_framecount)
+ continue;
+ surf->worldnodeframe = r_framecount;
+ if (PlaneDist(r_origin, surf->plane) < surf->plane->dist)
+ {
+ if (surf->flags & SURF_PLANEBACK)
+ surf->visframe = r_framecount;
+ }
+ else
+ {
+ if (!(surf->flags & SURF_PLANEBACK))
+ surf->visframe = r_framecount;
+ }
+ }
+ while (mark < endmark);
+ }
+ }
+ }
+ }
+ }
+ k++;
+ }
+ else
+ k += *in++;
+ }
}
- if (i)
- Con_Printf("%i portals of viewleaf (%i portals) were not checked\n", i, portalstack);
}
-*/
entity_t clworldent;
c_faces++;
if (surf->flags & (SURF_DRAWSKY | SURF_DRAWTURB))
{
- // sky and liquid don't need sorting (skypoly/transpoly)
if (surf->flags & SURF_DRAWSKY)
RSurf_DrawSky(surf, false);
else
{0.295242, 0.000000, 0.955423}, {0.442863, 0.238856, 0.864188},
{0.162460, 0.262866, 0.951056}, {-0.681718, 0.147621, 0.716567},
{-0.809017, 0.309017, 0.500000}, {-0.587785, 0.425325, 0.688191},
-{-0.850651, 0.525731, 0.000000}, {-0.864188, 0.442863, 0.238856},
+{-0.850651, 0.525731, 0.000000}, {-0.864188, 0.442863, 0.238856},
{-0.716567, 0.681718, 0.147621}, {-0.688191, 0.587785, 0.425325},
{-0.500000, 0.809017, 0.309017}, {-0.238856, 0.864188, 0.442863},
{-0.425325, 0.688191, 0.587785}, {-0.716567, 0.681718, -0.147621},
{0.850651, 0.000000, 0.525731}, {0.864188, 0.442863, -0.238856},
{0.809017, 0.309017, -0.500000}, {0.951056, 0.162460, -0.262866},
{0.525731, 0.000000, -0.850651}, {0.681718, 0.147621, -0.716567},
-{0.681718, -0.147621, -0.716567}, {0.850651, 0.000000, -0.525731},
+{0.681718, -0.147621, -0.716567}, {0.850651, 0.000000, -0.525731},
{0.809017, -0.309017, -0.500000}, {0.864188, -0.442863, -0.238856},
{0.951056, -0.162460, -0.262866}, {0.147621, 0.716567, -0.681718},
{0.309017, 0.500000, -0.809017}, {0.425325, 0.688191, -0.587785},
{0.162460, -0.262866, -0.951056}, {0.238856, -0.864188, -0.442863},
{0.500000, -0.809017, -0.309017}, {0.425325, -0.688191, -0.587785},
{0.716567, -0.681718, -0.147621}, {0.688191, -0.587785, -0.425325},
-{0.587785, -0.425325, -0.688191}, {0.000000, -0.955423, -0.295242},
+{0.587785, -0.425325, -0.688191}, {0.000000, -0.955423, -0.295242},
{0.000000, -1.000000, 0.000000}, {0.262866, -0.951056, -0.162460},
{0.000000, -0.850651, 0.525731}, {0.000000, -0.955423, 0.295242},
{0.238856, -0.864188, 0.442863}, {0.262866, -0.951056, 0.162460},
{-0.850651, 0.000000, 0.525731}, {-0.955423, -0.295242, 0.000000},
{-0.951056, -0.162460, 0.262866}, {-0.864188, 0.442863, -0.238856},
{-0.951056, 0.162460, -0.262866}, {-0.809017, 0.309017, -0.500000},
-{-0.864188, -0.442863, -0.238856}, {-0.951056, -0.162460, -0.262866},
+{-0.864188, -0.442863, -0.238856}, {-0.951056, -0.162460, -0.262866},
{-0.809017, -0.309017, -0.500000}, {-0.681718, 0.147621, -0.716567},
{-0.681718, -0.147621, -0.716567}, {-0.850651, 0.000000, -0.525731},
{-0.688191, 0.587785, -0.425325}, {-0.587785, 0.425325, -0.688191},
return length;
}
+/*
+// LordHavoc: fixme: do more research on gcc assembly so that qftol_minushalf and result will not be considered unused
+static double qftol_minushalf = -0.5;
+
+int qftol(double v)
+{
+ int result;
+#ifdef _MSC_VER
+ __asm
+ {
+ fld v
+ fadd qftol_minushalf
+ fistp result
+ }
+#else // gcc hopefully
+ asm("fldl v\n\tfaddl qftol_minushalf\n\tfistpl result");
+#endif
+ return result;
+}
+*/
+
// LordHavoc: renamed these to Length, and made the normal ones #define
float VectorNormalizeLength (vec3_t v)
{