]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - portals.c
default to insert mode instead of replace mode in console
[xonotic/darkplaces.git] / portals.c
index a90ef26551ed8eee3f8c50f4001d796e34079ad9..f6f85766eb912791a7cd3c6a0d0b9c05f966cf15 100644 (file)
--- a/portals.c
+++ b/portals.c
@@ -187,7 +187,7 @@ int Portal_CheckPolygon(model_t *model, vec3_t eye, float *polypoints, int numpo
        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++;
@@ -344,45 +344,27 @@ void Portal_RecursiveFlow_ExactLeafFaces(portalrecursioninfo_t *info, int *mark,
                if (!info->surfacemark[*mark])
                {
                        // FIXME?  this assumes q1bsp polygon surfaces
-                       surface = info->model->brushq1.surfaces + *mark;
-                       if (surface->mesh.num_vertices)
-                       {
-                               if (surface->flags & SURF_PLANEBACK)
-                               {
-                                       if (DotProduct(info->eye, surface->plane->normal) > surface->plane->dist)
-                                               continue;
-                               }
-                               else
-                               {
-                                       if (DotProduct(info->eye, surface->plane->normal) < surface->plane->dist)
-                                               continue;
-                               }
-                               if (Portal_PortalThroughPortalPlanes(&portalplanes[firstclipplane], numclipplanes, surface->mesh.data_vertex3f, surface->mesh.num_vertices, &portaltemppoints2[0][0], 256) < 3)
-                                       continue;
-                       }
-                       else
+                       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 = surface->mesh.data_element3i;j < surface->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((surface->mesh.data_vertex3f + elements[0] * 3), trianglepoints[0]);
-                                       VectorCopy((surface->mesh.data_vertex3f + elements[1] * 3), trianglepoints[1]);
-                                       VectorCopy((surface->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 == surface->mesh.num_triangles)
-                                       continue;
                        }
+                       if (j == surface->num_triangles)
+                               continue;
                        info->surfacemark[*mark] = true;
                }
        }