use crate::{mjModel, mjData, mjvScene, mjvCamera, mjvGLCamera, mjvPerturb, mjvOption};
use crate::{ObjectId, obj};
pub fn mjv_defaultCamera() -> mjvCamera {
let mut cam = std::mem::MaybeUninit::<mjvCamera>::uninit();
unsafe { crate::bindgen::mjv_defaultCamera(cam.as_mut_ptr()) };
unsafe { cam.assume_init() }
}
pub fn mjv_defaultFreeCamera(m: &mjModel) -> mjvCamera {
let mut cam = std::mem::MaybeUninit::<mjvCamera>::uninit();
unsafe { crate::bindgen::mjv_defaultFreeCamera(m.as_ptr(), cam.as_mut_ptr()) };
unsafe { cam.assume_init() }
}
pub fn mjv_defaultPerturb() -> mjvPerturb {
let mut pert = std::mem::MaybeUninit::<mjvPerturb>::uninit();
unsafe { crate::bindgen::mjv_defaultPerturb(pert.as_mut_ptr()) };
unsafe { pert.assume_init() }
}
pub fn mjv_room2model(
roompos: [f64; 3],
roomquat: [f64; 4],
scn: &mjvScene,
) -> ([f64; 3], [f64; 4]) {
let mut modelpos = [0.0; 3];
let mut modelquat = [0.0; 4];
unsafe {
crate::bindgen::mjv_room2model(
&mut modelpos,
&mut modelquat,
&roompos,
&roomquat,
scn.as_ptr(),
);
}
(modelpos, modelquat)
}
pub fn mjv_model2room(
modelpos: [f64; 3],
modelquat: [f64; 4],
scn: &mjvScene,
) -> ([f64; 3], [f64; 4]) {
let mut roompos = [0.0; 3];
let mut roomquat = [0.0; 4];
unsafe {
crate::bindgen::mjv_model2room(
&mut roompos,
&mut roomquat,
&modelpos,
&modelquat,
scn.as_ptr(),
);
}
(roompos, roomquat)
}
pub fn mjv_cameraInModel(scn: &mjvScene) -> ([f64; 3], [f64; 3], [f64; 3]) {
let mut headpos = [0.0; 3];
let mut forward = [0.0; 3];
let mut up = [0.0; 3];
unsafe {
crate::bindgen::mjv_cameraInModel(
&mut headpos,
&mut forward,
&mut up,
scn.as_ptr(),
);
}
(headpos, forward, up)
}
pub fn mjv_cameraInRoom(scn: &mjvScene) -> ([f64; 3], [f64; 3], [f64; 3]) {
let mut headpos = [0.0; 3];
let mut forward = [0.0; 3];
let mut up = [0.0; 3];
unsafe {
crate::bindgen::mjv_cameraInRoom(
&mut headpos,
&mut forward,
&mut up,
scn.as_ptr(),
);
}
(headpos, forward, up)
}
pub fn mjv_frustumHeight(scn: &mjvScene) -> f64 {
unsafe { crate::bindgen::mjv_frustumHeight(scn.as_ptr()) }
}
pub fn mjv_alignToCamera(vec: [f64; 3], forward: [f64; 3]) -> [f64; 3] {
let mut res = [0.0; 3];
unsafe {
crate::bindgen::mjv_alignToCamera(
&mut res,
&vec,
&forward,
);
}
res
}
pub fn mjv_moveCamera(
m: &mjModel,
action: crate::bindgen::mjtMouse,
reldx: f64,
reldy: f64,
scn: &mjvScene,
cam: &mut mjvCamera,
) {
unsafe {
crate::bindgen::mjv_moveCamera(
m.as_ptr(),
action.0 as i32,
reldx,
reldy,
scn.as_ptr(),
cam,
);
}
}
pub fn mjv_movePerturb(
m: &mjModel,
d: &mjData,
action: crate::bindgen::mjtMouse,
reldx: f64,
reldy: f64,
scn: &mjvScene,
pert: &mut mjvPerturb,
) {
unsafe {
crate::bindgen::mjv_movePerturb(
m.as_ptr(),
d.as_ptr(),
action.0 as i32,
reldx,
reldy,
scn.as_ptr(),
pert,
);
}
}
pub fn mjv_moveModel(
m: &mjModel,
action: crate::bindgen::mjtMouse,
reldx: f64,
reldy: f64,
roomup: [f64; 3],
scn: &mut mjvScene,
) {
unsafe {
crate::bindgen::mjv_moveModel(
m.as_ptr(),
action.0 as i32,
reldx,
reldy,
&roomup,
scn.as_mut_ptr(),
);
}
}
pub fn mjv_initPerturb(m: &mjModel, d: &mut mjData, scn: &mjvScene, pert: &mut mjvPerturb) {
unsafe {
crate::bindgen::mjv_initPerturb(m.as_ptr(), d.as_mut_ptr(), scn.as_ptr(), pert);
}
}
pub fn mjv_applyPerturbPose(
m: &mjModel,
d: &mut mjData,
pert: &mjvPerturb,
flg_paused: bool,
) {
unsafe {
crate::bindgen::mjv_applyPerturbPose(
m.as_ptr(),
d.as_mut_ptr(),
pert,
if flg_paused { 1 } else { 0 },
);
}
}
pub fn mjv_applyPerturbForce(m: &mjModel, d: &mut mjData, pert: &mjvPerturb) {
unsafe {
crate::bindgen::mjv_applyPerturbForce(m.as_ptr(), d.as_mut_ptr(), pert);
}
}
pub fn mjv_averageCamera(cam1: &mjvGLCamera, cam2: &mjvGLCamera) -> mjvGLCamera {
unsafe {
crate::bindgen::mjv_averageCamera(
cam1,
cam2,
)
}
}
mod mjv_select {
use super::*;
pub struct SelectResult {
pub geomid: Option<ObjectId<obj::Geom>>,
pub flexid: Option<ObjectId<obj::Flex>>,
pub skinid: Option<ObjectId<obj::Skin>>,
pub selpnt: [f64; 3],
}
}
pub fn mjv_select(
m: &mjModel,
d: &mjData,
vopt: &mjvOption,
aspectratio: f64,
relx: f64,
rely: f64,
scn: &mjvScene,
) -> mjv_select::SelectResult {
let mut geomid = [-1];
let mut flexid = [-1];
let mut skinid = [-1];
let mut selpnt = [0.0; 3];
unsafe {
crate::bindgen::mjv_select(
m.as_ptr(),
d.as_ptr(),
vopt,
aspectratio,
relx,
rely,
scn.as_ptr(),
&mut selpnt,
&mut geomid,
&mut flexid,
&mut skinid,
);
}
mjv_select::SelectResult {
geomid: if geomid[0] < 0 {None} else {Some(unsafe { ObjectId::new_unchecked(geomid[0] as usize) })},
flexid: if flexid[0] < 0 {None} else {Some(unsafe { ObjectId::new_unchecked(geomid[0] as usize) })},
skinid: if skinid[0] < 0 {None} else {Some(unsafe { ObjectId::new_unchecked(geomid[0] as usize) })},
selpnt,
}
}