Skip to content

Commit

Permalink
disable tri-tri intersection test function
Browse files Browse the repository at this point in the history
fixes building with clang with enabled UB sanitizer timing out
  • Loading branch information
malytomas committed Sep 26, 2023
1 parent 7ecde94 commit 4b515ae
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 126 deletions.
21 changes: 7 additions & 14 deletions sources/include/cage-core/geometry.h
Original file line number Diff line number Diff line change
Expand Up @@ -256,37 +256,37 @@ namespace cage
namespace detail
{
template<uint32 N>
StringizerBase<N> &operator+(StringizerBase<N> &str, const Line &other)
CAGE_FORCE_INLINE StringizerBase<N> &operator+(StringizerBase<N> &str, const Line &other)
{
return str + "(" + other.origin + ", " + other.direction + ", " + other.minimum + ", " + other.maximum + ")";
}
template<uint32 N>
StringizerBase<N> &operator+(StringizerBase<N> &str, const Triangle &other)
CAGE_FORCE_INLINE StringizerBase<N> &operator+(StringizerBase<N> &str, const Triangle &other)
{
return str + "(" + other.vertices[0] + ", " + other.vertices[1] + ", " + other.vertices[2] + ")";
}
template<uint32 N>
StringizerBase<N> &operator+(StringizerBase<N> &str, const Plane &other)
CAGE_FORCE_INLINE StringizerBase<N> &operator+(StringizerBase<N> &str, const Plane &other)
{
return str + "(" + other.normal + ", " + other.d + ")";
}
template<uint32 N>
StringizerBase<N> &operator+(StringizerBase<N> &str, const Sphere &other)
CAGE_FORCE_INLINE StringizerBase<N> &operator+(StringizerBase<N> &str, const Sphere &other)
{
return str + "(" + other.center + ", " + other.radius + ")";
}
template<uint32 N>
StringizerBase<N> &operator+(StringizerBase<N> &str, const Aabb &other)
CAGE_FORCE_INLINE StringizerBase<N> &operator+(StringizerBase<N> &str, const Aabb &other)
{
return str + "(" + other.a + "," + other.b + ")";
}
template<uint32 N>
StringizerBase<N> &operator+(StringizerBase<N> &str, const Cone &other)
CAGE_FORCE_INLINE StringizerBase<N> &operator+(StringizerBase<N> &str, const Cone &other)
{
return str + "(" + other.origin + "," + other.direction + "," + other.length + "," + other.halfAngle + ")";
}
template<uint32 N>
StringizerBase<N> &operator+(StringizerBase<N> &str, const Frustum &other)
CAGE_FORCE_INLINE StringizerBase<N> &operator+(StringizerBase<N> &str, const Frustum &other)
{
return str + other.viewProj;
}
Expand Down Expand Up @@ -379,19 +379,12 @@ namespace cage
CAGE_CORE_API bool intersects(const Cone &a, const Cone &b);
CAGE_CORE_API bool intersects(const Cone &a, const Frustum &b);

struct CAGE_CORE_API TriTriIntersectionResult
{
Line line;
bool intersects = false;
};

CAGE_CORE_API Vec3 intersection(const Line &a, const Triangle &b);
CAGE_CORE_API Vec3 intersection(const Line &a, const Plane &b);
CAGE_CORE_API Line intersection(const Line &a, const Sphere &b);
CAGE_CORE_API Line intersection(const Line &a, const Aabb &b);
CAGE_CORE_API Line intersection(const Line &a, const Cone &b);
CAGE_CORE_API Line intersection(const Line &a, const Frustum &b);
CAGE_CORE_API TriTriIntersectionResult intersection(const Triangle &a, const Triangle &b);
CAGE_CORE_API Aabb intersection(const Aabb &a, const Aabb &b);

CAGE_CORE_API Vec3 closestPoint(const Vec3 &a, const Line &b);
Expand Down
105 changes: 1 addition & 104 deletions sources/libcore/geometry/triangleTriangle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ using Number = double;
namespace
{
int tri_tri_overlap_test_3d(Number p1[3], Number q1[3], Number r1[3], Number p2[3], Number q2[3], Number r2[3]);
int tri_tri_intersection_test_3d(Number p1[3], Number q1[3], Number r1[3], Number p2[3], Number q2[3], Number r2[3], int *coplanar, Number source[3], Number target[3]);
int coplanar_tri_tri3d(Number p1[3], Number q1[3], Number r1[3], Number p2[3], Number q2[3], Number r2[3], Number N1[3]);
int tri_tri_overlap_test_2d(Number p1[2], Number q1[2], Number r1[2], Number p2[2], Number q2[2], Number r2[2]);

Expand Down Expand Up @@ -95,9 +94,7 @@ namespace
} \
}

int tri_tri_overlap_test_3d(Number p1[3], Number q1[3], Number r1[3],

Number p2[3], Number q2[3], Number r2[3])
int tri_tri_overlap_test_3d(Number p1[3], Number q1[3], Number r1[3], Number p2[3], Number q2[3], Number r2[3])
{
Number dp1, dq1, dr1, dp2, dq2, dr2;
Number v1[3], v2[3];
Expand Down Expand Up @@ -179,10 +176,8 @@ namespace

int coplanar_tri_tri3d(Number p1[3], Number q1[3], Number r1[3], Number p2[3], Number q2[3], Number r2[3], Number normal_1[3])
{

Number P1[2], Q1[2], R1[2];
Number P2[2], Q2[2], R2[2];

Number n_x, n_y, n_z;

n_x = ((normal_1[0] < 0) ? -normal_1[0] : normal_1[0]);
Expand Down Expand Up @@ -384,93 +379,6 @@ namespace
} \
}

int tri_tri_intersection_test_3d(Number p1[3], Number q1[3], Number r1[3], Number p2[3], Number q2[3], Number r2[3], int *coplanar, Number source[3], Number target[3])
{
Number dp1, dq1, dr1, dp2, dq2, dr2;
Number v1[3], v2[3], v[3];
Number N1[3], N2[3], N[3];
Number alpha;

SUB(v1, p2, r2)
SUB(v2, q2, r2)
CROSS(N2, v1, v2)

SUB(v1, p1, r2)
dp1 = DOT(v1, N2);
SUB(v1, q1, r2)
dq1 = DOT(v1, N2);
SUB(v1, r1, r2)
dr1 = DOT(v1, N2);

if (((dp1 * dq1) > 0.0f) && ((dp1 * dr1) > 0.0f))
return 0;

SUB(v1, q1, p1)
SUB(v2, r1, p1)
CROSS(N1, v1, v2)

SUB(v1, p2, r1)
dp2 = DOT(v1, N1);
SUB(v1, q2, r1)
dq2 = DOT(v1, N1);
SUB(v1, r2, r1)
dr2 = DOT(v1, N1);

if (((dp2 * dq2) > 0.0f) && ((dp2 * dr2) > 0.0f))
return 0;

if (dp1 > 0.0f)
{
if (dq1 > 0.0f)
TRI_TRI_INTER_3D(r1, p1, q1, p2, r2, q2, dp2, dr2, dq2)
else if (dr1 > 0.0f)
TRI_TRI_INTER_3D(q1, r1, p1, p2, r2, q2, dp2, dr2, dq2)

else
TRI_TRI_INTER_3D(p1, q1, r1, p2, q2, r2, dp2, dq2, dr2)
}
else if (dp1 < 0.0f)
{
if (dq1 < 0.0f)
TRI_TRI_INTER_3D(r1, p1, q1, p2, q2, r2, dp2, dq2, dr2)
else if (dr1 < 0.0f)
TRI_TRI_INTER_3D(q1, r1, p1, p2, q2, r2, dp2, dq2, dr2)
else
TRI_TRI_INTER_3D(p1, q1, r1, p2, r2, q2, dp2, dr2, dq2)
}
else
{
if (dq1 < 0.0f)
{
if (dr1 >= 0.0f)
TRI_TRI_INTER_3D(q1, r1, p1, p2, r2, q2, dp2, dr2, dq2)
else
TRI_TRI_INTER_3D(p1, q1, r1, p2, q2, r2, dp2, dq2, dr2)
}
else if (dq1 > 0.0f)
{
if (dr1 > 0.0f)
TRI_TRI_INTER_3D(p1, q1, r1, p2, r2, q2, dp2, dr2, dq2)
else
TRI_TRI_INTER_3D(q1, r1, p1, p2, q2, r2, dp2, dq2, dr2)
}
else
{
if (dr1 > 0.0f)
TRI_TRI_INTER_3D(r1, p1, q1, p2, q2, r2, dp2, dq2, dr2)
else if (dr1 < 0.0f)
TRI_TRI_INTER_3D(r1, p1, q1, p2, r2, q2, dp2, dr2, dq2)
else
{
// triangles are co-planar

*coplanar = 1;
return coplanar_tri_tri3d(p1, q1, r1, p2, q2, r2, N1);
}
}
}
};

#define ORIENT_2D(a, b, c) ((a[0] - c[0]) * (b[1] - c[1]) - (a[1] - c[1]) * (b[0] - c[0]))

#define INTERSECTION_TEST_VERTEX(P1, Q1, R1, P2, Q2, R2) \
Expand Down Expand Up @@ -638,15 +546,4 @@ namespace cage
{
return tri_tri_overlap_test_3d(V(a[0]), V(a[1]), V(a[2]), V(b[0]), V(b[1]), V(b[2]));
}

TriTriIntersectionResult intersection(const Triangle &a, const Triangle &b)
{
V s, t;
int coplanar = 0;
TriTriIntersectionResult res;
res.intersects = tri_tri_intersection_test_3d(V(a[0]), V(a[1]), V(a[2]), V(b[0]), V(b[1]), V(b[2]), &coplanar, s, t);
if (res.intersects && !coplanar)
res.line = makeSegment(s, t);
return res;
}
}
8 changes: 0 additions & 8 deletions sources/test-core/geometry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -299,22 +299,16 @@ namespace
const Triangle b = Triangle(Vec3(10.5860157, -0.126804069, -10.5860205), Vec3(5.29338837, -3.57627869e-07, -5.29339361), Vec3(5.29300880, -0.0634022281, -5.29301405));
CAGE_TEST(!intersects(a, b));
CAGE_TEST(!intersects(b, a));
CAGE_TEST(!intersection(a, b).intersects);
CAGE_TEST(!intersection(a, b).line.valid());

const Triangle c = Triangle(Vec3(5.23147297, 5.81014061, -6.23489857), Vec3(7.14238548, 3.17999482, -6.23489857), Vec3(3.96372533, 1.76476419, -9.00968838));
const Triangle d = Triangle(Vec3(-4.37113897e-07, -0.00000000, -10.0000000), Vec3(3.96372533, 1.76476419, -9.00968838), Vec3(4.33883762, 0.00000000, -9.00968838));
CAGE_TEST(intersects(c, d));
CAGE_TEST(intersects(d, c)); // this test requires double precision implementation, otherwise the function returns inconsistent results
CAGE_TEST(intersection(c, d).intersects);
CAGE_TEST(intersection(c, d).line.valid());

const Triangle e = Triangle(Vec3(-21, -72, 63), Vec3(-78, 99, 40), Vec3(-19, -78, -83));
const Triangle f = Triangle(Vec3(96, 77, -51), Vec3(-95, -1, -16), Vec3(9, 5, -21));
CAGE_TEST(intersects(e, f));
CAGE_TEST(intersects(f, e));
CAGE_TEST(intersection(e, f).intersects);
CAGE_TEST(intersection(e, f).line.valid());
}

{
Expand Down Expand Up @@ -343,8 +337,6 @@ namespace
CAGE_TEST(intersects(t1, t2 * tr) == intersects(t1 * inverse(tr), t2));
CAGE_TEST(intersects(t1 * tr, t2) == intersects(t1, t2 * inverse(tr)));
CAGE_TEST(intersects(t2, t1) == intersects(t1, t2));
CAGE_TEST(intersection(t2, t1).intersects == intersects(t1, t2));
CAGE_TEST(intersection(t1, t2).intersects == intersects(t1, t2));
}
}
}
Expand Down

0 comments on commit 4b515ae

Please sign in to comment.