use std::ffi::c_char;
pub type SdfHandle = *mut std::ffi::c_void;
pub type CompiledHandle = *mut std::ffi::c_void;
pub type MeshHandle = *mut std::ffi::c_void;
pub const SDF_HANDLE_NULL: SdfHandle = std::ptr::null_mut();
pub const COMPILED_HANDLE_NULL: CompiledHandle = std::ptr::null_mut();
pub const MESH_HANDLE_NULL: MeshHandle = std::ptr::null_mut();
#[repr(C)]
#[derive(Debug, Clone, Copy, Default)]
pub struct Vec3Ffi {
pub x: f32,
pub y: f32,
pub z: f32,
}
impl Vec3Ffi {
pub const fn new(x: f32, y: f32, z: f32) -> Self {
Self { x, y, z }
}
}
impl From<glam::Vec3> for Vec3Ffi {
fn from(v: glam::Vec3) -> Self {
Self {
x: v.x,
y: v.y,
z: v.z,
}
}
}
impl From<Vec3Ffi> for glam::Vec3 {
fn from(v: Vec3Ffi) -> Self {
Self::new(v.x, v.y, v.z)
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct QuatFfi {
pub x: f32,
pub y: f32,
pub z: f32,
pub w: f32,
}
impl QuatFfi {
pub const fn new(x: f32, y: f32, z: f32, w: f32) -> Self {
Self { x, y, z, w }
}
pub const fn identity() -> Self {
Self {
x: 0.0,
y: 0.0,
z: 0.0,
w: 1.0,
}
}
}
impl Default for QuatFfi {
fn default() -> Self {
Self::identity()
}
}
impl From<glam::Quat> for QuatFfi {
fn from(q: glam::Quat) -> Self {
Self {
x: q.x,
y: q.y,
z: q.z,
w: q.w,
}
}
}
impl From<QuatFfi> for glam::Quat {
fn from(q: QuatFfi) -> Self {
Self::from_xyzw(q.x, q.y, q.z, q.w)
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SdfResult {
Ok = 0,
InvalidHandle = 1,
NullPointer = 2,
InvalidParameter = 3,
OutOfMemory = 4,
IoError = 5,
CompileError = 6,
Unknown = 99,
}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ShaderType {
Wgsl = 0,
Hlsl = 1,
Glsl = 2,
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct BatchResult {
pub count: u32,
pub result: SdfResult,
}
#[repr(C)]
pub struct StringResult {
pub data: *mut c_char,
pub len: u32,
pub result: SdfResult,
}
impl Default for StringResult {
fn default() -> Self {
Self {
data: std::ptr::null_mut(),
len: 0,
result: SdfResult::Ok,
}
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct VersionInfo {
pub major: u16,
pub minor: u16,
pub patch: u16,
}
impl VersionInfo {
pub const fn current() -> Self {
Self {
major: 1,
minor: 1,
patch: 0,
}
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct SoaBatchConfig {
pub x: *const f32,
pub y: *const f32,
pub z: *const f32,
pub distances: *mut f32,
pub count: u32,
pub _padding: u32,
}
#[repr(C)]
#[derive(Debug, Clone, Copy, Default)]
pub struct EvalStats {
pub points_evaluated: u64,
pub time_ns: u64,
pub throughput: f64,
}