pub use crate::bindgen::{
mjtFontScale, mjtFont, mjtGridPos,
};
use crate::helper::{
Rgb, Rgba,
};
use crate::{
ObjectId, obj,
mjModel, mjrContext, mjvScene, mjrRect, mjvFigure,
mjtFramebuffer,
};
pub fn mjr_defaultContext() -> mjrContext {
let mut c = Box::<crate::bindgen::mjrContext>::new_uninit();
unsafe { crate::bindgen::mjr_defaultContext(c.as_mut_ptr()); }
mjrContext::from_raw(Box::into_raw(unsafe { c.assume_init() }))
}
pub fn mjr_makeContext(m: &mjModel, con: &mut mjrContext, fontscale: mjtFontScale) {
unsafe {
crate::bindgen::mjr_makeContext(m.as_ptr(), con.as_mut_ptr(), fontscale.0 as i32);
}
}
pub fn mjr_changeFont(fontscale: mjtFontScale, con: &mut mjrContext) {
unsafe {
crate::bindgen::mjr_changeFont(fontscale.0 as i32, con.as_mut_ptr());
}
}
pub fn mjr_addAux(
index: usize,
width: i32,
height: i32,
samples: i32,
con: &mut mjrContext,
) {
unsafe {
crate::bindgen::mjr_addAux(index as i32, width, height, samples, con.as_mut_ptr());
}
}
pub fn mjr_freeContext(con: &mut mjrContext) {
unsafe { crate::bindgen::mjr_freeContext(con.as_mut_ptr()); }
drop(unsafe { Box::from_raw(con.as_mut_ptr()) });
}
pub fn mjr_resizeOffscreen(width: i32, height: i32, con: &mut mjrContext) {
unsafe {
crate::bindgen::mjr_resizeOffscreen(width, height, con.as_mut_ptr());
}
}
pub fn mjr_uploadTexture(m: &mjModel, con: &mjrContext, texid: ObjectId<obj::Texture>) {
unsafe {
crate::bindgen::mjr_uploadTexture(m.as_ptr(), con.as_ptr(), texid.index() as i32);
}
}
pub fn mjr_uploadMesh(m: &mjModel, con: &mjrContext, meshid: ObjectId<obj::Mesh>) {
unsafe {
crate::bindgen::mjr_uploadMesh(m.as_ptr(), con.as_ptr(), meshid.index() as i32);
}
}
pub fn mjr_uploadHField(m: &mjModel, con: &mjrContext, hfieldid: ObjectId<obj::HField>) {
unsafe {
crate::bindgen::mjr_uploadHField(m.as_ptr(), con.as_ptr(), hfieldid.index() as i32);
}
}
pub fn mjr_restoreBuffer(con: &mjrContext) {
unsafe {
crate::bindgen::mjr_restoreBuffer(con.as_ptr());
}
}
pub fn mjr_setBuffer(framebuffer: mjtFramebuffer, con: &mut mjrContext) {
unsafe {
crate::bindgen::mjr_setBuffer(framebuffer.0 as i32, con.as_mut_ptr());
}
}
pub fn mjr_readPixels(
rgb: &mut [u8],
depth: &mut [f32],
viewport: mjrRect,
con: &mjrContext,
) {
assert_eq!(rgb.len(), (viewport.width * viewport.height * 3) as usize);
assert_eq!(depth.len(), viewport.width as usize * viewport.height as usize);
unsafe {
crate::bindgen::mjr_readPixels(
rgb.as_mut_ptr(),
depth.as_mut_ptr(),
viewport,
con.as_ptr(),
);
}
}
pub fn mjr_drawPixels(
rgb: &[u8],
depth: &[f32],
viewport: mjrRect,
con: &mjrContext,
) {
assert_eq!(rgb.len(), (viewport.width * viewport.height * 3) as usize);
assert_eq!(depth.len(), viewport.width as usize * viewport.height as usize);
unsafe {
crate::bindgen::mjr_drawPixels(
rgb.as_ptr(),
depth.as_ptr(),
viewport,
con.as_ptr(),
);
}
}
pub fn mjr_blitBuffer(
src: mjrRect,
dst: mjrRect,
flg_color: bool,
flg_depth: bool,
con: &mjrContext,
) {
unsafe {
crate::bindgen::mjr_blitBuffer(
src,
dst,
if flg_color { 1 } else { 0 },
if flg_depth { 1 } else { 0 },
con.as_ptr(),
);
}
}
pub fn mjr_setAux(index: i32, con: &mjrContext) {
unsafe {
crate::bindgen::mjr_setAux(index, con.as_ptr());
}
}
pub fn mjr_blitAux(
index: usize,
src: mjrRect,
left: i32,
bottom: i32,
con: &mjrContext,
) {
unsafe {
crate::bindgen::mjr_blitAux(index as i32, src, left, bottom, con.as_ptr());
}
}
pub fn mjr_text(
font: mjtFontScale,
txt: &str,
con: &mjrContext,
x: f32,
y: f32,
Rgb { r, g, b }: Rgb,
) {
let c_txt = std::ffi::CString::new(txt).expect("`txt` has invalid UTF-8");
unsafe {
crate::bindgen::mjr_text(
font.0 as i32,
c_txt.as_ptr(),
con.as_ptr(),
x,
y,
r,
g,
b,
);
}
}
pub fn mjr_overlay(
font: mjtFont,
gridpos: mjtGridPos,
viewport: mjrRect,
overlay: &str,
overlay2: &str,
con: &mjrContext,
) {
let c_overlay = std::ffi::CString::new(overlay).expect("`overlay` has invalid UTF-8");
let c_overlay2 = std::ffi::CString::new(overlay2).expect("`overlay2` has invalid UTF-8");
unsafe {
crate::bindgen::mjr_overlay(
font.0 as i32,
gridpos.0 as i32,
viewport,
c_overlay.as_ptr(),
c_overlay2.as_ptr(),
con.as_ptr(),
);
}
}
pub fn mjr_maxViewport(con: &mjrContext) -> mjrRect {
unsafe { crate::bindgen::mjr_maxViewport(con.as_ptr()) }
}
pub fn mjr_rectangle(viewport: mjrRect, Rgba { r, g, b, a }: Rgba) {
unsafe {
crate::bindgen::mjr_rectangle(viewport, r, g, b, a);
}
}
pub fn mjr_label(
viewport: mjrRect,
font: mjtFont,
txt: &str,
text_color: Rgba,
background_color: Rgb,
con: &mjrContext,
) {
let c_txt = std::ffi::CString::new(txt).expect("`txt` has invalid UTF-8");
unsafe {
crate::bindgen::mjr_label(
viewport,
font.0 as i32,
c_txt.as_ptr(),
text_color.r, text_color.g, text_color.b, text_color.a,
background_color.r, background_color.g, background_color.b,
con.as_ptr(),
);
}
}
pub fn mjr_figure(viewport: mjrRect, fig: &mut mjvFigure, con: &mjrContext) {
unsafe {
crate::bindgen::mjr_figure(viewport, fig, con.as_ptr());
}
}
pub fn mjr_render(viewport: mjrRect, scn: &mut mjvScene, con: &mjrContext) {
unsafe {
crate::bindgen::mjr_render(viewport, scn.as_mut_ptr(), con.as_ptr());
}
}
pub fn mjr_finish() {
unsafe {
crate::bindgen::mjr_finish();
}
}
pub fn mjr_getError() -> i32 {
unsafe { crate::bindgen::mjr_getError() }
}
pub fn mjr_findRect(
x: i32,
y: i32,
rect: &[mjrRect],
) -> Option<usize> {
let index = unsafe {
crate::bindgen::mjr_findRect(x, y, rect.len() as i32, rect.as_ptr())
};
if index < 0 {None} else {Some(index as usize)}
}