use crate::{
mjsElement, mjsBody, mjsFrame, mjsDefault, mjtByte,
mjsOrientation,
};
pub fn mjs_setDefault(element: &mut mjsElement, def: &mjsDefault) {
unsafe { crate::bindgen::mjs_setDefault(element, def); }
}
pub fn mjs_setFrame(dest: &mut mjsElement, frame: &mut mjsFrame) -> Result<(), ()> {
let result = unsafe { crate::bindgen::mjs_setFrame(dest, frame) };
if result == 0 {Ok(())} else {Err(())}
}
pub fn mjs_resolveOrientation(
quat: &mut [f64; 4],
degree: mjtByte,
sequence: &str,
orientation: &mjsOrientation,
) -> Result<(), String> {
let c_sequence = std::ffi::CString::new(sequence).expect("Failed to create CString");
let result = unsafe {
crate::bindgen::mjs_resolveOrientation(
quat,
degree,
c_sequence.as_ptr(),
orientation,
)
};
if !result.is_null() {
let error_msg = unsafe { std::ffi::CStr::from_ptr(result) }
.to_str()
.expect("Failed to convert C string to Rust string")
.to_owned();
Err(error_msg)
} else {
Ok(())
}
}
pub fn mjs_bodyToFrame<'body>(body: &'body mut [&mut mjsBody]) -> Option<&'body mut mjsFrame> {
let body: &'body mut [*mut mjsBody] = unsafe { std::mem::transmute(body) };
let c_ptr = unsafe { crate::bindgen::mjs_bodyToFrame(body.as_mut_ptr()) };
if c_ptr.is_null() {None} else {Some(unsafe { &mut *c_ptr })}
}
pub fn mjs_setUserValue(
element: &mut mjsElement,
key: &str,
data: &std::ffi::c_void,
) {
let c_key = std::ffi::CString::new(key).expect("Failed to create CString");
unsafe {
crate::bindgen::mjs_setUserValue(
element,
c_key.as_ptr(),
data,
);
}
}
pub fn mjs_getUserValue(
element: &mut mjsElement,
key: &str,
) -> Option<*const std::ffi::c_void> {
let key = std::ffi::CString::new(key).expect("Failed to create CString");
let ptr = unsafe { crate::bindgen::mjs_getUserValue(element, key.as_ptr()) };
if ptr.is_null() {None} else {Some(ptr)}
}
pub fn mjs_deleteUserValue(element: &mut mjsElement, key: &str) {
let key = std::ffi::CString::new(key).expect("Failed to create CString");
unsafe { crate::bindgen::mjs_deleteUserValue(element, key.as_ptr()); }
}