From 6b95a04a091ced308392fd644c2353624cd2b887 Mon Sep 17 00:00:00 2001 From: Irlan <-> Date: Fri, 5 Oct 2018 11:57:23 -0300 Subject: [PATCH] rename a function, update a test --- examples/testbed/tests/shape_cast.h | 31 ++++++++++++++++------------- include/bounce/collision/gjk/gjk.h | 6 +++--- src/bounce/collision/gjk/gjk.cpp | 24 ++++++++++------------ 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/examples/testbed/tests/shape_cast.h b/examples/testbed/tests/shape_cast.h index cfc4611..392ce0c 100644 --- a/examples/testbed/tests/shape_cast.h +++ b/examples/testbed/tests/shape_cast.h @@ -6,18 +6,18 @@ class ShapeCast : public Test public: ShapeCast() { - m_xfA.SetIdentity(); + m_shapeA.m_hull = &b3BoxHull_identity; + m_shapeA.m_radius = 0.0f; + + m_shapeB.m_hull = &b3BoxHull_identity; + m_shapeB.m_radius = 0.0f; + m_xfA.position.Set(-5.0f, 0.0f, 0.0f); m_xfA.rotation.SetIdentity(); - m_shapeA.m_centers[0].Set(0.0f, -2.0f, 0.0f); - m_shapeA.m_centers[1].Set(0.0f, 2.0f, 0.0f); - m_shapeA.m_radius = 1.0f; - m_xfB.SetIdentity(); - m_xfB.position.Set(5.0f, 0.0f, 0.0f); + m_xfB.position.Set(10.0f, 0.0f, 0.0f); m_xfB.rotation.SetIdentity(); - m_shapeB.m_hull = &b3BoxHull_identity; - + m_proxyA.Set(&m_shapeA, 0); m_proxyB.Set(&m_shapeB, 0); } @@ -33,18 +33,21 @@ public: m_world.DrawShape(m_xfA, &m_shapeA); m_world.DrawShape(m_xfB, &m_shapeB); - b3Vec3 translationB = -20.0f * b3Vec3_x; + g_draw->DrawSolidShape(&m_shapeA, b3Color_white, m_xfA); + g_draw->DrawSolidShape(&m_shapeB, b3Color_white, m_xfB); + + b3Vec3 translationB = -100.0f * b3Vec3_x; g_draw->DrawSegment(m_xfB.position, m_xfB.position + translationB, b3Color_white); - b3GJKRayCastOutput out; - bool hit = b3GJKRayCast(&out, m_xfA, m_proxyA, m_xfB, m_proxyB, translationB); + b3GJKShapeCastOutput out; + bool hit = b3GJKShapeCast(&out, m_xfA, m_proxyA, m_xfB, m_proxyB, translationB); g_draw->DrawString(b3Color_white, "Iterations = %d", out.iterations); if (hit) { - g_draw->DrawPoint(out.point, 4.0f, b3Color(0.0f, 1.0f, 0.0f)); - g_draw->DrawSegment(out.point, out.point + out.normal, b3Color(0.0f, 1.0f, 0.0f)); + g_draw->DrawPoint(out.point, 4.0f, b3Color_green); + g_draw->DrawSegment(out.point, out.point + out.normal, b3Color_green); b3Transform xfB; xfB.rotation = m_xfB.rotation; @@ -106,7 +109,7 @@ public: return new ShapeCast(); } - b3CapsuleShape m_shapeA; + b3HullShape m_shapeA; b3Transform m_xfA; b3ShapeGJKProxy m_proxyA; diff --git a/include/bounce/collision/gjk/gjk.h b/include/bounce/collision/gjk/gjk.h index 4053ecf..6261de6 100644 --- a/include/bounce/collision/gjk/gjk.h +++ b/include/bounce/collision/gjk/gjk.h @@ -114,8 +114,8 @@ b3GJKOutput b3GJK(const b3Transform& xf1, const b3GJKProxy& proxy1, const b3Transform& xf2, const b3GJKProxy& proxy2, bool applyRadius, b3SimplexCache* cache); -// The output of the GJK-based ray cast algorithm. -struct b3GJKRayCastOutput +// The output of the GJK-based shape cast algorithm. +struct b3GJKShapeCastOutput { float32 t; // time of impact b3Vec3 point; // contact point at t @@ -124,7 +124,7 @@ struct b3GJKRayCastOutput }; // Find the time of impact between two proxies given the relative target translation vector. -bool b3GJKRayCast(b3GJKRayCastOutput* output, +bool b3GJKShapeCast(b3GJKShapeCastOutput* output, const b3Transform& xf1, const b3GJKProxy& proxy1, const b3Transform& xf2, const b3GJKProxy& proxy2, const b3Vec3& translation2); diff --git a/src/bounce/collision/gjk/gjk.cpp b/src/bounce/collision/gjk/gjk.cpp index 40ad582..03ea554 100644 --- a/src/bounce/collision/gjk/gjk.cpp +++ b/src/bounce/collision/gjk/gjk.cpp @@ -854,7 +854,7 @@ b3GJKOutput b3GJK(const b3Transform& xf1, const b3GJKProxy& proxy1, // Brian Mirtich // "Conservative Advancement" -bool b3GJKRayCast(b3GJKRayCastOutput* output, +bool b3GJKShapeCast(b3GJKShapeCastOutput* output, const b3Transform& xf1, const b3GJKProxy& proxy1, const b3Transform& xf2, const b3GJKProxy& proxy2, const b3Vec3& translation2) { @@ -960,7 +960,7 @@ bool b3GJKRayCast(b3GJKRayCastOutput* output, // Gino van der Bergen // "Smooth Mesh Contacts with GJK" // Game Physics Pearls 2010, page 99 -bool b3GJKShapeCast(b3GJKRayCastOutput* output, +bool b3GJKShapeCastCSO(b3GJKShapeCastOutput* output, const b3Transform& xf1, const b3GJKProxy& proxy1, const b3Transform& xf2, const b3GJKProxy& proxy2, const b3Vec3& translation2) { @@ -1032,14 +1032,6 @@ bool b3GJKShapeCast(b3GJKRayCastOutput* output, } } - // Copy simplex so we can identify duplicates. - saveCount = simplex.m_count; - for (u32 i = 0; i < saveCount; ++i) - { - save1[i] = vertices[i].index1; - save2[i] = vertices[i].index2; - } - // Unite p - s to simplex b3Vec3 s = t * r; @@ -1075,6 +1067,14 @@ bool b3GJKShapeCast(b3GJKRayCastOutput* output, maxTolerance = b3Max(maxTolerance, b3LengthSquared(vertices[i].point)); } + // Copy simplex so we can identify duplicates. + saveCount = simplex.m_count; + for (u32 i = 0; i < saveCount; ++i) + { + save1[i] = vertices[i].index1; + save2[i] = vertices[i].index2; + } + // Sub-solve const b3Vec3 origin = b3Vec3_zero; @@ -1098,9 +1098,7 @@ bool b3GJKShapeCast(b3GJKRayCastOutput* output, if (simplex.m_count == 4) { - // Overlap - output->iterations = iter; - return false; + break; } v = simplex.GetClosestPoint();