From d4b40dcf7589bef2bbd0b6b940ee992da9db2343 Mon Sep 17 00:00:00 2001 From: nathansmithsmith Date: Fri, 21 Jul 2023 00:12:00 -0600 Subject: Working collision system --- src/util.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'src/util.c') diff --git a/src/util.c b/src/util.c index e39478c..8ef4018 100644 --- a/src/util.c +++ b/src/util.c @@ -16,3 +16,59 @@ float signum(float n) { void printVector3(Vector3 v) { printf("%f %f %f\n", v.x, v.y, v.z); } + + +// Warning. Mostly chatgpt written. + +static void projectTriangleOntoAxis(const Vector3 triangle[3], const Vector3 axis, float* min, float* max) { + float dot1 = Vector3DotProduct(triangle[0], axis); + float dot2 = Vector3DotProduct(triangle[1], axis); + float dot3 = Vector3DotProduct(triangle[2], axis); + + *min = fminf(fminf(dot1, dot2), dot3); + *max = fmaxf(fmaxf(dot1, dot2), dot3); +} + +static bool trianglesIntersectOnAxis(const Vector3 triangleA[3], const Vector3 triangleB[3], Vector3 axis) { + float minA, maxA; + float minB, maxB; + + projectTriangleOntoAxis(triangleA, axis, &minA, &maxA); + projectTriangleOntoAxis(triangleB, axis, &minB, &maxB); + + return (minA <= maxB && maxA >= minB); +} + +bool checkTriangleCollision3D(const Vector3 triangleA[3], const Vector3 triangleB[3], Vector3 normalA, Vector3 normalB) { + // Test triangle normals + if (!trianglesIntersectOnAxis(triangleA, triangleB, normalA)) + return false; + + if (!trianglesIntersectOnAxis(triangleA, triangleB, normalB)) + return false; + + // Test cross products of triangle edges + Vector3 edgesA[3] = { + Vector3Subtract(triangleA[1], triangleA[0]), + Vector3Subtract(triangleA[2], triangleA[1]), + Vector3Subtract(triangleA[0], triangleA[2]) + }; + + Vector3 edgesB[3] = { + Vector3Subtract(triangleB[1], triangleB[0]), + Vector3Subtract(triangleB[2], triangleB[1]), + Vector3Subtract(triangleB[0], triangleB[2]) + }; + + for (int i = 0; i < 3; i++) { + Vector3 axis = Vector3CrossProduct(normalA, edgesA[i]); + if (!trianglesIntersectOnAxis(triangleA, triangleB, axis)) + return false; + + axis = Vector3CrossProduct(normalB, edgesB[i]); + if (!trianglesIntersectOnAxis(triangleA, triangleB, axis)) + return false; + } + + return true; +} -- cgit v1.2.3