diff --git a/src/3d_helpers.cc b/src/3d_helpers.cc index a8e37b0..ec4f3ea 100644 --- a/src/3d_helpers.cc +++ b/src/3d_helpers.cc @@ -160,30 +160,3 @@ std::optional ray_to_plane(const Ray &ray, const Ray &plane) { ray.position.y + ray.direction.y * amount, ray.position.z + ray.direction.z * amount}; } - -std::optional ray_collision_triangle(const Ray &ray, const Vector3 &a, - const Vector3 &b, - const Vector3 &c) { - const Vector3 ab = Vector3Subtract(a, b); - const Vector3 cb = Vector3Subtract(c, b); - Vector3 ortho = Vector3CrossProduct(ab, cb); - ortho = Vector3Normalize(ortho); - - Ray plane{.position = b, .direction = ortho}; - - auto result = ray_to_plane(ray, plane); - if (!result.has_value()) { - return std::nullopt; - } - - Vector3 bary = Vector3Barycenter(result.value(), a, b, c); - if (bary.x >= 0.0F && bary.x <= 1.0F && bary.y >= 0.0F && bary.y <= 1.0F && - bary.z >= 0.0F && bary.z <= 1.0F) { - float sum = bary.x + bary.y + bary.z; - if (sum > 0.999F && sum < 1.001) { - return result; - } - } - - return std::nullopt; -} diff --git a/src/3d_helpers.h b/src/3d_helpers.h index ff90a31..88b0021 100644 --- a/src/3d_helpers.h +++ b/src/3d_helpers.h @@ -27,11 +27,6 @@ extern bool ray_to_xz_plane(const Ray &ray, float &x_out, float &z_out); /// plane.direction is plane normal, plane.position is position on plane. extern std::optional ray_to_plane(const Ray &ray, const Ray &plane); -extern std::optional ray_collision_triangle(const Ray &ray, - const Vector3 &a, - const Vector3 &b, - const Vector3 &c); - // Unimplemented as this function isn't really needed and it exposes some // weirdness regarding column-major matrices. // extern Vector4 operator*(const Matrix &m, const Vector4 &v); diff --git a/src/screen_trunner.cc b/src/screen_trunner.cc index cb18b8f..72e60a0 100644 --- a/src/screen_trunner.cc +++ b/src/screen_trunner.cc @@ -239,7 +239,7 @@ bool TRunnerScreen::update(float dt) { #ifndef NDEBUG std::cout << "idx_hit set to " << idx_hit << std::endl; #endif - this->mouse_hit = collision.value(); + this->mouse_hit = collision; this->camera_target.x = xf; this->camera_target.y = @@ -260,14 +260,12 @@ bool TRunnerScreen::update(float dt) { if (auto bb_collision = GetRayCollisionBox(ray, surface_bbs[idx]); bb_collision.hit) { - if (auto collision = ray_collision_triangle(ray, nw, sw, ne); - collision.has_value()) { - on_collide_fn(collision); - break; - } else if (auto collision = ray_collision_triangle(ray, ne, sw, se); - collision.has_value()) { - on_collide_fn(collision); - break; + if (auto collision = GetRayCollisionTriangle(ray, nw, sw, ne); + collision.hit) { + on_collide_fn(collision.point); + } else if (auto collision = GetRayCollisionTriangle(ray, ne, sw, se); + collision.hit) { + on_collide_fn(collision.point); } } }