float *p;
loc0:
- if (node->contents < 0)
+ if (!node->plane)
{
((mleaf_t *)node)->portalmarkid = portal_markid;
return;
vec3_t center, v1, v2;
// if there is no model, it can not block visibility
- if (model == NULL)
+ if (model == NULL || !model->brushq1.PointInLeaf)
return true;
portal_markid++;
Mod_CheckLoaded(model);
- Portal_PolygonRecursiveMarkLeafs(model->brushq1.nodes, polypoints, numpoints);
+ Portal_PolygonRecursiveMarkLeafs(model->brush.data_nodes, polypoints, numpoints);
eyeleaf = model->brushq1.PointInLeaf(model, eye);
}
portalrecursioninfo_t;
-void Portal_RecursiveFlow_ExactMarkSurfaces(portalrecursioninfo_t *info, int *mark, int nummarksurfaces, int firstclipplane, int numclipplanes)
+void Portal_RecursiveFlow_ExactLeafFaces(portalrecursioninfo_t *info, int *mark, int numleafsurfaces, int firstclipplane, int numclipplanes)
{
int i, j, *elements;
vec3_t trimins, trimaxs;
- msurface_t *surf;
- for (i = 0;i < nummarksurfaces;i++, mark++)
+ msurface_t *surface;
+ for (i = 0;i < numleafsurfaces;i++, mark++)
{
if (!info->surfacemark[*mark])
{
- surf = info->model->brushq1.surfaces + *mark;
- if (surf->poly_numverts)
- {
- if (surf->flags & SURF_PLANEBACK)
- {
- if (DotProduct(info->eye, surf->plane->normal) > surf->plane->dist)
- continue;
- }
- else
- {
- if (DotProduct(info->eye, surf->plane->normal) < surf->plane->dist)
- continue;
- }
- if (Portal_PortalThroughPortalPlanes(&portalplanes[firstclipplane], numclipplanes, surf->poly_verts, surf->poly_numverts, &portaltemppoints2[0][0], 256) < 3)
- continue;
- }
- else
+ // FIXME? this assumes q1bsp polygon surfaces
+ surface = info->model->brush.data_surfaces + *mark;
+ for (j = 0, elements = (surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle);j < surface->num_triangles;j++, elements += 3)
{
- for (j = 0, elements = surf->mesh.data_element3i;j < surf->mesh.num_triangles;j++, elements += 3)
+ VectorCopy((surface->groupmesh->data_vertex3f + elements[0] * 3), trianglepoints[0]);
+ VectorCopy((surface->groupmesh->data_vertex3f + elements[1] * 3), trianglepoints[1]);
+ VectorCopy((surface->groupmesh->data_vertex3f + elements[2] * 3), trianglepoints[2]);
+ if (PointInfrontOfTriangle(info->eye, trianglepoints[0], trianglepoints[1], trianglepoints[2]))
{
- VectorCopy((surf->mesh.data_vertex3f + elements[0] * 3), trianglepoints[0]);
- VectorCopy((surf->mesh.data_vertex3f + elements[1] * 3), trianglepoints[1]);
- VectorCopy((surf->mesh.data_vertex3f + elements[2] * 3), trianglepoints[2]);
- if (PointInfrontOfTriangle(info->eye, trianglepoints[0], trianglepoints[1], trianglepoints[2]))
- {
- trimins[0] = min(trianglepoints[0][0], min(trianglepoints[1][0], trianglepoints[2][0]));
- trimaxs[0] = max(trianglepoints[0][0], max(trianglepoints[1][0], trianglepoints[2][0]));
- trimins[1] = min(trianglepoints[0][1], min(trianglepoints[1][1], trianglepoints[2][1]));
- trimaxs[1] = max(trianglepoints[0][1], max(trianglepoints[1][1], trianglepoints[2][1]));
- trimins[2] = min(trianglepoints[0][2], min(trianglepoints[1][2], trianglepoints[2][2]));
- trimaxs[2] = max(trianglepoints[0][2], max(trianglepoints[1][2], trianglepoints[2][2]));
- if (BoxesOverlap(trimins, trimaxs, info->boxmins, info->boxmaxs))
- if (Portal_PortalThroughPortalPlanes(&portalplanes[firstclipplane], numclipplanes, trianglepoints[0], 3, &portaltemppoints2[0][0], 256) >= 3)
- break;
- }
+ trimins[0] = min(trianglepoints[0][0], min(trianglepoints[1][0], trianglepoints[2][0]));
+ trimaxs[0] = max(trianglepoints[0][0], max(trianglepoints[1][0], trianglepoints[2][0]));
+ trimins[1] = min(trianglepoints[0][1], min(trianglepoints[1][1], trianglepoints[2][1]));
+ trimaxs[1] = max(trianglepoints[0][1], max(trianglepoints[1][1], trianglepoints[2][1]));
+ trimins[2] = min(trianglepoints[0][2], min(trianglepoints[1][2], trianglepoints[2][2]));
+ trimaxs[2] = max(trianglepoints[0][2], max(trianglepoints[1][2], trianglepoints[2][2]));
+ if (BoxesOverlap(trimins, trimaxs, info->boxmins, info->boxmaxs))
+ if (Portal_PortalThroughPortalPlanes(&portalplanes[firstclipplane], numclipplanes, trianglepoints[0], 3, &portaltemppoints2[0][0], 256) >= 3)
+ break;
}
- if (j == surf->mesh.num_triangles)
- continue;
}
+ if (j == surface->num_triangles)
+ continue;
info->surfacemark[*mark] = true;
}
}
}
if (info->leafmark)
- info->leafmark[leaf - info->model->brushq1.leafs] = true;
+ info->leafmark[leaf - info->model->brush.data_leafs] = true;
// mark surfaces in leaf that can be seen through portal
- if (leaf->nummarksurfaces && info->surfacemark)
+ if (leaf->numleafsurfaces && info->surfacemark)
{
if (info->exact)
- Portal_RecursiveFlow_ExactMarkSurfaces(info, leaf->firstmarksurface, leaf->nummarksurfaces, firstclipplane, numclipplanes);
+ Portal_RecursiveFlow_ExactLeafFaces(info, leaf->firstleafsurface, leaf->numleafsurfaces, firstclipplane, numclipplanes);
else
- for (i = 0;i < leaf->nummarksurfaces;i++)
- info->surfacemark[leaf->firstmarksurface[i]] = true;
+ for (i = 0;i < leaf->numleafsurfaces;i++)
+ info->surfacemark[leaf->firstleafsurface[i]] = true;
}
// follow portals into other leafs
void Portal_RecursiveFindLeafForFlow(portalrecursioninfo_t *info, mnode_t *node)
{
- if (node->contents)
- {
- if (node->contents != CONTENTS_SKY && node->contents != CONTENTS_SOLID)
- Portal_RecursiveFlow(info, (mleaf_t *)node, 0, info->numfrustumplanes);
- }
- else
+ if (node->plane)
{
float f = DotProduct(info->eye, node->plane->normal) - node->plane->dist;
if (f > -0.1)
if (f < 0.1)
Portal_RecursiveFindLeafForFlow(info, node->children[1]);
}
+ else
+ {
+ mleaf_t *leaf = (mleaf_t *)node;
+ if (leaf->portals)
+ Portal_RecursiveFlow(info, leaf, 0, info->numfrustumplanes);
+ }
}
void Portal_Visibility(model_t *model, const vec3_t eye, qbyte *leafmark, qbyte *surfacemark, const mplane_t *frustumplanes, int numfrustumplanes, int exact, const float *boxmins, const float *boxmaxs, float *updateleafsmins, float *updateleafsmaxs)
// if there is no model, it can not block visibility
if (model == NULL)
{
- Con_Printf("Portal_Visibility: NULL model\n");
+ Con_Print("Portal_Visibility: NULL model\n");
return;
}
Mod_CheckLoaded(model);
- if (!model->brushq1.numportals)
+ if (!model->brush.num_portals)
{
- Con_Printf("Portal_Visibility: not a brush model\n");
+ Con_Print("Portal_Visibility: not a brush model\n");
return;
}
info.updateleafsmins = updateleafsmins;
info.updateleafsmaxs = updateleafsmaxs;
- Portal_RecursiveFindLeafForFlow(&info, model->brushq1.nodes);
+ Portal_RecursiveFindLeafForFlow(&info, model->brush.data_nodes);
if (ranoutofportalplanes)
Con_Printf("Portal_RecursiveFlow: ran out of %d plane stack when recursing through portals\n", MAXRECURSIVEPORTALPLANES);