// // Created by dawsh on 1/25/24. // #pragma once #include #include #include "TriangleMesh.h" #include "Frustum.h" #include "OBB.h" namespace J3ML::Geometry { using J3ML::LinearAlgebra::Vector3; // RaycastResult structure containing the first object the ray collides with, // the surface intersection point, // and the surface normal at the point of intersection. struct RaycastResult { Vector3 Intersection; Vector3 SurfaceNormal; bool Hit; Shape* Target; static RaycastResult NoHit() { return {Vector3::NaN, Vector3::NaN, false, nullptr};} }; // A ray in 3D space is a line that starts from an origin point and extends to infinity in one direction class Ray { public: // The position of this ray. Vector3 Origin; // The normalized direction vector of this ray. // @note: For proper functionality, this direction vector needs to always be normalized Vector3 Direction; Ray() {} Ray(const Vector3& pos, const Vector3& dir); //explicit Ray(const Line& line); explicit Ray(const LineSegment& lineSegment); bool IsFinite() const; Vector3 GetPoint(float distance) const; RaycastResult Cast(const Triangle& target, float maxDistance = 99999999); RaycastResult Cast(const Plane& target, float maxDistance = 99999999); RaycastResult Cast(const AABB& target, float maxDistance = 99999999); // https://gdbooks.gitbooks.io/3dcollisions/content/Chapter3/raycast_sphere.html RaycastResult Cast(const Sphere& target, float maxDistance = 99999999); RaycastResult Cast(const OBB& target, float maxDistance = 99999999); RaycastResult Cast(const Capsule& target, float maxDistance = 99999999); RaycastResult Cast(const Frustum& target, float maxDistance = 99999999); RaycastResult Cast(const TriangleMesh& target, float maxDistance = 9999999); // Returns a RaycastResult structure containing the first object the ray collides with, // the surface intersection point, // and the surface normal at the point of intersection. RaycastResult Cast(std::vector shapes, float maxDistance = 99999999); }; }