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;
-}
/// 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);
#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 =
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);
}
}
}