munum 0.2.0

Micro 3D Math Library
Documentation
use super::ptr::Load;
use crate::{transform, Mat4, Quaternion, Vec3};

#[no_mangle]
pub extern "C" fn translation(
    out: *mut Mat4<f64>,
    v: *const Vec3<f64>,
) -> *const Mat4<f64> {
    if let Some(o) = unsafe { out.as_mut() } {
        *o = transform::translation(v.load())
    }
    out
}

#[no_mangle]
pub extern "C" fn scaling(out: *mut Mat4<f64>, v: *const Vec3<f64>) -> *const Mat4<f64> {
    if let Some(o) = unsafe { out.as_mut() } {
        *o = transform::scaling(v.load())
    }
    out
}

#[no_mangle]
pub extern "C" fn rotation(
    out: *mut Mat4<f64>,
    q: *const Quaternion<f64>,
) -> *const Mat4<f64> {
    if let Some(o) = unsafe { out.as_mut() } {
        *o = transform::rotation(q.load())
    }
    out
}

#[export_name = concat!("translationof")]
pub extern "C" fn translation_of(
    out: *mut Vec3<f64>,
    m: *const Mat4<f64>,
) -> *const Vec3<f64> {
    if let Some(o) = unsafe { out.as_mut() } {
        *o = transform::translation_of(m.load())
    }
    out
}

#[export_name = concat!("rotationof")]
pub extern "C" fn rotation_of(
    out: *mut Quaternion<f64>,
    m: *const Mat4<f64>,
) -> *const Quaternion<f64> {
    if let Some(o) = unsafe { out.as_mut() } {
        *o = transform::rotation_of(m.load())
    }
    out
}

#[export_name = concat!("scalingof")]
pub extern "C" fn scaling_of(
    out: *mut Vec3<f64>,
    m: *const Mat4<f64>,
) -> *const Vec3<f64> {
    if let Some(o) = unsafe { out.as_mut() } {
        *o = transform::scaling_of(m.load())
    }
    out
}

#[no_mangle]
pub extern "C" fn transformation(
    out: *mut Mat4<f64>,
    translation: *const Vec3<f64>,
    rotation: *const Quaternion<f64>,
    scaling: *const Vec3<f64>,
) -> *const Mat4<f64> {
    if let Some(o) = unsafe { out.as_mut() } {
        *o = transform::transformation(translation.load(), rotation.load(), scaling.load())
    }
    out
}

#[export_name = concat!("inverttrs")]
pub extern "C" fn invert_trs(out: *mut Mat4<f64>, m: *const Mat4<f64>) -> bool {
    if let Some(o) = unsafe { out.as_mut() } {
        *o = m.load();
        transform::invert_trs(o)
    } else {
        false
    }
}

#[no_mangle]
pub extern "C" fn ortho(
    out: *mut Mat4<f64>,
    left: f64,
    right: f64,
    bottom: f64,
    top: f64,
    znear: f64,
    zfar: f64,
) -> *const Mat4<f64> {
    if let Some(o) = unsafe { out.as_mut() } {
        *o = transform::ortho(left, right, bottom, top, znear, zfar)
    }
    out
}

#[no_mangle]
pub extern "C" fn perspective(
    out: *mut Mat4<f64>,
    aspect: f64,
    yfov: f64,
    znear: f64,
    zfar: f64,
) -> *const Mat4<f64> {
    if let Some(o) = unsafe { out.as_mut() } {
        *o = transform::perspective(aspect, yfov, znear, zfar)
    }
    out
}

#[export_name = concat!("perspectiveviewport")]
pub extern "C" fn perspective_viewport(
    out: *mut Mat4<f64>,
    left: f64,
    right: f64,
    bottom: f64,
    top: f64,
    znear: f64,
    zfar: f64,
) -> *const Mat4<f64> {
    if let Some(o) = unsafe { out.as_mut() } {
        *o = transform::perspective_viewport(left, right, bottom, top, znear, zfar)
    }
    out
}

#[export_name = concat!("targetto")]
pub extern "C" fn target_to(
    out: *mut Mat4<f64>,
    eye: *const Vec3<f64>,
    center: *const Vec3<f64>,
    up: *const Vec3<f64>,
) -> *const Mat4<f64> {
    if let Some(o) = unsafe { out.as_mut() } {
        *o = transform::target_to(eye.load(), center.load(), up.load())
    }
    out
}

#[export_name = concat!("lookat")]
pub extern "C" fn look_at(
    out: *mut Mat4<f64>,
    eye: *const Vec3<f64>,
    center: *const Vec3<f64>,
    up: *const Vec3<f64>,
) -> *const Mat4<f64> {
    if let Some(o) = unsafe { out.as_mut() } {
        *o = transform::look_at(eye.load(), center.load(), up.load())
    }
    out
}

#[export_name = concat!("lookatdir")]
pub extern "C" fn look_at_dir(
    out: *mut Vec3<f64>,
    pitch: f64,
    yaw: f64,
) -> *const Vec3<f64> {
    if let Some(o) = unsafe { out.as_mut() } {
        *o = transform::look_at_direction(pitch, yaw)
    }
    out
}