From aa5500680d9fcf0ef3fb20382e24b48399afb3f5 Mon Sep 17 00:00:00 2001 From: Kester Maddock Date: Sat, 17 Apr 2004 00:56:54 +0000 Subject: [PATCH] Fix segfault on collisions between dynamic complex (polyheder) and dynamic convex (box/sphere/cone/cylinder) objects. --- extern/solid/src/DT_Object.cpp | 40 +++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/extern/solid/src/DT_Object.cpp b/extern/solid/src/DT_Object.cpp index ba36c889b22..d5e487cf3f0 100755 --- a/extern/solid/src/DT_Object.cpp +++ b/extern/solid/src/DT_Object.cpp @@ -88,9 +88,16 @@ bool intersectComplexConvex(const DT_Shape& a, const MT_Transform& a2w, MT_Scala const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, MT_Vector3& v) { - DT_Transform tb(b2w, (const DT_Convex&)b); - return intersect((const DT_Complex&)a, a2w, a_margin, + if (a.getType() == COMPLEX) + { + DT_Transform tb(b2w, (const DT_Convex&)b); + return intersect((const DT_Complex&)a, a2w, a_margin, (b_margin > MT_Scalar(0.0) ? static_cast(DT_Minkowski(tb, DT_Sphere(b_margin))) : static_cast(tb)), v); + } + + bool r = intersectComplexConvex(b, b2w, b_margin, a, a2w, a_margin, v); + v *= -1.; + return r; } bool intersectComplexComplex(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, @@ -132,9 +139,16 @@ bool common_pointComplexConvex(const DT_Shape& a, const MT_Transform& a2w, MT_Sc const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) { - DT_Transform tb(b2w, (const DT_Convex&)b); - return common_point((const DT_Complex&)a, a2w, a_margin, - (b_margin > MT_Scalar(0.0) ? static_cast(DT_Minkowski(tb, DT_Sphere(b_margin))) : static_cast(tb)), v, pa, pb); + if (a.getType() == COMPLEX) + { + DT_Transform tb(b2w, (const DT_Convex&)b); + return common_point((const DT_Complex&)a, a2w, a_margin, + (b_margin > MT_Scalar(0.0) ? static_cast(DT_Minkowski(tb, DT_Sphere(b_margin))) : static_cast(tb)), v, pa, pb); + } + + bool r = common_pointComplexConvex(b, b2w, b_margin, a, a2w, a_margin, v, pb, pa); + v *= -1.; + return r; } bool common_pointComplexComplex(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, @@ -176,8 +190,13 @@ bool penetration_depthComplexConvex(const DT_Shape& a, const MT_Transform& a2w, const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) { - return penetration_depth((const DT_Complex&)a, a2w, a_margin, + if (a.getType() == COMPLEX) + return penetration_depth((const DT_Complex&)a, a2w, a_margin, DT_Transform(b2w, (const DT_Convex&)b), b_margin, v, pa, pb); + + bool r = penetration_depthComplexConvex(b, b2w, b_margin, a, a2w, a_margin, v, pb, pa); + v *= -1.; + return r; } bool penetration_depthComplexComplex(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, @@ -219,9 +238,14 @@ MT_Scalar closest_pointsComplexConvex(const DT_Shape& a, const MT_Transform& a2w const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, MT_Point3& pa, MT_Point3& pb) { + if (a.getType() == COMPLEX) + { DT_Transform tb(b2w, (const DT_Convex&)b); - return closest_points((const DT_Complex&)a, a2w, a_margin, - (b_margin > MT_Scalar(0.0) ? static_cast(DT_Minkowski(tb, DT_Sphere(b_margin))) : static_cast(tb)), pa, pb); + return closest_points((const DT_Complex&)a, a2w, a_margin, + (b_margin > MT_Scalar(0.0) ? static_cast(DT_Minkowski(tb, DT_Sphere(b_margin))) : static_cast(tb)), pa, pb); + } + + return -closest_pointsComplexConvex(b, b2w, b_margin, a, a2w, a_margin, pb, pa); } MT_Scalar closest_pointsComplexComplex(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin,