rendered paste bodyqboolean ID_INLINE BoxTraceTestResult( int axis, float dist, const vec3_t start, const vec3_t forward, const vec3_t mins, const vec3_t maxs, vec3_t result ) {
result[0] = start[0] + forward[0] * dist;
result[1] = start[1] + forward[1] * dist;
result[2] = start[2] + forward[2] * dist;
if (axis != 0 && (result[0] < mins[0] || result[0] > maxs[0]))
return qfalse;
if (axis != 1 && (result[1] < mins[1] || result[1] > maxs[1]))
return qfalse;
if (axis != 2 && (result[2] < mins[2] || result[2] > maxs[2]))
return qfalse;
return qtrue;
}
qboolean ID_INLINE BoxTraceTestSides( int axis, const vec3_t start, const vec3_t forward, const vec3_t mins, const vec3_t maxs, vec3_t result ) {
if (forward[axis] > 0 && start[axis] <= mins[axis]) {
float dist = ( mins[axis] - start[axis] ) / forward[axis];
if (BoxTraceTestResult(axis, dist, start, forward, mins, maxs, result))
return qtrue;
}
if (forward[axis] < 0 && start[axis] >= maxs[axis]) {
float dist = ( maxs[axis] - start[axis] ) / forward[axis];
if (BoxTraceTestResult(axis, dist, start, forward, mins, maxs, result))
return qtrue;
}
return qfalse;
}
qboolean BoxTraceImpact(const vec3_t start, const vec3_t forward, const vec3_t container, vec3_t result ) {
vec3_t mins, maxs;
mins[0] = -container[2];
mins[1] = -container[2];
mins[2] = container[0];
maxs[0] = container[2];
maxs[1] = container[2];
maxs[2] = container[1];
if (BoxTraceTestSides(0, start, forward, mins, maxs, result))
return qtrue;
if (BoxTraceTestSides(1, start, forward, mins, maxs, result))
return qtrue;
if (BoxTraceTestSides(2, start, forward, mins, maxs, result))
return qtrue;
return qfalse;
}