X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=collision.c;h=3d148a8bbdebbfcc79c0cc6c8841add3a124ac2b;hb=8367a30715017e7a497f6baf65dbaff5f72d6cf3;hp=e574773b1fb7d6a72069277d6c5a87d210902d0d;hpb=d7c17c4c4c664441f27f7d6d3466dd5da5cce801;p=xonotic%2Fdarkplaces.git diff --git a/collision.c b/collision.c index e574773b..3d148a8b 100644 --- a/collision.c +++ b/collision.c @@ -10,13 +10,9 @@ #define COLLISION_PLANE_DIST_EPSILON (2.0f / COLLISION_SNAPSCALE) cvar_t collision_impactnudge = {0, "collision_impactnudge", "0.03125", "how much to back off from the impact"}; -cvar_t collision_startnudge = {0, "collision_startnudge", "0", "how much to bias collision trace start"}; -cvar_t collision_endnudge = {0, "collision_endnudge", "0", "how much to bias collision trace end"}; -cvar_t collision_enternudge = {0, "collision_enternudge", "0", "how much to bias collision entry fraction"}; -cvar_t collision_leavenudge = {0, "collision_leavenudge", "0", "how much to bias collision exit fraction"}; -cvar_t collision_extendmovelength = {0, "collision_extendmovelength", "16", "internal bias on trace length to ensure detection of collisions within the collision_impactnudge/collision_enternudge/collision_leavenudge distance so that short moves do not degrade across frames (this does not alter the final trace length)"}; -cvar_t collision_extendtraceboxlength = {0, "collision_extendtraceboxlength", "1", "internal bias for tracebox() qc builtin to account for collision_impactnudge/collision_enternudge/collision_leavenudge (this does not alter the final trace length)"}; -cvar_t collision_extendtracelinelength = {0, "collision_extendtracelinelength", "1", "internal bias for traceline() qc builtin to account for collision_impactnudge/collision_enternudge/collision_leavenudge (this does not alter the final trace length)"}; +cvar_t collision_extendmovelength = {0, "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)"}; +cvar_t collision_extendtraceboxlength = {0, "collision_extendtraceboxlength", "1", "internal bias for tracebox() qc builtin to account for collision_impactnudge (this does not alter the final trace length)"}; +cvar_t collision_extendtracelinelength = {0, "collision_extendtracelinelength", "1", "internal bias for traceline() qc builtin to account for collision_impactnudge (this does not alter the final trace length)"}; cvar_t collision_debug_tracelineasbox = {0, "collision_debug_tracelineasbox", "0", "workaround for any bugs in Collision_TraceLineBrushFloat by using Collision_TraceBrushBrushFloat"}; cvar_t collision_cache = {0, "collision_cache", "1", "store results of collision traces for next frame to reuse if possible (optimization)"}; //cvar_t collision_triangle_neighborsides = {0, "collision_triangle_neighborsides", "1", "override automatic side generation if triangle has neighbors with face planes that form a convex edge (perfect solution, but can not work for all edges)"}; @@ -28,10 +24,6 @@ mempool_t *collision_mempool; void Collision_Init (void) { Cvar_RegisterVariable(&collision_impactnudge); - Cvar_RegisterVariable(&collision_startnudge); - Cvar_RegisterVariable(&collision_endnudge); - Cvar_RegisterVariable(&collision_enternudge); - Cvar_RegisterVariable(&collision_leavenudge); Cvar_RegisterVariable(&collision_extendmovelength); Cvar_RegisterVariable(&collision_extendtracelinelength); Cvar_RegisterVariable(&collision_extendtraceboxlength); @@ -652,12 +644,12 @@ void Collision_TraceBrushBrushFloat(trace_t *trace, const colbrushf_t *trace_sta } startplane[3] = furthestplanedist_float(startplane, other_start->points, othernumpoints); endplane[3] = furthestplanedist_float(startplane, other_end->points, othernumpoints); - startdist = nearestplanedist_float(startplane, trace_start->points, tracenumpoints) - startplane[3] - collision_startnudge.value; - enddist = nearestplanedist_float(endplane, trace_end->points, tracenumpoints) - endplane[3] - collision_endnudge.value; + startdist = nearestplanedist_float(startplane, trace_start->points, tracenumpoints) - startplane[3]; + enddist = nearestplanedist_float(endplane, trace_end->points, tracenumpoints) - endplane[3]; //Con_Printf("%c%i: startdist = %f, enddist = %f, startdist / (startdist - enddist) = %f\n", nplane2 != nplane ? 'b' : 'a', nplane2, startdist, enddist, startdist / (startdist - enddist)); // aside from collisions, this is also used for error correction - if (startdist <= collision_impactnudge.value && nplane < numplanes1 && (startdepth < startdist || startdepth == 1)) + if (startdist <= 0.0f && nplane < numplanes1 && (startdepth < startdist || startdepth == 1)) { startdepth = startdist; VectorCopy(startplane, startdepthnormal); @@ -666,15 +658,13 @@ void Collision_TraceBrushBrushFloat(trace_t *trace, const colbrushf_t *trace_sta if (startdist > enddist) { // moving into brush - if (enddist >= collision_enternudge.value) + if (enddist > 0.0f) return; if (startdist >= 0) { // enter imove = 1 / (startdist - enddist); - f = (startdist - collision_enternudge.value) * imove; - if (f < 0) - f = 0; + f = startdist * imove; // check if this will reduce the collision time range if (enterfrac < f) { @@ -726,9 +716,7 @@ void Collision_TraceBrushBrushFloat(trace_t *trace, const colbrushf_t *trace_sta if (enddist > 0) { // leave - f = (startdist + collision_leavenudge.value) / (startdist - enddist); - if (f > 1) - f = 1; + f = startdist / (startdist - enddist); // check if this will reduce the collision time range if (leavefrac > f) { @@ -821,12 +809,12 @@ void Collision_TraceLineBrushFloat(trace_t *trace, const vec3_t linestart, const startplane[3] = other_start->planes[nplane].dist; VectorCopy(other_end->planes[nplane].normal, endplane); endplane[3] = other_end->planes[nplane].dist; - startdist = DotProduct(linestart, startplane) - startplane[3] - collision_startnudge.value; - enddist = DotProduct(lineend, endplane) - endplane[3] - collision_endnudge.value; + startdist = DotProduct(linestart, startplane) - startplane[3]; + enddist = DotProduct(lineend, endplane) - endplane[3]; //Con_Printf("%c%i: startdist = %f, enddist = %f, startdist / (startdist - enddist) = %f\n", nplane2 != nplane ? 'b' : 'a', nplane2, startdist, enddist, startdist / (startdist - enddist)); // aside from collisions, this is also used for error correction - if (startdist < collision_impactnudge.value && (startdepth < startdist || startdepth == 1)) + if (startdist <= 0.0f && (startdepth < startdist || startdepth == 1)) { startdepth = startdist; VectorCopy(startplane, startdepthnormal); @@ -835,15 +823,13 @@ void Collision_TraceLineBrushFloat(trace_t *trace, const vec3_t linestart, const if (startdist > enddist) { // moving into brush - if (enddist >= collision_enternudge.value) + if (enddist > 0.0f) return; if (startdist > 0) { // enter imove = 1 / (startdist - enddist); - f = (startdist - collision_enternudge.value) * imove; - if (f < 0) - f = 0; + f = startdist * imove; // check if this will reduce the collision time range if (enterfrac < f) { @@ -878,9 +864,7 @@ void Collision_TraceLineBrushFloat(trace_t *trace, const vec3_t linestart, const if (enddist > 0) { // leave - f = (startdist + collision_leavenudge.value) / (startdist - enddist); - if (f > 1) - f = 1; + f = startdist / (startdist - enddist); // check if this will reduce the collision time range if (leavefrac > f) { @@ -1390,7 +1374,7 @@ static void Collision_TransformBrush(const matrix4x4_t *matrix, colbrushf_t *bru // now we can transform the data for(i = 0; i < brush->numplanes; ++i) { - Matrix4x4_TransformPositivePlane(matrix, brush->planes[i].normal[0], brush->planes[i].normal[1], brush->planes[i].normal[2], brush->planes[i].dist, brush->planes[i].normal); + Matrix4x4_TransformPositivePlane(matrix, brush->planes[i].normal[0], brush->planes[i].normal[1], brush->planes[i].normal[2], brush->planes[i].dist, brush->planes[i].normal_and_dist); } for(i = 0; i < brush->numedgedirs; ++i) { @@ -1438,7 +1422,7 @@ static collision_cachedtrace_t *collision_cachedtrace_array; static int collision_cachedtrace_firstfree; static int collision_cachedtrace_lastused; static int collision_cachedtrace_max; -static int collision_cachedtrace_sequence; +static unsigned char collision_cachedtrace_sequence; static int collision_cachedtrace_hashsize; static int *collision_cachedtrace_hash; static unsigned int *collision_cachedtrace_arrayfullhashindex; @@ -1486,7 +1470,7 @@ static void Collision_Cache_RebuildHash(void) { int index; int range = collision_cachedtrace_lastused + 1; - int sequence = collision_cachedtrace_sequence; + unsigned char sequence = collision_cachedtrace_sequence; int firstfree = collision_cachedtrace_max; int lastused = 0; int *hash = collision_cachedtrace_hash; @@ -1556,7 +1540,7 @@ static collision_cachedtrace_t *Collision_Cache_Lookup(dp_model_t *model, const unsigned int fullhashindex; int index = 0; int range; - int sequence = collision_cachedtrace_sequence; + unsigned char sequence = collision_cachedtrace_sequence; int *hash = collision_cachedtrace_hash; unsigned int *arrayfullhashindex = collision_cachedtrace_arrayfullhashindex; unsigned int *arraynext = collision_cachedtrace_arraynext; @@ -1794,7 +1778,7 @@ void Collision_ClipToGenericEntity(trace_t *trace, dp_model_t *model, const fram // transform plane // NOTE: this relies on plane.dist being directly after plane.normal - Matrix4x4_TransformPositivePlane(matrix, trace->plane.normal[0], trace->plane.normal[1], trace->plane.normal[2], trace->plane.dist, trace->plane.normal); + Matrix4x4_TransformPositivePlane(matrix, trace->plane.normal[0], trace->plane.normal[1], trace->plane.normal[2], trace->plane.dist, trace->plane.normal_and_dist); } void Collision_ClipToWorld(trace_t *trace, dp_model_t *model, const vec3_t tstart, const vec3_t mins, const vec3_t maxs, const vec3_t tend, int hitsupercontents, float extend) @@ -1830,7 +1814,7 @@ void Collision_ClipLineToGenericEntity(trace_t *trace, dp_model_t *model, const // transform plane // NOTE: this relies on plane.dist being directly after plane.normal - Matrix4x4_TransformPositivePlane(matrix, trace->plane.normal[0], trace->plane.normal[1], trace->plane.normal[2], trace->plane.dist, trace->plane.normal); + Matrix4x4_TransformPositivePlane(matrix, trace->plane.normal[0], trace->plane.normal[1], trace->plane.normal[2], trace->plane.dist, trace->plane.normal_and_dist); } void Collision_ClipLineToWorld(trace_t *trace, dp_model_t *model, const vec3_t tstart, const vec3_t tend, int hitsupercontents, float extend, qboolean hitsurfaces) @@ -1865,7 +1849,7 @@ void Collision_ClipPointToGenericEntity(trace_t *trace, dp_model_t *model, const VectorCopy(start, trace->endpos); // transform plane // NOTE: this relies on plane.dist being directly after plane.normal - Matrix4x4_TransformPositivePlane(matrix, trace->plane.normal[0], trace->plane.normal[1], trace->plane.normal[2], trace->plane.dist, trace->plane.normal); + Matrix4x4_TransformPositivePlane(matrix, trace->plane.normal[0], trace->plane.normal[1], trace->plane.normal[2], trace->plane.dist, trace->plane.normal_and_dist); } void Collision_ClipPointToWorld(trace_t *trace, dp_model_t *model, const vec3_t start, int hitsupercontents)