use crate::Sealed;
use crate::callback::CustomRayTracingUserData;
use crate::device::{EmbreeDevice, RadeonRaysDevice};
use std::fmt::Debug;
use std::sync::Arc;
#[derive(Debug)]
pub struct DefaultRayTracer;
#[derive(Debug)]
pub struct Embree;
#[derive(Debug)]
pub struct RadeonRays;
#[derive(Debug)]
pub struct CustomRayTracer;
impl Sealed for DefaultRayTracer {}
impl Sealed for Embree {}
impl Sealed for RadeonRays {}
impl Sealed for CustomRayTracer {}
pub trait RayTracer: Sealed {
type Device: Debug + Send + Sync;
type CallbackUserData: Debug + Send + Sync;
fn scene_type() -> audionimbus_sys::IPLSceneType;
}
impl RayTracer for DefaultRayTracer {
type Device = ();
type CallbackUserData = ();
fn scene_type() -> audionimbus_sys::IPLSceneType {
audionimbus_sys::IPLSceneType::IPL_SCENETYPE_DEFAULT
}
}
impl RayTracer for Embree {
type Device = EmbreeDevice;
type CallbackUserData = ();
fn scene_type() -> audionimbus_sys::IPLSceneType {
audionimbus_sys::IPLSceneType::IPL_SCENETYPE_EMBREE
}
}
impl RayTracer for RadeonRays {
type Device = RadeonRaysDevice;
type CallbackUserData = ();
fn scene_type() -> audionimbus_sys::IPLSceneType {
audionimbus_sys::IPLSceneType::IPL_SCENETYPE_RADEONRAYS
}
}
impl RayTracer for CustomRayTracer {
type Device = ();
type CallbackUserData = CustomCallbackUserData;
fn scene_type() -> audionimbus_sys::IPLSceneType {
audionimbus_sys::IPLSceneType::IPL_SCENETYPE_CUSTOM
}
}
#[derive(Debug)]
pub struct CustomCallbackUserData(
#[allow(dead_code)]
pub(crate) Arc<CustomRayTracingUserData>,
);