6#define COLLISION_EDGEDIR_DOT_EPSILON (0.999f)
7#define COLLISION_EDGECROSS_MINLENGTH2 (1.0f / 4194304.0f)
8#define COLLISION_SNAPSCALE (32.0f)
9#define COLLISION_SNAP (1.0f / COLLISION_SNAPSCALE)
10#define COLLISION_SNAP2 (2.0f / COLLISION_SNAPSCALE)
11#define COLLISION_PLANE_DIST_EPSILON (2.0f / COLLISION_SNAPSCALE)
14cvar_t collision_extendmovelength = {
CF_CLIENT |
CF_SERVER,
"collision_extendmovelength",
"16",
"internal bias on trace length to ensure detection of collisions within the collision_impactnudge distance so that short moves do not degrade across frames (this does not alter the final trace length)"};
67 int j, k, pointsoffplanes, pointonplanes, pointswithinsufficientplanes, printbrush;
72 Con_Print(
"Collision_ValidateBrush: brush with no points!\n");
79 Con_Print(
"Collision_ValidateBrush: brush with no planes and more than one point!\n");
86 pointswithinsufficientplanes = 0;
106 if (pointonplanes < 3)
107 pointswithinsufficientplanes++;
109 if (pointswithinsufficientplanes)
111 Con_Print(
"Collision_ValidateBrush: some points have insufficient planes, every point must be on at least 3 planes to form a corner.\n");
114 if (pointsoffplanes == 0)
116 Con_Print(
"Collision_ValidateBrush: all points lie on all planes (degenerate, no brush volume!)\n");
126 float dist, bestdist;
134 bestdist =
min(bestdist, dist);
142 float dist, bestdist;
150 bestdist =
max(bestdist, dist);
166 int j, k,
w, xyzflags;
167 int numpointsbuf = 0, maxpointsbuf = 256, numedgedirsbuf = 0, maxedgedirsbuf = 256, numplanesbuf = 0, maxplanesbuf = 256, numelementsbuf = 0, maxelementsbuf = 256;
174 int elementsbuf[1024];
175 int polypointbuf[256];
181 memset(pointsbuf, 0,
sizeof(pointsbuf));
182 memset(edgedirsbuf, 0,
sizeof(edgedirsbuf));
183 memset(planesbuf, 0,
sizeof(planesbuf));
184 memset(elementsbuf, 0,
sizeof(elementsbuf));
185 memset(polypointbuf, 0,
sizeof(polypointbuf));
186 memset(p, 0,
sizeof(p));
190 if (numoriginalplanes >= maxplanesbuf)
192 Con_DPrint(
"Collision_NewBrushFromPlanes: failed to build collision brush: too many planes for buffer\n");
198 for (j = 0;j < numoriginalplanes;j++)
199 maxdist =
max(maxdist,
fabs(originalplanes[j].dist));
201 maxdist =
floor(maxdist * (4.0 / 1024.0) + 2) * 1024.0;
205 for (j = 0;j < numoriginalplanes;j++)
210 planesbuf[numplanesbuf].
dist = originalplanes[j].
dist;
220 for (k = 0;k < numoriginalplanes && pnumpoints >= 3 && pnumpoints <= pmaxpoints;k++)
228 PolygonD_Divide(pnumpoints, p[
w], -originalplanes[k].
normal[0], -originalplanes[k].
normal[1], -originalplanes[k].
normal[2], -originalplanes[k].dist,
COLLISION_PLANE_DIST_EPSILON, pmaxpoints, p[!
w], &pnumpoints, 0,
NULL,
NULL,
NULL);
240 for (k = 0;k < pnumpoints;k++)
244 for (l = 0;l < numoriginalplanes;l++)
252 Con_DPrintf(
"Collision_NewBrushFromPlanes: warning: polygon point does not lie on at least 3 planes\n");
257 if (pnumpoints > pmaxpoints)
259 Con_DPrint(
"Collision_NewBrushFromPlanes: failed to build collision brush: too many points for buffer\n");
264 if (numelementsbuf + (pnumpoints - 2) * 3 > maxelementsbuf)
266 Con_DPrint(
"Collision_NewBrushFromPlanes: failed to build collision brush: too many triangle elements for buffer\n");
271 for (k = 0;k < pnumpoints;k++)
279 for (m = 0;m < numpointsbuf;m++)
284 if (m == numpointsbuf)
287 if (numpointsbuf >= maxpointsbuf)
289 Con_DPrint(
"Collision_NewBrushFromPlanes: failed to build collision brush: too many points for buffer\n");
303 for (k = 0;k < pnumpoints - 2;k++)
305 elementsbuf[numelementsbuf++] = polypointbuf[0];
306 elementsbuf[numelementsbuf++] = polypointbuf[k + 1];
307 elementsbuf[numelementsbuf++] = polypointbuf[k + 2];
311 for (k = 0,
n = pnumpoints-1;k < pnumpoints;
n = k, k++)
320 for (m = 0;m < numedgedirsbuf;m++)
324 if (m < numedgedirsbuf)
330 for (m = 0;m < numedgedirsbuf;m++)
334 if (m == numedgedirsbuf)
337 if (numedgedirsbuf >= maxedgedirsbuf)
339 Con_DPrint(
"Collision_NewBrushFromPlanes: failed to build collision brush: too many edgedirs for buffer\n");
349 if (isaabb && (originalplanes[j].
normal[0] == 0) + (originalplanes[j].
normal[1] == 0) + (originalplanes[j].
normal[2] == 0) < 2)
354 if (numplanesbuf < 4)
356 Con_DPrintf(
"Collision_NewBrushFromPlanes: failed to build collision brush: %i triangles, %i planes (input was %i planes), %i vertices\n", numelementsbuf / 3, numplanesbuf, numoriginalplanes, numpointsbuf);
361 if (numelementsbuf < 12 || numpointsbuf < 4)
362 Con_DPrintf(
"Collision_NewBrushFromPlanes: unable to rebuild triangles/points for collision brush: %i triangles, %i planes (input was %i planes), %i vertices\n", numelementsbuf / 3, numplanesbuf, numoriginalplanes, numpointsbuf);
365 for (j = 0;j < numplanesbuf;j++)
369 Con_DPrintf(
"plane %f %f %f %f mismatches dist %f\n", planesbuf[j].
normal[0], planesbuf[j].
normal[1], planesbuf[j].
normal[2], planesbuf[j].dist, d);
389 brush->
points[j].
v[0] = pointsbuf[j].
v[0];
390 brush->
points[j].
v[1] = pointsbuf[j].
v[1];
391 brush->
points[j].
v[2] = pointsbuf[j].
v[2];
395 brush->
edgedirs[j].
v[0] = edgedirsbuf[j].
v[0];
396 brush->
edgedirs[j].
v[1] = edgedirsbuf[j].
v[1];
397 brush->
edgedirs[j].
v[2] = edgedirsbuf[j].
v[2];
409 brush->
elements[j] = elementsbuf[j];
414 for (j = 0;j <
min(6, numoriginalplanes);j++)
416 if (originalplanes[j].
normal[0] == 1) {xyzflags |= 1;brush->
maxs[0] = originalplanes[j].
dist;}
417 else if (originalplanes[j].
normal[0] == -1) {xyzflags |= 2;brush->
mins[0] = -originalplanes[j].
dist;}
418 else if (originalplanes[j].
normal[1] == 1) {xyzflags |= 4;brush->
maxs[1] = originalplanes[j].
dist;}
419 else if (originalplanes[j].
normal[1] == -1) {xyzflags |= 8;brush->
mins[1] = -originalplanes[j].
dist;}
420 else if (originalplanes[j].
normal[2] == 1) {xyzflags |= 16;brush->
maxs[2] = originalplanes[j].
dist;}
421 else if (originalplanes[j].
normal[2] == -1) {xyzflags |= 32;brush->
mins[2] = -originalplanes[j].
dist;}
453 float edge0[3], edge1[3], edge2[3];
498 float projectionnormal[3], projectionedge0[3], projectionedge1[3], projectionedge2[3];
500 float dist, bestdist;
503 for (
i = 1;
i < 3;
i++)
514 projectionnormal[best] = -1;
516 projectionnormal[best] = 1;
520 projectionedge0[best] = 0;
521 projectionedge1[best] = 0;
522 projectionedge2[best] = 0;
551 for (j = 0, p = brush->
points;j < brush->numpoints;j++, p++)
553 Con_DPrintf(
"Error in brush plane generation, plane %i\n",
i);
561 int nplane, nplane2, nedge1, nedge2, hitq3surfaceflags = 0;
564 int tracenumpoints = trace_start->
numpoints;
565 int othernumpoints = other_start->
numpoints;
567 int numplanes2 = numplanes1 + trace_start->
numplanes;
569 vec_t enterfrac = -1, leavefrac = 1, startdist, enddist, ie,
f, imove, enterfrac2 = -1;
574 vec_t startdepth = 1;
583 numplanes3 = numplanes2 = numplanes1;
595 for (nplane = 0;nplane < numplanes3;nplane++)
597 if (nplane < numplanes1)
603 else if (nplane < numplanes2)
605 nplane2 = nplane - numplanes1;
612 nplane2 = nplane - numplanes2;
613 nedge1 = nplane2 >> 1;
614 nedge2 = nedge1 / tracenumedgedirs;
615 nedge1 -= nedge2 * tracenumedgedirs;
638 if (startdist <= 0.0f && nplane < numplanes1 && (startdepth < startdist || startdepth == 1))
640 startdepth = startdist;
645 if (startdist > enddist)
653 imove = 1 / (startdist - enddist);
654 f = startdist * imove;
661 if (enterfrac > leavefrac)
671 ie = 1.0f - enterfrac;
672 newimpactplane[0] = startplane[0] * ie + endplane[0] * enterfrac;
673 newimpactplane[1] = startplane[1] * ie + endplane[1] * enterfrac;
674 newimpactplane[2] = startplane[2] * ie + endplane[2] * enterfrac;
675 newimpactplane[3] = startplane[3] * ie + endplane[3] * enterfrac;
676 if (nplane < numplanes1)
683 else if (nplane < numplanes2)
686 nplane2 = nplane - numplanes1;
693 hittexture = other_start->
texture;
706 f = startdist / (startdist - enddist);
713 if (enterfrac > leavefrac)
762 int nplane, hitq3surfaceflags = 0;
764 vec_t enterfrac = -1, leavefrac = 1, startdist, enddist, ie,
f, imove, enterfrac2 = -1;
769 vec_t startdepth = 1;
795 for (nplane = 0;nplane < numplanes;nplane++)
798 startplane[3] = other_start->
planes[nplane].
dist;
801 startdist =
DotProduct(linestart, startplane) - startplane[3];
802 enddist =
DotProduct(lineend, endplane) - endplane[3];
806 if (startdist <= 0.0f && (startdepth < startdist || startdepth == 1))
808 startdepth = startdist;
813 if (startdist > enddist)
821 imove = 1 / (startdist - enddist);
822 f = startdist * imove;
829 if (enterfrac > leavefrac)
839 ie = 1.0f - enterfrac;
840 newimpactplane[0] = startplane[0] * ie + endplane[0] * enterfrac;
841 newimpactplane[1] = startplane[1] * ie + endplane[1] * enterfrac;
842 newimpactplane[2] = startplane[2] * ie + endplane[2] * enterfrac;
843 newimpactplane[3] = startplane[3] * ie + endplane[3] * enterfrac;
857 f = startdist / (startdist - enddist);
864 if (enterfrac > leavefrac)
917 for (nplane = 0, plane = brush->
planes;nplane < brush->numplanes;nplane++, plane++)
930 vec_t startdepth = 1;
947 for (nplane = 0; nplane < numplanes; nplane++)
950 startplane[3] = other_start->
planes[nplane].
dist;
951 startdist =
DotProduct(linestart, startplane) - startplane[3];
957 if (startdepth < startdist || startdepth == 1)
959 startdepth = startdist;
988 for (
i = 0;
i < numpoints;
i++)
990 out[
i].
v[0] =
floor(in[
i].
v[0] * fractionprecision + 0.5f) * invfractionprecision;
991 out[
i].
v[1] =
floor(in[
i].
v[1] * fractionprecision + 0.5f) * invfractionprecision;
992 out[
i].
v[2] =
floor(in[
i].
v[2] * fractionprecision + 0.5f) * invfractionprecision;
996void Collision_TraceBrushTriangleMeshFloat(
trace_t *trace,
const colbrushf_t *thisbrush_start,
const colbrushf_t *thisbrush_end,
int numtriangles,
const int *element3i,
const float *vertex3f,
int stride,
float *bbox6f,
int supercontents,
int q3surfaceflags,
const texture_t *
texture,
const vec3_t segmentmins,
const vec3_t segmentmaxs)
1003 memset(&brush, 0,
sizeof(brush));
1024 for(
i = 0;
i < cnt; ++
i)
1026 if(
BoxesOverlap(bbox6f +
i * 6, bbox6f +
i * 6 + 3, segmentmins, segmentmaxs))
1028 for(k = 0; k <
stride; ++k)
1031 if(tri >= numtriangles)
1033 VectorCopy(vertex3f + element3i[tri * 3 + 0] * 3, points[0].
v);
1034 VectorCopy(vertex3f + element3i[tri * 3 + 1] * 3, points[1].
v);
1035 VectorCopy(vertex3f + element3i[tri * 3 + 2] * 3, points[2].
v);
1047 for (
i = 0;
i < numtriangles;
i++, element3i += 3)
1049 if (
TriangleBBoxOverlapsBox(vertex3f + element3i[0]*3, vertex3f + element3i[1]*3, vertex3f + element3i[2]*3, segmentmins, segmentmaxs))
1051 VectorCopy(vertex3f + element3i[0] * 3, points[0].
v);
1052 VectorCopy(vertex3f + element3i[1] * 3, points[1].
v);
1053 VectorCopy(vertex3f + element3i[2] * 3, points[2].
v);
1064 for (
i = 0;
i < numtriangles;
i++, element3i += 3)
1066 VectorCopy(vertex3f + element3i[0] * 3, points[0].
v);
1067 VectorCopy(vertex3f + element3i[1] * 3, points[1].
v);
1068 VectorCopy(vertex3f + element3i[2] * 3, points[2].
v);
1078void Collision_TraceLineTriangleMeshFloat(
trace_t *trace,
const vec3_t linestart,
const vec3_t lineend,
int numtriangles,
const int *element3i,
const float *vertex3f,
int stride,
float *bbox6f,
int supercontents,
int q3surfaceflags,
const texture_t *
texture,
const vec3_t segmentmins,
const vec3_t segmentmaxs)
1086 for(
i = 0;
i < cnt; ++
i)
1088 if(
BoxesOverlap(bbox6f +
i * 6, bbox6f +
i * 6 + 3, segmentmins, segmentmaxs))
1090 for(k = 0; k <
stride; ++k)
1093 if(tri >= numtriangles)
1095 Collision_TraceLineTriangleFloat(trace, linestart, lineend, vertex3f + element3i[tri * 3 + 0] * 3, vertex3f + element3i[tri * 3 + 1] * 3, vertex3f + element3i[tri * 3 + 2] * 3, supercontents, q3surfaceflags,
texture);
1102 for (
i = 0;
i < numtriangles;
i++, element3i += 3)
1114 memset(&brush, 0,
sizeof(brush));
1144 memset(boxbrush, 0,
sizeof(*boxbrush));
1186 for (
i = 0;
i < 6;
i++)
1209 double dir[3],
scale,
v[3], deviationdist2, impactdist, linelength;
1220 scale = 1.0 / linelength;
1233 if (deviationdist2 < 0)
1236 impactdist -=
sqrt(deviationdist2);
1237 if (impactdist >= linelength)
1242 VectorMA(linestart, impactdist,
dir, impactpoint);
1248 return impactdist / linelength;
1253 float d1, d2, d,
f, f2, impact[3], edgenormal[3], faceplanenormal[3], faceplanedist, faceplanenormallength2, edge01[3], edge21[3], edge02[3];
1276 faceplanenormallength2 =
DotProduct(faceplanenormal, faceplanenormal);
1277 if (faceplanenormallength2 < 0.0001f)
1281 faceplanedist =
DotProduct(point0, faceplanenormal);
1289 if (d1 <= faceplanedist)
1296 if (d2 >= faceplanedist)
1305 d = 1.0f / (d1 - d2);
1311 f = (d1 - faceplanedist) * d;
1319 impact[0] = linestart[0] +
f * (lineend[0] - linestart[0]);
1320 impact[1] = linestart[1] +
f * (lineend[1] - linestart[1]);
1321 impact[2] = linestart[2] +
f * (lineend[2] - linestart[2]);
1358 d = 1.0 /
sqrt(faceplanenormallength2);
1371 float tempstart[3], tempend[3];
1446typedef struct collision_cachedtrace_parameters_s
1458typedef struct collision_cachedtrace_s
1523 unsigned int hashindex;
1532 hashindex = arrayhashindex[
index];
1533 arraynext[
index] = hash[hashindex];
1534 hash[hashindex] =
index;
1539 if (firstfree >
index)
1576 unsigned int hashindex = 0;
1579 hashindex += array[
i] * (1 +
i);
1586 unsigned int fullhashindex;
1605 params.hitsupercontentsmask = hitsupercontentsmask;
1606 params.skipsupercontentsmask = skipsupercontentsmask;
1607 params.skipmaterialflagsmask = skipmaterialflagsmask;
1613 if (arrayfullhashindex[
index] != fullhashindex)
1647 cached->
valid =
true;
1683 cached->
valid =
false;
1700 Collision_ClipLineToGenericEntity(trace,
model,
NULL,
NULL,
vec3_origin,
vec3_origin, 0, matrix, inversematrix, start, end, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask,
collision_extendmovelength.
value,
true);
1719typedef struct extendtraceinfo_s
1725 float extendstart[3];
1727 float extenddelta[3];
1737 memset(trace, 0,
sizeof(*trace));
1740 extendtraceinfo->
trace = trace;
1750 extendtraceinfo->
extend = textend;
1791void Collision_ClipToGenericEntity(
trace_t *trace,
model_t *
model,
const frameblend_t *frameblend,
const skeleton_t *skeleton,
const vec3_t bodymins,
const vec3_t bodymaxs,
int bodysupercontents,
matrix4x4_t *matrix,
matrix4x4_t *inversematrix,
const vec3_t tstart,
const vec3_t mins,
const vec3_t maxs,
const vec3_t tend,
int hitsupercontentsmask,
int skipsupercontentsmask,
int skipmaterialflagsmask,
float extend)
1793 vec3_t starttransformed, endtransformed;
1799#if COLLISIONPARANOID >= 3
1800 Con_Printf(
"trans(%f %f %f -> %f %f %f, %f %f %f -> %f %f %f)", extendtraceinfo.
extendstart[0], extendtraceinfo.
extendstart[1], extendtraceinfo.
extendstart[2], starttransformed[0], starttransformed[1], starttransformed[2], extendtraceinfo.
extendend[0], extendtraceinfo.
extendend[1], extendtraceinfo.
extendend[2], endtransformed[0], endtransformed[1], endtransformed[2]);
1805 if(
model->TraceBrush && (inversematrix->
m[0][1] || inversematrix->
m[0][2] || inversematrix->
m[1][0] || inversematrix->
m[1][2] || inversematrix->
m[2][0] || inversematrix->
m[2][1]))
1819 model->TraceBrush(
model, frameblend, skeleton, trace, &thisbrush_start.
brush, &thisbrush_end.
brush, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask);
1822 model->TraceBox(
model, frameblend, skeleton, trace, starttransformed,
mins,
maxs, endtransformed, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask);
1825 Collision_ClipTrace_Box(trace, bodymins, bodymaxs, starttransformed,
mins,
maxs, endtransformed, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, bodysupercontents, 0,
NULL);
1840 model->TraceBox(
model,
NULL,
NULL, trace, extendtraceinfo.
extendstart,
mins,
maxs, extendtraceinfo.
extendend, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask);
1844void Collision_ClipLineToGenericEntity(
trace_t *trace,
model_t *
model,
const frameblend_t *frameblend,
const skeleton_t *skeleton,
const vec3_t bodymins,
const vec3_t bodymaxs,
int bodysupercontents,
matrix4x4_t *matrix,
matrix4x4_t *inversematrix,
const vec3_t tstart,
const vec3_t tend,
int hitsupercontentsmask,
int skipsupercontentsmask,
int skipmaterialflagsmask,
float extend,
qbool hitsurfaces)
1846 vec3_t starttransformed, endtransformed;
1852#if COLLISIONPARANOID >= 3
1853 Con_Printf(
"trans(%f %f %f -> %f %f %f, %f %f %f -> %f %f %f)", extendtraceinfo.
extendstart[0], extendtraceinfo.
extendstart[1], extendtraceinfo.
extendstart[2], starttransformed[0], starttransformed[1], starttransformed[2], extendtraceinfo.
extendend[0], extendtraceinfo.
extendend[1], extendtraceinfo.
extendend[2], endtransformed[0], endtransformed[1], endtransformed[2]);
1856 if (
model &&
model->TraceLineAgainstSurfaces && hitsurfaces)
1857 model->TraceLineAgainstSurfaces(
model, frameblend, skeleton, trace, starttransformed, endtransformed, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask);
1859 model->TraceLine(
model, frameblend, skeleton, trace, starttransformed, endtransformed, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask);
1861 Collision_ClipTrace_Box(trace, bodymins, bodymaxs, starttransformed,
vec3_origin,
vec3_origin, endtransformed, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, bodysupercontents, 0,
NULL);
1875 if (
model &&
model->TraceLineAgainstSurfaces && hitsurfaces)
1883void Collision_ClipPointToGenericEntity(
trace_t *trace,
model_t *
model,
const frameblend_t *frameblend,
const skeleton_t *skeleton,
const vec3_t bodymins,
const vec3_t bodymaxs,
int bodysupercontents,
matrix4x4_t *matrix,
matrix4x4_t *inversematrix,
const vec3_t start,
int hitsupercontentsmask,
int skipsupercontentsmask,
int skipmaterialflagsmask)
1885 float starttransformed[3];
1886 memset(trace, 0,
sizeof(*trace));
1890#if COLLISIONPARANOID >= 3
1891 Con_Printf(
"trans(%f %f %f -> %f %f %f)", start[0], start[1], start[2], starttransformed[0], starttransformed[1], starttransformed[2]);
1895 model->TracePoint(
model,
NULL,
NULL, trace, starttransformed, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask);
1897 Collision_ClipTrace_Point(trace, bodymins, bodymaxs, starttransformed, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, bodysupercontents, 0,
NULL);
1907 memset(trace, 0,
sizeof(*trace));
1910 model->TracePoint(
model,
NULL,
NULL, trace, start, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask);
1925 cliptrace->
ent = touch;
1944 cliptrace->
ent = touch;
#define CF_SERVER
cvar/command that only the server can change/execute
#define CF_CLIENT
cvar/command that only the client can change/execute
static void Collision_PrintBrushAsQHull(colbrushf_t *brush, const char *name)
cvar_t collision_triangle_bevelsides
void Collision_ClipToWorld(trace_t *trace, model_t *model, const vec3_t tstart, const vec3_t mins, const vec3_t maxs, const vec3_t tend, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend)
float Collision_ClipTrace_Line_Sphere(double *linestart, double *lineend, double *sphereorigin, double sphereradius, double *impactpoint, double *impactnormal)
void Collision_Init(void)
static void Collision_ValidateBrush(colbrushf_t *brush)
void Collision_TraceLineTriangleFloat(trace_t *trace, const vec3_t linestart, const vec3_t lineend, const float *point0, const float *point1, const float *point2, int supercontents, int q3surfaceflags, const texture_t *texture)
qbool Collision_PointInsideBrushFloat(const vec3_t point, const colbrushf_t *brush)
static void Collision_ClipExtendFinish(extendtraceinfo_t *extendtraceinfo)
void Collision_Cache_NewFrame(void)
static void Collision_SnapCopyPoints(int numpoints, const colpointf_t *in, colpointf_t *out, float fractionprecision, float invfractionprecision)
static collision_cachedtrace_t * Collision_Cache_Lookup(model_t *model, const matrix4x4_t *matrix, const matrix4x4_t *inversematrix, const vec3_t start, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask)
static void Collision_TransformBrush(const matrix4x4_t *matrix, colbrushf_t *brush)
cvar_t collision_bih_fullrecursion
void Collision_TraceLineTriangleMeshFloat(trace_t *trace, const vec3_t linestart, const vec3_t lineend, int numtriangles, const int *element3i, const float *vertex3f, int stride, float *bbox6f, int supercontents, int q3surfaceflags, const texture_t *texture, const vec3_t segmentmins, const vec3_t segmentmaxs)
void Collision_Cache_Init(mempool_t *mempool)
static unsigned char * collision_cachedtrace_arrayused
static unsigned int * collision_cachedtrace_arrayfullhashindex
static void Collision_Cache_RebuildHash(void)
static void Collision_CalcEdgeDirsForPolygonBrushFloat(colbrushf_t *brush)
mempool_t * collision_mempool
void Collision_TraceBrushTriangleMeshFloat(trace_t *trace, const colbrushf_t *thisbrush_start, const colbrushf_t *thisbrush_end, int numtriangles, const int *element3i, const float *vertex3f, int stride, float *bbox6f, int supercontents, int q3surfaceflags, const texture_t *texture, const vec3_t segmentmins, const vec3_t segmentmaxs)
static unsigned int Collision_Cache_HashIndexForArray(unsigned int *array, unsigned int size)
colbrushf_t * Collision_NewBrushFromPlanes(mempool_t *mempool, int numoriginalplanes, const colplanef_t *originalplanes, int supercontents, int q3surfaceflags, const texture_t *texture, int hasaabbplanes)
void Collision_ClipLineToWorld(trace_t *trace, model_t *model, const vec3_t tstart, const vec3_t tend, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend, qbool hitsurfaces)
void Collision_CombineTraces(trace_t *cliptrace, const trace_t *trace, void *touch, qbool isbmodel)
static void Collision_TranslateBrush(const vec3_t shift, colbrushf_t *brush)
static int collision_cachedtrace_max
#define COLLISION_EDGECROSS_MINLENGTH2
void Collision_Cache_Reset(qbool resetlimits)
void Collision_ClipLineToGenericEntity(trace_t *trace, model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, const vec3_t bodymins, const vec3_t bodymaxs, int bodysupercontents, matrix4x4_t *matrix, matrix4x4_t *inversematrix, const vec3_t tstart, const vec3_t tend, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend, qbool hitsurfaces)
static qbool collision_cachedtrace_rebuildhash
static mempool_t * collision_cachedtrace_mempool
cvar_t collision_triangle_axialsides
#define COLLISION_PLANE_DIST_EPSILON
static int collision_cachedtrace_lastused
void Collision_ClipToGenericEntity(trace_t *trace, model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, const vec3_t bodymins, const vec3_t bodymaxs, int bodysupercontents, matrix4x4_t *matrix, matrix4x4_t *inversematrix, const vec3_t tstart, const vec3_t mins, const vec3_t maxs, const vec3_t tend, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend)
void Collision_TracePointBrushFloat(trace_t *trace, const vec3_t linestart, const colbrushf_t *other_start)
static unsigned int * collision_cachedtrace_arrayhashindex
void Collision_TraceBrushTriangleFloat(trace_t *trace, const colbrushf_t *thisbrush_start, const colbrushf_t *thisbrush_end, const float *v0, const float *v1, const float *v2, int supercontents, int q3surfaceflags, const texture_t *texture)
static int collision_cachedtrace_firstfree
void Collision_Cache_ClipLineToWorldSurfaces(trace_t *trace, model_t *model, const vec3_t start, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask)
static void Collision_ClipExtendPrepare(extendtraceinfo_t *extendtraceinfo, trace_t *trace, const vec3_t tstart, const vec3_t tend, float textend)
void Collision_BoundingBoxOfBrushTraceSegment(const colbrushf_t *start, const colbrushf_t *end, vec3_t mins, vec3_t maxs, float startfrac, float endfrac)
void Collision_BrushForBox(colboxbrushf_t *boxbrush, const vec3_t mins, const vec3_t maxs, int supercontents, int q3surfaceflags, const texture_t *texture)
void Collision_TraceBrushBrushFloat(trace_t *trace, const colbrushf_t *trace_start, const colbrushf_t *trace_end, const colbrushf_t *other_start, const colbrushf_t *other_end)
static collision_cachedtrace_t * collision_cachedtrace_array
static unsigned int * collision_cachedtrace_arraynext
cvar_t collision_extendmovelength
cvar_t collision_debug_tracelineasbox
cvar_t collision_extendtracelinelength
static unsigned char collision_cachedtrace_sequence
void Collision_TraceLineBrushFloat(trace_t *trace, const vec3_t linestart, const vec3_t lineend, const colbrushf_t *other_start, const colbrushf_t *other_end)
void Collision_CalcPlanesForTriangleBrushFloat(colbrushf_t *brush)
static float nearestplanedist_float(const float *normal, const colpointf_t *points, int numpoints)
static int * collision_cachedtrace_hash
void Collision_Cache_ClipLineToGenericEntitySurfaces(trace_t *trace, model_t *model, matrix4x4_t *matrix, matrix4x4_t *inversematrix, const vec3_t start, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask)
cvar_t collision_impactnudge
static float furthestplanedist_float(const float *normal, const colpointf_t *points, int numpoints)
#define COLLISION_EDGEDIR_DOT_EPSILON
void Collision_ClipPointToWorld(trace_t *trace, model_t *model, const vec3_t start, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask)
cvar_t collision_extendtraceboxlength
static int collision_cachedtrace_hashsize
#define COLLISION_SNAPSCALE
void Collision_ClipPointToGenericEntity(trace_t *trace, model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, const vec3_t bodymins, const vec3_t bodymaxs, int bodysupercontents, matrix4x4_t *matrix, matrix4x4_t *inversematrix, const vec3_t start, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask)
void Collision_ClipTrace_Point(trace_t *trace, const vec3_t cmins, const vec3_t cmaxs, const vec3_t start, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, int boxsupercontents, int boxq3surfaceflags, const texture_t *boxtexture)
void Collision_ClipTrace_Box(trace_t *trace, const vec3_t cmins, const vec3_t cmaxs, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, int boxsupercontents, int boxq3surfaceflags, const texture_t *boxtexture)
void Con_Print(const char *msg)
Prints to all appropriate console targets, and adds timestamps.
void Con_DPrintf(const char *fmt,...)
A Con_Printf that only shows up if the "developer" cvar is set.
void Con_Printf(const char *fmt,...)
Prints to all appropriate console targets.
void Con_DPrint(const char *msg)
A Con_Print that only shows up if the "developer" cvar is set.
void Cvar_RegisterVariable(cvar_t *variable)
registers a cvar that already has the name, string, and optionally the archive elements set.
static int(ZEXPORT *qz_inflate)(z_stream *strm
GLenum GLenum GLuint texture
GLenum GLenum GLint * params
GLfloat GLfloat GLfloat v2
GLubyte GLubyte GLubyte GLubyte w
GLint GLenum GLboolean GLsizei stride
#define VectorLerp(v1, lerp, v2, out)
#define VectorNegate(a, b)
#define BoxesOverlap(a, b, c, d)
#define VectorNormalize(v)
#define bound(min, num, max)
#define VectorSet(vec, x, y, z)
#define VectorDistance2(a, b)
#define VectorSubtract(a, b, out)
#define CrossProduct(a, b, out)
#define VectorCompare(a, b)
#define TriangleNormal(a, b, c, n)
#define VectorCopy(in, out)
#define VectorScale(in, scale, out)
#define VectorAdd(a, b, out)
#define VectorMA(a, scale, b, out)
#define TriangleBBoxOverlapsBox(a, b, c, d, e)
void Matrix4x4_TransformPositivePlane(const matrix4x4_t *in, float x, float y, float z, float d, float *o)
void Matrix4x4_Transform(const matrix4x4_t *in, const float v[3], float out[3])
const matrix4x4_t identitymatrix
void PolygonD_QuadForPlane(double *outpoints, double planenormalx, double planenormaly, double planenormalz, double planedist, double quadsize)
void PolygonD_Divide(int innumpoints, const double *inpoints, double planenormalx, double planenormaly, double planenormalz, double planedist, double epsilon, int outfrontmaxpoints, double *outfrontpoints, int *neededfrontpoints, int outbackmaxpoints, double *outbackpoints, int *neededbackpoints, int *oncountpointer)
@ r_stat_photoncache_traced
@ r_stat_photoncache_cached
const struct texture_s * texture
int skipsupercontentsmask
int skipmaterialflagsmask
collision_cachedtrace_parameters_t p
const struct texture_s * texture
const struct texture_s * hittexture
double startdepthnormal[3]
const struct texture_s * starttexture
int skipsupercontentsmask
int skipmaterialflagsmask
#define Mem_Alloc(pool, size)
#define Mem_AllocPool(name, flags, parent)