From 336fb9062711f99752c41e18cd0e3ad68feed7f6 Mon Sep 17 00:00:00 2001 From: David Rose Date: Mon, 24 Mar 2008 23:05:47 +0000 Subject: [PATCH] prevent infinite recursion --- panda/src/collide/collisionSphere.cxx | 18 ++++++++++-------- panda/src/collide/collisionTube.cxx | 17 ++++++++++------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/panda/src/collide/collisionSphere.cxx b/panda/src/collide/collisionSphere.cxx index 59f7b91234..e9b9b5c419 100644 --- a/panda/src/collide/collisionSphere.cxx +++ b/panda/src/collide/collisionSphere.cxx @@ -767,15 +767,17 @@ intersects_parabola(double &t, const Parabolaf ¶bola, // point and comparing its distance from the linear intervening // point. double tmid = (t1 + t2) * 0.5; - LPoint3f pmid = parabola.calc_point(tmid); - LPoint3f pmid2 = (p1 + p2) * 0.5f; - - if ((pmid - pmid2).length_squared() > 0.001f) { - // Subdivide. - if (intersects_parabola(t, parabola, t1, tmid, p1, pmid)) { - return true; + if (tmid != t1 && tmid != t2) { + LPoint3f pmid = parabola.calc_point(tmid); + LPoint3f pmid2 = (p1 + p2) * 0.5f; + + if ((pmid - pmid2).length_squared() > 0.001f) { + // Subdivide. + if (intersects_parabola(t, parabola, t1, tmid, p1, pmid)) { + return true; + } + return intersects_parabola(t, parabola, tmid, t2, pmid, p2); } - return intersects_parabola(t, parabola, tmid, t2, pmid, p2); } // The line segment is sufficiently close; compare the segment itself. diff --git a/panda/src/collide/collisionTube.cxx b/panda/src/collide/collisionTube.cxx index 07844a59f6..469263704d 100644 --- a/panda/src/collide/collisionTube.cxx +++ b/panda/src/collide/collisionTube.cxx @@ -853,15 +853,18 @@ intersects_parabola(double &t, const Parabolaf ¶bola, // point and comparing its distance from the linear intervening // point. double tmid = (t1 + t2) * 0.5; - LPoint3f pmid = parabola.calc_point(tmid); - LPoint3f pmid2 = (p1 + p2) * 0.5f; - if ((pmid - pmid2).length_squared() > 0.001f) { - // Subdivide. - if (intersects_parabola(t, parabola, t1, tmid, p1, pmid)) { - return true; + if (tmid != t1 && tmid != t2) { + LPoint3f pmid = parabola.calc_point(tmid); + LPoint3f pmid2 = (p1 + p2) * 0.5f; + + if ((pmid - pmid2).length_squared() > 0.001f) { + // Subdivide. + if (intersects_parabola(t, parabola, t1, tmid, p1, pmid)) { + return true; + } + return intersects_parabola(t, parabola, tmid, t2, pmid, p2); } - return intersects_parabola(t, parabola, tmid, t2, pmid, p2); } // The line segment is sufficiently close; compare the segment itself.