use std::time::Instant;
use mujoco_rs::viewer::MjViewer;
use mujoco_rs::prelude::*;
const EXAMPLE_MODEL: &str = stringify! {
<mujoco>
<worldbody>
<light ambient="0.2 0.2 0.2" pos=".2 .2 .2"/>
<body name="ball">
<geom name="green_sphere" size=".1" rgba="0 1 0 1"/>
<joint name="sphere_joint" type="free"/>
</body>
<geom name="floor" type="plane" size="10 10 1" euler="5 0 0"/>
</worldbody>
</mujoco>
};
fn main() {
let model = Box::new(MjModel::from_xml_string(EXAMPLE_MODEL).expect("could not load the model"));
let mut data = MjData::new(model);
let mut viewer = MjViewer::builder()
.max_user_geoms(100)
.vsync(true) .build_passive(data.model())
.expect("could not launch the viewer");
let shared_state = viewer.state().clone();
let mut viewer_running = shared_state.lock().unwrap().running(); let physics_thread = std::thread::spawn(move || {
while viewer_running {
let timer = Instant::now();
data.step();
{
let mut lock = shared_state.lock().unwrap();
lock.sync_data(&mut data);
lock.sync_model_opt(data.model_opt_mut());
lock.sync_model_vis(data.model_vis_mut());
lock.sync_model_stat(data.model_stat_mut());
viewer_running = lock.running();
}
while timer.elapsed().as_secs_f64() < data.model().opt().timestep {}
}
});
while viewer.running() {
viewer.render().unwrap();
}
physics_thread.join().unwrap();
}