From ff20752e083f1b17d1290c8d6ed293551a76b060 Mon Sep 17 00:00:00 2001 From: divverent Date: Thu, 7 Jan 2010 12:40:34 +0000 Subject: [PATCH] fix bug in tracebox->line and traceline->point redirection causing endposnudge to be applied multiple times git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9802 d7cf8633-e32d-0410-b094-e92efae38249 --- cl_collision.c | 26 +++++++++++++++++++++----- sv_phys.c | 28 ++++++++++++++++++++++------ 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/cl_collision.c b/cl_collision.c index a98d0b5c..8978f374 100644 --- a/cl_collision.c +++ b/cl_collision.c @@ -463,7 +463,10 @@ trace_t CL_TraceLine(const vec3_t start, const vec3_t end, int type, prvm_edict_ vec3_t end; vec_t len = 0; - if(!VectorCompare(start, pEnd) && collision_endposnudge.value > 0) + if (VectorCompare(start, pEnd)) + return CL_TracePoint(start, type, passedict, hitsupercontentsmask, hitnetworkbrushmodels, hitnetworkplayers, hitnetworkentity, hitcsqcentities); + + if(collision_endposnudge.value > 0) { // TRICK: make the trace 1 qu longer! VectorSubtract(pEnd, start, end); @@ -472,10 +475,10 @@ trace_t CL_TraceLine(const vec3_t start, const vec3_t end, int type, prvm_edict_ } else VectorCopy(pEnd, end); -#endif - +#else if (VectorCompare(start, end)) return CL_TracePoint(start, type, passedict, hitsupercontentsmask, hitnetworkbrushmodels, hitnetworkplayers, hitnetworkentity, hitcsqcentities); +#endif if (hitnetworkentity) *hitnetworkentity = 0; @@ -701,6 +704,19 @@ trace_t CL_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co vec3_t end; vec_t len = 0; + if (VectorCompare(mins, maxs)) + { + vec3_t shiftstart, shiftend; + VectorAdd(start, mins, shiftstart); + VectorAdd(pEnd, mins, shiftend); + if (VectorCompare(start, pEnd)) + trace = CL_TracePoint(shiftstart, type, passedict, hitsupercontentsmask, hitnetworkbrushmodels, hitnetworkplayers, hitnetworkentity, hitcsqcentities); + else + trace = CL_TraceLine(shiftstart, shiftend, type, passedict, hitsupercontentsmask, hitnetworkbrushmodels, hitnetworkplayers, hitnetworkentity, hitcsqcentities); + VectorSubtract(trace.endpos, mins, trace.endpos); + return trace; + } + if(!VectorCompare(start, pEnd) && collision_endposnudge.value > 0) { // TRICK: make the trace 1 qu longer! @@ -710,8 +726,7 @@ trace_t CL_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co } else VectorCopy(pEnd, end); -#endif - +#else if (VectorCompare(mins, maxs)) { vec3_t shiftstart, shiftend; @@ -724,6 +739,7 @@ trace_t CL_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co VectorSubtract(trace.endpos, mins, trace.endpos); return trace; } +#endif if (hitnetworkentity) *hitnetworkentity = 0; diff --git a/sv_phys.c b/sv_phys.c index ab3e7d9c..2b1aa58d 100644 --- a/sv_phys.c +++ b/sv_phys.c @@ -271,7 +271,10 @@ trace_t SV_TraceLine(const vec3_t start, const vec3_t end, int type, prvm_edict_ vec3_t end; vec_t len = 0; - if(!VectorCompare(start, pEnd) && collision_endposnudge.value > 0) + if (VectorCompare(start, pEnd)) + return SV_TracePoint(start, type, passedict, hitsupercontentsmask); + + if(collision_endposnudge.value > 0) { // TRICK: make the trace 1 qu longer! VectorSubtract(pEnd, start, end); @@ -280,13 +283,13 @@ trace_t SV_TraceLine(const vec3_t start, const vec3_t end, int type, prvm_edict_ } else VectorCopy(pEnd, end); +#else + if (VectorCompare(start, end)) + return SV_TracePoint(start, type, passedict, hitsupercontentsmask); #endif //return SV_TraceBox(start, vec3_origin, vec3_origin, end, type, passedict, hitsupercontentsmask); - if (VectorCompare(start, end)) - return SV_TracePoint(start, type, passedict, hitsupercontentsmask); - VectorCopy(start, clipstart); VectorCopy(end, clipend); VectorClear(clipmins2); @@ -450,6 +453,19 @@ trace_t SV_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co vec3_t end; vec_t len = 0; + if (VectorCompare(mins, maxs)) + { + vec3_t shiftstart, shiftend; + VectorAdd(start, mins, shiftstart); + VectorAdd(pEnd, mins, shiftend); + if (VectorCompare(start, pEnd)) + trace = SV_TracePoint(shiftstart, type, passedict, hitsupercontentsmask); + else + trace = SV_TraceLine(shiftstart, shiftend, type, passedict, hitsupercontentsmask); + VectorSubtract(trace.endpos, mins, trace.endpos); + return trace; + } + if(!VectorCompare(start, pEnd) && collision_endposnudge.value > 0) { // TRICK: make the trace 1 qu longer! @@ -459,8 +475,7 @@ trace_t SV_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co } else VectorCopy(pEnd, end); -#endif - +#else if (VectorCompare(mins, maxs)) { vec3_t shiftstart, shiftend; @@ -473,6 +488,7 @@ trace_t SV_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co VectorSubtract(trace.endpos, mins, trace.endpos); return trace; } +#endif VectorCopy(start, clipstart); VectorCopy(end, clipend); -- 2.39.2