]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - portals.c
Fix setinfo.
[xonotic/darkplaces.git] / portals.c
index 8e2b579c64bed7c2b8eb0464cfe8d34b49ace6e2..2872a8ca89c1a3faaa1fe22ef11cc8be242a1a94 100644 (file)
--- a/portals.c
+++ b/portals.c
@@ -1,6 +1,7 @@
 
 #include "quakedef.h"
 #include "polygon.h"
+#include "portals.h"
 
 #define MAXRECURSIVEPORTALPLANES 1024
 #define MAXRECURSIVEPORTALS 256
@@ -273,6 +274,7 @@ typedef struct portalrecursioninfo_s
        int *surfacelist;
        unsigned char *surfacepvs;
        int numleafs;
+       unsigned char *visitingleafpvs; // used to prevent infinite loops
        int *leaflist;
        unsigned char *leafpvs;
        unsigned char *shadowtrispvs;
@@ -291,6 +293,12 @@ static void Portal_RecursiveFlow (portalrecursioninfo_t *info, mleaf_t *leaf, in
        float dist;
        vec3_t center;
        tinyplane_t *newplanes;
+       int leafindex = leaf - info->model->brush.data_leafs;
+
+       if (CHECKPVSBIT(info->visitingleafpvs, leafindex))
+               return; // recursive loop of leafs (cmc.bsp for megatf coop)
+
+       SETPVSBIT(info->visitingleafpvs, leafindex);
 
        for (i = 0;i < 3;i++)
        {
@@ -301,7 +309,6 @@ static void Portal_RecursiveFlow (portalrecursioninfo_t *info, mleaf_t *leaf, in
 
        if (info->leafpvs)
        {
-               int leafindex = leaf - info->model->brush.data_leafs;
                if (!CHECKPVSBIT(info->leafpvs, leafindex))
                {
                        SETPVSBIT(info->leafpvs, leafindex);
@@ -332,7 +339,7 @@ static void Portal_RecursiveFlow (portalrecursioninfo_t *info, mleaf_t *leaf, in
                                        VectorCopy(vertex3f + elements[1] * 3, v + 3);
                                        VectorCopy(vertex3f + elements[2] * 3, v + 6);
                                        if (PointInfrontOfTriangle(info->eye, v + 0, v + 3, v + 6)
-                                        && (insidebox || TriangleOverlapsBox(v, v + 3, v + 6, info->boxmins, info->boxmaxs))
+                                        && (insidebox || TriangleBBoxOverlapsBox(v, v + 3, v + 6, info->boxmins, info->boxmaxs))
                                         && (!info->exact || Portal_PortalThroughPortalPlanes(&portalplanes[firstclipplane], numclipplanes, v, 3, &portaltemppoints2[0][0], 256) > 0))
                                        {
                                                addedtris = true;
@@ -391,6 +398,8 @@ static void Portal_RecursiveFlow (portalrecursioninfo_t *info, mleaf_t *leaf, in
                        }
                }
        }
+
+       CLEARPVSBIT(info->visitingleafpvs, leafindex);
 }
 
 static void Portal_RecursiveFindLeafForFlow(portalrecursioninfo_t *info, mnode_t *node)
@@ -411,7 +420,7 @@ static void Portal_RecursiveFindLeafForFlow(portalrecursioninfo_t *info, mnode_t
        }
 }
 
-void Portal_Visibility(dp_model_t *model, const vec3_t eye, int *leaflist, unsigned char *leafpvs, int *numleafspointer, int *surfacelist, unsigned char *surfacepvs, int *numsurfacespointer, const mplane_t *frustumplanes, int numfrustumplanes, int exact, const float *boxmins, const float *boxmaxs, float *updateleafsmins, float *updateleafsmaxs, unsigned char *shadowtrispvs, unsigned char *lighttrispvs)
+void Portal_Visibility(dp_model_t *model, const vec3_t eye, int *leaflist, unsigned char *leafpvs, int *numleafspointer, int *surfacelist, unsigned char *surfacepvs, int *numsurfacespointer, const mplane_t *frustumplanes, int numfrustumplanes, int exact, const float *boxmins, const float *boxmaxs, float *updateleafsmins, float *updateleafsmaxs, unsigned char *shadowtrispvs, unsigned char *lighttrispvs, unsigned char *visitingleafpvs)
 {
        int i;
        portalrecursioninfo_t info;
@@ -446,6 +455,7 @@ void Portal_Visibility(dp_model_t *model, const vec3_t eye, int *leaflist, unsig
        info.surfacelist = surfacelist;
        info.surfacepvs = surfacepvs;
        info.numleafs = 0;
+       info.visitingleafpvs = visitingleafpvs;
        info.leaflist = leaflist;
        info.leafpvs = leafpvs;
        info.model = model;