1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
//! # MuJoCo-rs
//! A wrapper around the MuJoCo C library with a Rust-native viewer.
//! If you're familiar with MuJoCo, this should be pretty straightforward to use as the wrappers
//! mainly encapsulate some C structs or just rename them to match Rust's PascalCase style.
//!
//! The main structs are [`wrappers::mj_model::MjModel`] and [`wrappers::mj_data::MjData`].
//! These two structs (and some others) wrap the C structure in order to achieve memory safety.
//!
//! Their fields aren't publicly exposed and can instead be manipulated through views
//! (e.g., [`MjData::joint`](wrappers::mj_data::MjData::joint) and then [`wrappers::mj_data::MjJointDataInfo::view`]).
//! To access the wrapped attributes directly, call the corresponding `ffi()` methods
//! (e.g., [`MjData::ffi`](wrappers::MjData::ffi)).
//!
//! ## MuJoCo version
//!
//! MuJoCo-rs relies on MuJoCo [3.8.0](https://github.com/google-deepmind/mujoco/releases/tag/3.8.0).
//!
//! ## Documentation
//! A more guided documentation can be obtained [here](https://mujoco-rs.readthedocs.io/en/v4.0.x/).
//!
//! ### Missing library errors
//! Guided documentation also contains information on how to **configure MuJoCo**.
//! MuJoCo-rs cannot fully configure it itself due to MuJoCo being a shared C library. As a result, you may encounter
//! **load-time errors** about **missing libraries**.
//!
//! Information on how to configure MuJoCo and resolve these issues is available
//! [here](https://mujoco-rs.readthedocs.io/en/v4.0.x/installation.html#mujoco).
//!
//! ## 3D viewer
//! The Rust-native viewer is available ([`viewer::MjViewer`]) when the `viewer` / `viewer-ui` feature is enabled,
//! as well as MuJoCo's C++ one ([`crate::cpp_viewer::MjViewerCpp`]).
//! The C++ viewer, however, requires manual compilation of a patched MuJoCo repository,
//! like described [here](https://mujoco-rs.readthedocs.io/en/v4.0.x/installation.html#static-linking).
//!
//! ## Model editing
//! [`MjModel`](wrappers::MjModel) can be procedurally generated through the model editing module.
//! The specification representing the model is [`wrappers::mj_editing::MjSpec`].
//!
//! ## Functions
//! Most functions are wrapped under methods at different structs. Some functions
//! are available under the [`wrappers::fun`] module.
//!
//! If a certain function can't be found, you can use the raw FFI bindings, available under
//! the [`mujoco_c`] module. Note that to access the lower-level ffi structs inside wrappers,
//! `ffi()` or `ffi_mut()` must be called (e.g., [`MjData::ffi`](wrappers::MjData::ffi) and [`MjModel::ffi`](wrappers::MjModel::ffi)).
//!
//! # Cargo features
//! This crate has the following public features:
//! - `viewer`: enables the Rust-native MuJoCo viewer.
//!
//! - `viewer-ui`: enables the (additional) user UI within the viewer.
//! This also allows users to add custom [`egui`](https://docs.rs/egui/0.33/egui/) widgets to the viewer.
//!
//! - `cpp-viewer`: enables the Rust wrapper around the C++ MuJoCo viewer.
//! This requires static linking to a modified fork of MuJoCo, as described in [installation](https://mujoco-rs.readthedocs.io/en/v4.0.x/installation.html#static-linking).
//! - `renderer`: enables offscreen rendering for writing RGB and
//! depth data to memory or file.
//!
//! - `renderer-winit-fallback`: enables the invisible window fallback (based on winit) when offscreen
//! rendering fails to initialize. Note that true offscreen rendering is only available on Linux platforms
//! when the video driver supports it. On Windows and macOS, this feature must always be
//! enabled when the `renderer` feature is enabled.
//!
//! - `auto-download-mujoco`: MuJoCo dependency will be automatically downloaded to the specified path.
//!
//! - This is only available on Linux and Windows.
//! - The environment variable `MUJOCO_DOWNLOAD_DIR` must be set to the absolute path of the download location.
//! - Downloaded MuJoCo library is still a shared library. See
//! [installation](https://mujoco-rs.readthedocs.io/en/v4.0.x/installation.html#mujoco)
//! for information on complete configuration.
//!
//! By default, no optional features are enabled. Enable the features you need explicitly
//! (e.g. `cargo add mujoco-rs --features "viewer-ui renderer-winit-fallback"` for support
//! with the viewer and the viewer's extra UI, and the render with invisible window as a fallback).
//!
//!
use CStr;
/// Raw MuJoCo C and C++ FFI bindings (auto-generated).
/// Returns the version string of the MuJoCo library.
///
/// # Panics
/// Panics if the MuJoCo version string is not valid UTF-8.
/// Returns the version string of the MuJoCo library.