]> git.seodisparate.com - jumpartifact.com_demo_0/commitdiff
Use Raylib's Ray/Triangle collision fn
authorStephen Seo <seo.disparate@gmail.com>
Wed, 9 Aug 2023 05:00:54 +0000 (14:00 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Wed, 9 Aug 2023 05:00:54 +0000 (14:00 +0900)
src/3d_helpers.cc
src/3d_helpers.h
src/screen_trunner.cc

index a8e37b0a3e2ab64ffb7ad9a400d2ae88b2717c76..ec4f3ea98467774e2d8f64bf4dd196dcc0007e5c 100644 (file)
@@ -160,30 +160,3 @@ std::optional<Vector3> 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<Vector3> 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;
-}
index ff90a3111a38aa3e54a66a2841ee25dcd1ec463f..88b0021f45c35ff06ceba4a3f88ce88879fc9c1c 100644 (file)
@@ -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<Vector3> ray_to_plane(const Ray &ray, const Ray &plane);
 
-extern std::optional<Vector3> 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);
index cb18b8f06a27d408917b974af906248e6bd9abcb..72e60a0c749301721417a96f271108d76ccb001f 100644 (file)
@@ -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);
         }
       }
     }