From 3fd6af179face17fa4042942b4b3e35b3e60d838 Mon Sep 17 00:00:00 2001 From: Lee Salzman Date: Sun, 30 May 2010 07:31:35 +0000 Subject: [PATCH] more line cylinder intersect fixes git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@5112 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- source/src/weapon.cpp | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/source/src/weapon.cpp b/source/src/weapon.cpp index 74764321..813a35f1 100644 --- a/source/src/weapon.cpp +++ b/source/src/weapon.cpp @@ -226,27 +226,28 @@ static inline bool intersectcylinder(const vec &from, const vec &to, const vec & else dist = 0; return true; } - float b = dd*mn - nd*md, - discrim = b*b - a*c; - if(discrim < 0) return false; - dist = (-b - sqrtf(discrim)) / a; + else if(c > 0) + { + float b = dd*mn - nd*md, + discrim = b*b - a*c; + if(discrim < 0) return false; + dist = (-b - sqrtf(discrim)) / a; + } + else dist = 0; float offset = md + dist*nd; if(offset < 0) { if(nd <= 0) return false; - dist = -md / nd; - if(k + dist*(2*mn + dist*nn) > 0) return false; + float cdist = -md / nd; + if(k + dist*(2*mn + cdist*nn) <= 0) dist = cdist; + else if(c <= 0) return false; } else if(offset > dd) { if(nd >= 0) return false; - dist = (dd - md) / nd; - if(k + dd - 2*md + dist*(2*(mn-nd) + dist*nn) > 0) return false; - } - else if(c <= 0) - { - dist = 0; - return true; + float cdist = (dd - md) / nd; + if(k + dd - 2*md + cdist*(2*(mn-nd) + cdist*nn) <= 0) dist = cdist; + else if(c <= 0) return false; } return dist >= 0 && dist <= 1; }