use crate::math::*;
use serde::*;
use wings::*;
#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize)]
pub struct Ray {
pub direction: Vec3A,
pub position: WorldVec,
pub max_distance: f32,
}
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
pub struct RaycastHit {
pub distance: f32,
pub face: Direction,
pub object: RaycastObject,
pub voxel: IVec3,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum RaycastObject {
Entity {
id: u64,
},
World {},
}
#[system_trait(host)]
pub trait Raycaster: 'static {
fn cast(&self, ray: &Ray) -> Option<RaycastHit>;
fn cast_entities(&self, ray: &Ray) -> Option<RaycastHit>;
fn cast_world(&self, ray: &Ray) -> Option<RaycastHit>;
}