// Copyright (c) 2023 Dominic Masters
// 
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT

#pragma once
#include "dawnlibs.hpp"
#include "assert/assert.hpp"
#include "PhysicsTriangle.hpp"
#include "PhysicsSphere.hpp"
#include "PhysicsCapsule.hpp"
#include "AABB3D.hpp"

namespace Dawn {
  struct Ray3D {
    glm::vec3 origin;
    glm::vec3 direction;
  };

  bool_t raytestSphere(
    struct Ray3D ray,
    struct PhysicsSphere sphere,
    glm::vec3 *hit,
    glm::vec3 *normal,
    float_t *distance
  );

  bool_t raytestTriangle(
    struct Ray3D ray,
    struct PhysicsTriangle triangle,
    glm::vec3 *hitPoint,
    glm::vec3 *hitNormal,
    float_t *hitDistance
  );

  bool_t raytestAABB(
    struct Ray3D ray,
    struct AABB3D box,
    glm::vec3 *point,
    glm::vec3 *normal,
    float_t *distance
  );

  bool_t raytestCube(
    struct Ray3D ray,
    struct AABB3D box,
    glm::mat4 transform,
    glm::vec3 *point,
    glm::vec3 *normal,
    float_t *distance
  );

  bool_t raytestQuad(
    struct Ray3D ray,
    glm::vec2 min,
    glm::vec2 max,
    glm::mat4 transform,
    glm::vec3 *point,
    glm::vec3 *normal,
    float_t *distance
  );

  bool_t raytestCapsule(
    struct Ray3D ray,
    struct PhysicsCapsule capsule,
    glm::vec3 *point,
    glm::vec3 *normal,
    float_t *distance
  );
}