]> git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
disabled use of Portal_PortalThroughPortalPlanes on triangles in exact triangle culli...
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 24 Jan 2007 21:27:06 +0000 (21:27 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 24 Jan 2007 21:27:06 +0000 (21:27 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@6754 d7cf8633-e32d-0410-b094-e92efae38249

portals.c

index 759fa4d7f2ceefd757b9beb4d2273903c15bb5f1..b53e14e9f87cae5ebf3e07b478afcf040773d9d4 100644 (file)
--- a/portals.c
+++ b/portals.c
@@ -15,23 +15,22 @@ static float boxpoints[4*3];
 
 static int Portal_PortalThroughPortalPlanes(tinyplane_t *clipplanes, int clipnumplanes, float *targpoints, int targnumpoints, float *out, int maxpoints)
 {
-       int numpoints, i;
-       if (targnumpoints < 3)
-               return targnumpoints;
-       if (maxpoints < 3)
-               return -1;
-       numpoints = targnumpoints;
-       memcpy(&portaltemppoints[0][0][0], targpoints, numpoints * 3 * sizeof(float));
-       for (i = 0;i < clipnumplanes;i++)
+       int numpoints = targnumpoints, i, w;
+       if (numpoints < 1)
+               return numpoints;
+       if (maxpoints > 256)
+               maxpoints = 256;
+       w = 0;
+       memcpy(&portaltemppoints[w][0][0], targpoints, numpoints * 3 * sizeof(float));
+       for (i = 0;i < clipnumplanes && numpoints > 0;i++)
        {
-               PolygonF_Divide(numpoints, &portaltemppoints[0][0][0], clipplanes[i].normal[0], clipplanes[i].normal[1], clipplanes[i].normal[2], clipplanes[i].dist, 1.0f/32.0f, 256, &portaltemppoints[1][0][0], &numpoints, 0, NULL, NULL, NULL);
-               if (numpoints < 3)
-                       return numpoints;
-               memcpy(&portaltemppoints[0][0][0], &portaltemppoints[1][0][0], numpoints * 3 * sizeof(float));
+               PolygonF_Divide(numpoints, &portaltemppoints[w][0][0], clipplanes[i].normal[0], clipplanes[i].normal[1], clipplanes[i].normal[2], clipplanes[i].dist, 1.0f/32.0f, 256, &portaltemppoints[1-w][0][0], &numpoints, 0, NULL, NULL, NULL);
+               w = 1-w;
+               numpoints = min(numpoints, 256);
        }
-       if (numpoints > maxpoints)
-               return -1;
-       memcpy(out, &portaltemppoints[0][0][0], numpoints * 3 * sizeof(float));
+       numpoints = min(numpoints, maxpoints);
+       if (numpoints > 0)
+               memcpy(out, &portaltemppoints[w][0][0], numpoints * 3 * sizeof(float));
        return numpoints;
 }
 
@@ -340,7 +339,9 @@ static void Portal_RecursiveFlow (portalrecursioninfo_t *info, mleaf_t *leaf, in
                                                                trimaxs[1] = max(v[1], max(v[4], v[7]));
                                                                trimins[2] = min(v[2], min(v[5], v[8]));
                                                                trimaxs[2] = max(v[2], max(v[5], v[8]));
-                                                               if (BoxesOverlap(trimins, trimaxs, info->boxmins, info->boxmaxs) && Portal_PortalThroughPortalPlanes(&portalplanes[firstclipplane], numclipplanes, v, 3, &portaltemppoints2[0][0], 256) >= 3)
+                                                               // FIXME: Portal_PortalThroughPortalPlanes is
+                                                               // nice, but it seems to fail on some polygons
+                                                               if (BoxesOverlap(trimins, trimaxs, info->boxmins, info->boxmaxs))// && Portal_PortalThroughPortalPlanes(&portalplanes[firstclipplane], numclipplanes, v, 3, &portaltemppoints2[0][0], 256) > 0)
                                                                {
                                                                        SETPVSBIT(info->surfacepvs, surfaceindex);
                                                                        info->surfacelist[info->numsurfaces++] = surfaceindex;