pub struct MjViewerCpp { /* private fields */ }Expand description
Wrapper around the C++ implementation of MuJoCo viewer.
If you don’t need the side UI, we recommend you use the Rust-native viewer crate::viewer::MjViewer instead.
§Safety
Calls to MjViewerCpp::render must be done only on the main thread!
For convenience MjViewerCpp implements both Send and Sync, however that is meant only for
syncing the viewer.
MjViewerCpp::launch_passive keeps internal pointers to mjModel and mjData.
The caller must ensure both remain alive and at a fixed address for the viewer’s lifetime.
See MjViewerCpp::launch_passive for the full safety contract.
Implementations§
Source§impl MjViewerCpp
impl MjViewerCpp
Sourcepub fn user_scn_mut(&mut self) -> &mut MjvScene
pub fn user_scn_mut(&mut self) -> &mut MjvScene
Returns a mutable reference to the user scene for drawing custom visual-only geoms.
Sourcepub unsafe fn launch_passive<M: ModelType + Clone + Send + Sync>(
model: M,
data: &MjData<M>,
max_user_geom: usize,
) -> Self
pub unsafe fn launch_passive<M: ModelType + Clone + Send + Sync>( model: M, data: &MjData<M>, max_user_geom: usize, ) -> Self
Launches a wrapper around MuJoCo’s C++ viewer. The max_user_geom parameter
defines how much space will be allocated for additional, user-defined visual-only geoms.
It can thus be set to 0 if no additional geoms will be drawn by the user.
Unlike the Rust-native viewer (crate::viewer::MjViewer), this also accepts a data parameter.
Additionally, this just returns a MjViewerCpp instance directly, without result
as the initialization may fail internally in C++ anyway, which we have no way of checking.
§Safety
The caller must ensure that both model and data remain alive and at a stable memory
address for the entire lifetime of the returned MjViewerCpp. Dropping or moving the
underlying MjModel or MjData while the viewer
is alive is undefined behavior.
MjViewerCpp::launch_passive itself performs the OpenGL initialization and render
steps, so it and MjViewerCpp::render must be called only on the main thread.
The viewer writes through both pointers, so the caller must treat model and data as
mutably borrowed by the viewer, and must not access them while MjViewerCpp::sync runs.
§Panics
Panics if the load thread panics.
Sourcepub unsafe fn render(&mut self) -> Result<(), &'static str>
pub unsafe fn render(&mut self) -> Result<(), &'static str>
Renders the simulation.
§Errors
Returns Err when called after the viewer has already been closed.
The call that detects the close event still returns Ok(()) and flips
the internal running state to false.
§Safety
Must be called from the main thread. GLFW requires main-thread access; calling from any other thread causes undefined behaviour.
Trait Implementations§
Source§impl Debug for MjViewerCpp
impl Debug for MjViewerCpp
Source§impl Drop for MjViewerCpp
Requests viewer exit and destroys the underlying C++ simulation handle.
impl Drop for MjViewerCpp
Requests viewer exit and destroys the underlying C++ simulation handle.
impl Send for MjViewerCpp
§Safety
Rendering must only be performed on the main thread. Send is provided so the viewer handle
can be moved to another thread that only calls MjViewerCpp::sync.
impl Sync for MjViewerCpp
§Safety
The viewer is safe to share across threads for syncing, but rendering must
only be done on the main thread. See MjViewerCpp for the full contract.
Auto Trait Implementations§
impl Freeze for MjViewerCpp
impl RefUnwindSafe for MjViewerCpp
impl Unpin for MjViewerCpp
impl UnsafeUnpin for MjViewerCpp
impl UnwindSafe for MjViewerCpp
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more