use crate::core::math::{BoundingBox, Ray, RayHitInfo, Rectangle, Vector3};
use crate::core::models::Model;
use crate::ffi;
impl Rectangle {
#[inline]
pub fn check_collision_recs(&self, other: &Rectangle) -> bool {
unsafe { ffi::CheckCollisionRecs(self.into(), other.into()) }
}
#[inline]
pub fn check_collision_circle_rec(&self, center: impl Into<ffi::Vector2>, radius: f32) -> bool {
unsafe { ffi::CheckCollisionCircleRec(center.into(), radius, self.into()) }
}
#[inline]
pub fn get_collision_rec(&self, other: &Rectangle) -> Option<Rectangle> {
if self.check_collision_recs(other) {
return Some(unsafe { ffi::GetCollisionRec(self.into(), other.into()).into() });
}
return None;
}
#[inline]
pub fn check_collision_point_rec(&self, point: impl Into<ffi::Vector2>) -> bool {
unsafe { ffi::CheckCollisionPointRec(point.into(), self.into()) }
}
}
#[inline]
pub fn check_collision_circles(
center1: impl Into<ffi::Vector2>,
radius1: f32,
center2: impl Into<ffi::Vector2>,
radius2: f32,
) -> bool {
unsafe { ffi::CheckCollisionCircles(center1.into(), radius1, center2.into(), radius2) }
}
#[inline]
pub fn check_collision_point_circle(
point: impl Into<ffi::Vector2>,
center: impl Into<ffi::Vector2>,
radius: f32,
) -> bool {
unsafe { ffi::CheckCollisionPointCircle(point.into(), center.into(), radius) }
}
#[inline]
pub fn check_collision_point_triangle(
point: impl Into<ffi::Vector2>,
p1: impl Into<ffi::Vector2>,
p2: impl Into<ffi::Vector2>,
p3: impl Into<ffi::Vector2>,
) -> bool {
unsafe { ffi::CheckCollisionPointTriangle(point.into(), p1.into(), p2.into(), p3.into()) }
}
#[inline]
pub fn check_collision_spheres(
center_a: impl Into<ffi::Vector3>,
radius_a: f32,
center_b: impl Into<ffi::Vector3>,
radius_b: f32,
) -> bool {
unsafe { ffi::CheckCollisionSpheres(center_a.into(), radius_a, center_b.into(), radius_b) }
}
impl BoundingBox {
#[inline]
pub fn check_collision_boxes(&self, box2: BoundingBox) -> bool {
unsafe { ffi::CheckCollisionBoxes(self.into(), box2.into()) }
}
#[inline]
pub fn check_collision_box_sphere(
&self,
center_sphere: impl Into<ffi::Vector3>,
radius_sphere: f32,
) -> bool {
unsafe { ffi::CheckCollisionBoxSphere(self.into(), center_sphere.into(), radius_sphere) }
}
#[inline]
pub fn check_collision_ray_box(&self, ray: Ray) -> bool {
unsafe { ffi::CheckCollisionRayBox(ray.into(), self.into()) }
}
}
#[inline]
pub fn check_collision_ray_sphere(
ray: Ray,
sphere_position: impl Into<ffi::Vector3>,
sphere_radius: f32,
) -> bool {
unsafe { ffi::CheckCollisionRaySphere(ray.into(), sphere_position.into(), sphere_radius) }
}
#[inline]
pub fn check_collision_ray_sphere_ex(
ray: Ray,
sphere_position: impl Into<ffi::Vector3>,
sphere_radius: f32,
) -> Option<Vector3> {
unsafe {
let mut col_point = ffi::Vector3 {
x: 0.0,
y: 0.0,
z: 0.0,
};
let collision = ffi::CheckCollisionRaySphereEx(
ray.into(),
sphere_position.into(),
sphere_radius,
&mut col_point,
);
if collision {
Some(col_point.into())
} else {
None
}
}
}
#[inline]
pub fn get_collision_ray_model(ray: Ray, model: &Model) -> RayHitInfo {
unsafe { ffi::GetCollisionRayModel(ray.into(), &mut { model.0 }).into() }
}
#[inline]
pub fn get_collision_ray_triangle(
ray: Ray,
p1: impl Into<ffi::Vector3>,
p2: impl Into<ffi::Vector3>,
p3: impl Into<ffi::Vector3>,
) -> RayHitInfo {
unsafe { ffi::GetCollisionRayTriangle(ray.into(), p1.into(), p2.into(), p3.into()).into() }
}
#[inline]
pub fn get_collision_ray_ground(ray: Ray, ground_height: f32) -> RayHitInfo {
unsafe { ffi::GetCollisionRayGround(ray.into(), ground_height).into() }
}