Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKester Maddock <Christopher.Maddock.1@uni.massey.ac.nz>2004-04-17 04:56:54 +0400
committerKester Maddock <Christopher.Maddock.1@uni.massey.ac.nz>2004-04-17 04:56:54 +0400
commitaa5500680d9fcf0ef3fb20382e24b48399afb3f5 (patch)
treefc68db5f45726ec090365f6a0ef58a7b5d554146 /extern/solid
parent974c19bc01423a0105351e60d7fdeff18189aa2a (diff)
Fix segfault on collisions between dynamic complex (polyheder) and dynamic convex (box/sphere/cone/cylinder) objects.
Diffstat (limited to 'extern/solid')
-rwxr-xr-xextern/solid/src/DT_Object.cpp40
1 files 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<const DT_Convex&>(DT_Minkowski(tb, DT_Sphere(b_margin))) : static_cast<const DT_Convex&>(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<const DT_Convex&>(DT_Minkowski(tb, DT_Sphere(b_margin))) : static_cast<const DT_Convex&>(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<const DT_Convex&>(DT_Minkowski(tb, DT_Sphere(b_margin))) : static_cast<const DT_Convex&>(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<const DT_Convex&>(DT_Minkowski(tb, DT_Sphere(b_margin))) : static_cast<const DT_Convex&>(tb)), pa, pb);
+ return closest_points((const DT_Complex&)a, a2w, a_margin,
+ (b_margin > MT_Scalar(0.0) ? static_cast<const DT_Convex&>(DT_Minkowski(tb, DT_Sphere(b_margin))) : static_cast<const DT_Convex&>(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,