]> git.seodisparate.com - jumpartifact.com_demo_0/commitdiff
Refactor duplicate code into function
authorStephen Seo <seo.disparate@gmail.com>
Wed, 9 Aug 2023 03:22:33 +0000 (12:22 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Wed, 9 Aug 2023 03:22:33 +0000 (12:22 +0900)
src/3d_helpers.cc
src/3d_helpers.h
src/screen_trunner.cc

index ec4f3ea98467774e2d8f64bf4dd196dcc0007e5c..a8e37b0a3e2ab64ffb7ad9a400d2ae88b2717c76 100644 (file)
@@ -160,3 +160,30 @@ 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 88b0021f45c35ff06ceba4a3f88ce88879fc9c1c..ff90a3111a38aa3e54a66a2841ee25dcd1ec463f 100644 (file)
@@ -27,6 +27,11 @@ 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 d62e933d542de0e25bccd868f06be84024b103c4..45e9c9cfea6415c22f2ca2d2039d83d44a5be62c 100644 (file)
@@ -205,58 +205,18 @@ bool TRunnerScreen::update(float dt) {
       Vector3 sw{xf - 0.5F, current.sw, zf + 0.5F};
       Vector3 se{xf + 0.5F, current.se, zf + 0.5F};
 
-      {
-        Vector3 a = Vector3Subtract(nw, sw);
-        Vector3 b = Vector3Subtract(ne, sw);
-        Vector3 ortho = Vector3CrossProduct(a, b);
-        ortho = Vector3Normalize(ortho);
-
-        Ray plane{.position = sw, .direction = ortho};
-
-        auto result = ray_to_plane(ray, plane);
-        if (!result.has_value()) {
-          continue;
-        }
-
-        Vector3 bary = Vector3Barycenter(result.value(), nw, sw, ne);
-        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) {
-            idx_hit = idx;
+      if (ray_collision_triangle(ray, nw, sw, ne).has_value()) {
+        idx_hit = idx;
 #ifndef NDEBUG
-            std::cout << "first: idx_hit set to " << idx_hit << std::endl;
+        std::cout << "first: idx_hit set to " << idx_hit << std::endl;
 #endif
-            break;
-          }
-        }
-      }
-
-      {
-        Vector3 a = Vector3Subtract(se, sw);
-        Vector3 b = Vector3Subtract(ne, sw);
-        Vector3 ortho = Vector3CrossProduct(a, b);
-        ortho = Vector3Normalize(ortho);
-
-        Ray plane{.position = sw, .direction = ortho};
-
-        auto result = ray_to_plane(ray, plane);
-        if (!result.has_value()) {
-          continue;
-        }
-
-        Vector3 bary = Vector3Barycenter(result.value(), se, sw, ne);
-        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) {
-            idx_hit = idx;
+        break;
+      } else if (ray_collision_triangle(ray, ne, sw, se).has_value()) {
+        idx_hit = idx;
 #ifndef NDEBUG
-            std::cout << "second: idx_hit set to " << idx_hit << std::endl;
+        std::cout << "second: idx_hit set to " << idx_hit << std::endl;
 #endif
-            break;
-          }
-        }
+        break;
       }
     }