pub struct ViewerSharedState { /* private fields */ }Expand description
Internal state that is used by MjViewer to store
MjData-related state. This is separate from MjViewer
to allow use in multi-threaded programs, where the physics part
runs in another thread and syncs the state with the viewer
running in the main thread.
The state can be obtained through MjViewer::state, which will return a reference to an Arc<Mutex<ViewerSharedState>>
instance. For scoped access, you may also use MjViewer::with_state_lock.
Implementations§
Sourcepub fn running(&self) -> bool
pub fn running(&self) -> bool
Checks whether the viewer is still running or is supposed to run.
Sourcepub fn user_scene(&self) -> &MjvScene
pub fn user_scene(&self) -> &MjvScene
Returns an immutable reference to a user scene for drawing custom visual-only geoms.
Geoms in the user scene are preserved between calls to ViewerSharedState::sync_data.
Sourcepub fn user_scene_mut(&mut self) -> &mut MjvScene
pub fn user_scene_mut(&mut self) -> &mut MjvScene
Returns a mutable reference to a user scene for drawing custom visual-only geoms.
Geoms in the user scene are preserved between calls to ViewerSharedState::sync_data.
Sourcepub fn sync_model(&mut self, model: &mut MjModel)
pub fn sync_model(&mut self, model: &mut MjModel)
Performs a bidirectional three-way merge of model’s opt, vis, and stat parameters
between the viewer’s passive model and the incoming model.
Detects model changes via signature comparison and reloads internal state if needed.
Sourcepub fn sync_model_opt(&mut self, opt: &mut MjOption)
pub fn sync_model_opt(&mut self, opt: &mut MjOption)
Performs a bidirectional three-way merge of MjModel::opt between the viewer’s
passive model and the provided option struct.
Changes made by the viewer UI are written to opt; changes made to opt externally
are written back to the viewer’s passive model.
Sourcepub fn sync_model_vis(&mut self, vis: &mut MjVisual)
pub fn sync_model_vis(&mut self, vis: &mut MjVisual)
Performs a bidirectional three-way merge of MjModel::vis between the viewer’s
passive model and the provided visual struct.
Changes made by the viewer UI are written to vis; changes made to vis externally
are written back to the viewer’s passive model.
Sourcepub fn sync_model_stat(&mut self, stat: &mut MjStatistic)
pub fn sync_model_stat(&mut self, stat: &mut MjStatistic)
Performs a bidirectional three-way merge of MjModel::stat between the viewer’s
passive model and the provided statistic struct.
Changes made by the viewer UI are written to stat; changes made to stat externally
are written back to the viewer’s passive model.
Sourcepub fn last_opt_sync_time(&self) -> Instant
pub fn last_opt_sync_time(&self) -> Instant
Returns the last time physics options (opt) were synced.
Sourcepub fn last_vis_sync_time(&self) -> Instant
pub fn last_vis_sync_time(&self) -> Instant
Returns the last time visualization options (vis) were synced.
Sourcepub fn last_stat_sync_time(&self) -> Instant
pub fn last_stat_sync_time(&self) -> Instant
Returns the last time statistics (stat) were synced.
Sourcepub fn update_texture_from(
&mut self,
model: &MjModel,
texture_id: usize,
) -> Result<(), MjViewerError>
pub fn update_texture_from( &mut self, model: &MjModel, texture_id: usize, ) -> Result<(), MjViewerError>
Copies the texture with texture_id from model into the viewer’s internal passive model
and schedules a GPU re-upload for the next MjViewer::render call.
The upload is processed on the next call to MjViewer::render, at which point
the updated texture will be reflected in the scene.
§Errors
MjViewerError::SignatureMismatchifmodel’s signature does not match the viewer’s passive model.MjViewerError::IndexOutOfBoundsiftexture_id >= model.ntex().
Sourcepub fn update_textures_from(
&mut self,
model: &MjModel,
) -> Result<(), MjViewerError>
pub fn update_textures_from( &mut self, model: &MjModel, ) -> Result<(), MjViewerError>
Copies all textures from model into the viewer’s internal passive model
and schedules a GPU re-upload for the next MjViewer::render call.
§Errors
MjViewerError::SignatureMismatchifmodel’s signature does not match the viewer’s passive model.
Sourcepub fn update_mesh_from(
&mut self,
model: &MjModel,
mesh_id: usize,
) -> Result<(), MjViewerError>
pub fn update_mesh_from( &mut self, model: &MjModel, mesh_id: usize, ) -> Result<(), MjViewerError>
Copies the mesh with mesh_id from model into the viewer’s internal passive model
and schedules a GPU re-upload for the next MjViewer::render call.
All data arrays read by mjr_uploadMesh are copied: vertex positions
(mesh_vert), per-vertex normals (mesh_normal), UV texture coordinates
(mesh_texcoord), face–vertex indices (mesh_face), face–normal indices
(mesh_facenormal), face–texcoord indices (mesh_facetexcoord), and convex
hull graph data (mesh_graph). Layout fields (address and count arrays) are
not copied because they are fixed by the model signature.
The upload is processed on the next call to MjViewer::render, at which point
the updated mesh will be reflected in the scene.
§Errors
MjViewerError::SignatureMismatchifmodel’s signature does not match the viewer’s passive model.MjViewerError::IndexOutOfBoundsifmesh_id >= model.nmesh().
Sourcepub fn update_meshes_from(
&mut self,
model: &MjModel,
) -> Result<(), MjViewerError>
pub fn update_meshes_from( &mut self, model: &MjModel, ) -> Result<(), MjViewerError>
Copies all meshes from model into the viewer’s internal passive model
and schedules a GPU re-upload for the next MjViewer::render call.
All data arrays read by mjr_uploadMesh are bulk-copied: vertex positions
(mesh_vert), per-vertex normals (mesh_normal), UV texture coordinates
(mesh_texcoord), face–vertex indices (mesh_face), face–normal indices
(mesh_facenormal), face–texcoord indices (mesh_facetexcoord), and convex
hull graph data (mesh_graph). Layout fields (address and count arrays) are
not copied because they are fixed by the model signature.
§Errors
MjViewerError::SignatureMismatchifmodel’s signature does not match the viewer’s passive model.
Sourcepub fn update_hfield_from(
&mut self,
model: &MjModel,
hfield_id: usize,
) -> Result<(), MjViewerError>
pub fn update_hfield_from( &mut self, model: &MjModel, hfield_id: usize, ) -> Result<(), MjViewerError>
Copies the heightfield with hfield_id from model into the viewer’s internal passive model
and schedules a GPU re-upload for the next MjViewer::render call.
The upload is processed on the next call to MjViewer::render, at which point
the updated heightfield will be reflected in the scene.
§Errors
MjViewerError::SignatureMismatchifmodel’s signature does not match the viewer’s passive model.MjViewerError::IndexOutOfBoundsifhfield_id >= model.nhfield().
Sourcepub fn update_hfields_from(
&mut self,
model: &MjModel,
) -> Result<(), MjViewerError>
pub fn update_hfields_from( &mut self, model: &MjModel, ) -> Result<(), MjViewerError>
Copies all heightfields from model into the viewer’s internal passive model
and schedules a GPU re-upload for the next MjViewer::render call.
§Errors
MjViewerError::SignatureMismatchifmodel’s signature does not match the viewer’s passive model.
Sourcepub fn sync_data_full<M: Deref<Target = MjModel>>(
&mut self,
data: &mut MjData<M>,
)
pub fn sync_data_full<M: Deref<Target = MjModel>>( &mut self, data: &mut MjData<M>, )
Same as ViewerSharedState::sync_data, except it copies the entire MjData
struct (including large Jacobian and other arrays), not just the state needed for visualization.
§Panics
Panics if the internal data copy fails due to an inconsistent model state (indicates a bug).
Sourcepub fn sync_data<M: Deref<Target = MjModel>>(&mut self, data: &mut MjData<M>)
pub fn sync_data<M: Deref<Target = MjModel>>(&mut self, data: &mut MjData<M>)
Syncs the viewer’s internal passive MjData with data.
Synchronization happens in three steps:
- The viewer checks if any changes have been made to the internal
MjDatasince the last call to this method (since the last sync). Changed elements are selectively merged intodata(elements the viewer did not touch are preserved). datais copied into the viewer’s internal passive copy (visualization fields only; see warning below).- Perturbations are applied to
dataviaMjvPerturb::apply, which unconditionally zeroesxfrc_appliedbefore writing any active perturbation forces. Any external forces previously set ondatawill be cleared.
Note that users must afterward call MjViewer::render for the scene
to be rendered and the UI to be processed.
- mass matrices (
qM,qLD,qLDiagInv,qLU); - constraint arrays (
efc_*,iefc_*, including constraint Jacobians).
In UI callbacks these fields will be absent unless
ViewerSharedState::sync_data_full is used or they are recomputed explicitly
(e.g. via data.forward()).
Additionally, because the viewer may write integration state (e.g. ctrl) back
to the user’s data, any Jacobians or other derived quantities in data may be
stale after this call and should be recomputed if needed.
§Panics
Panics if the internal data copy or state merge fails due to an inconsistent model state (indicates a bug).
Trait Implementations§
Auto Trait Implementations§
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.