67 lines
2.5 KiB
C++
67 lines
2.5 KiB
C++
//
|
|
// Created by dawsh on 1/25/24.
|
|
//
|
|
|
|
#pragma once
|
|
|
|
#include <J3ML/LinearAlgebra/Vector3.h>
|
|
#include <vector>
|
|
#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<Shape> shapes, float maxDistance = 99999999);
|
|
|
|
void ProjectToAxis(const Vector3 &direction, float &outMin, float &outMax) const;
|
|
|
|
Vector3 ClosestPoint(const LineSegment&, float &d, float &d2) const;
|
|
|
|
Vector3 ClosestPoint(const Vector3 &targetPoint, float &d) const;
|
|
};
|
|
} |