#endif
}
-static int Q3PatchTesselation(float largestsquared2xcurvearea, float tolerance)
+static int Q3PatchTesselation(float largestsquared3xcurvearea, float tolerance)
{
float f;
// f is actually a squared 2x curve area... so the formula had to be adjusted to give roughly the same subdivisions
- f = pow(largestsquared2xcurvearea / 64.0, 0.25) / tolerance;
+ f = pow(largestsquared3xcurvearea / 64.0f, 0.25f) / tolerance;
//if(f < 0.25) // VERY flat patches
if(f < 0.0001) // TOTALLY flat patches
return 0;
else if(f < 2)
return 1;
else
- return (int) floor(log(f) / log(2)) + 1;
+ return (int) floor(log(f) / log(2.0f)) + 1;
// this is always at least 2
// maps [0.25..0.5[ to -1 (actually, 1 is returned)
// maps [0.5..1[ to 0 (actually, 1 is returned)
{
int x, y;
const float *patch;
- float squared2xcurvearea, largestsquared2xcurvearea;
- largestsquared2xcurvearea = 0;
+ float squared3xcurvearea, largestsquared3xcurvearea;
+ largestsquared3xcurvearea = 0;
for (y = 0;y < patchheight;y++)
{
for (x = 0;x < patchwidth-1;x += 2)
{
patch = in + ((y * patchwidth) + x) * components;
- squared2xcurvearea = Squared3xCurveArea(&patch[0], &patch[components], &patch[2*components], components);
- if (largestsquared2xcurvearea < squared2xcurvearea)
- largestsquared2xcurvearea = squared2xcurvearea;
+ squared3xcurvearea = Squared3xCurveArea(&patch[0], &patch[components], &patch[2*components], components);
+ if (largestsquared3xcurvearea < squared3xcurvearea)
+ largestsquared3xcurvearea = squared3xcurvearea;
}
}
- return Q3PatchTesselation(largestsquared2xcurvearea, tolerance);
+ return Q3PatchTesselation(largestsquared3xcurvearea, tolerance);
}
// returns how much tesselation of each segment is needed to remain under tolerance
{
int x, y;
const float *patch;
- float squared2xcurvearea, largestsquared2xcurvearea;
- largestsquared2xcurvearea = 0;
+ float squared3xcurvearea, largestsquared3xcurvearea;
+ largestsquared3xcurvearea = 0;
for (y = 0;y < patchheight-1;y += 2)
{
for (x = 0;x < patchwidth;x++)
{
patch = in + ((y * patchwidth) + x) * components;
- squared2xcurvearea = Squared3xCurveArea(&patch[0], &patch[patchwidth*components], &patch[2*patchwidth*components], components);
- if (largestsquared2xcurvearea < squared2xcurvearea)
- largestsquared2xcurvearea = squared2xcurvearea;
+ squared3xcurvearea = Squared3xCurveArea(&patch[0], &patch[patchwidth*components], &patch[2*patchwidth*components], components);
+ if (largestsquared3xcurvearea < squared3xcurvearea)
+ largestsquared3xcurvearea = squared3xcurvearea;
}
}
- return Q3PatchTesselation(largestsquared2xcurvearea, tolerance);
+ return Q3PatchTesselation(largestsquared3xcurvearea, tolerance);
}
// Find an equal vertex in array. Check only vertices with odd X and Y
struct {int id1,id2;} commonverts[8];
int i, j, k, side1, side2, *tess1, *tess2;
- int dist1, dist2;
+ int dist1 = 0, dist2 = 0;
qboolean modified = false;
// Potential paired vertices (corners of the first patch)
int x, y, row0, row1;
for (y = 0;y < height - 1;y++)
{
- row0 = firstvertex + (y + 0) * width;
- row1 = firstvertex + (y + 1) * width;
- for (x = 0;x < width - 1;x++)
+ if(y % 2)
{
- *elements++ = row0;
- *elements++ = row1;
- *elements++ = row0 + 1;
- *elements++ = row1;
- *elements++ = row1 + 1;
- *elements++ = row0 + 1;
- row0++;
- row1++;
+ // swap the triangle order in odd rows as optimization for collision stride
+ row0 = firstvertex + (y + 0) * width + width - 2;
+ row1 = firstvertex + (y + 1) * width + width - 2;
+ for (x = 0;x < width - 1;x++)
+ {
+ *elements++ = row1;
+ *elements++ = row1 + 1;
+ *elements++ = row0 + 1;
+ *elements++ = row0;
+ *elements++ = row1;
+ *elements++ = row0 + 1;
+ row0--;
+ row1--;
+ }
+ }
+ else
+ {
+ row0 = firstvertex + (y + 0) * width;
+ row1 = firstvertex + (y + 1) * width;
+ for (x = 0;x < width - 1;x++)
+ {
+ *elements++ = row0;
+ *elements++ = row1;
+ *elements++ = row0 + 1;
+ *elements++ = row1;
+ *elements++ = row1 + 1;
+ *elements++ = row0 + 1;
+ row0++;
+ row1++;
+ }
}
}
}