From a2a1ac9fc2ff26ad6fb29c0cccf768fc6f1d2c77 Mon Sep 17 00:00:00 2001 From: Yuval Tassa Date: Fri, 21 Apr 2023 08:43:36 -0700 Subject: [PATCH] Pass `mjvOption` to plugin visualize callback. PiperOrigin-RevId: 526047180 Change-Id: Ia63f02184f5c6a7e3b588298639fa0ab4a6da649 --- doc/includes/references.h | 5 +++-- include/mujoco/mjplugin.h | 2 +- include/mujoco/mujoco.h | 3 ++- introspect/functions.py | 6 ++++++ plugin/elasticity/cable.cc | 10 +++++----- simulate/simulate.cc | 4 ++-- src/engine/engine_vis_state.c | 5 +++-- src/engine/engine_vis_state.h | 3 ++- src/engine/engine_vis_visualize.c | 2 +- test/engine/engine_vis_state_test.cc | 2 +- unity/Runtime/Bindings/MjBindings.cs | 2 +- 11 files changed, 27 insertions(+), 17 deletions(-) diff --git a/doc/includes/references.h b/doc/includes/references.h index 9949fa28..9456fa8c 100644 --- a/doc/includes/references.h +++ b/doc/includes/references.h @@ -1244,7 +1244,7 @@ struct mjpPlugin_ { void (*advance)(const mjModel* m, mjData* d, int instance); // called by mjv_updateScene (optional) - void (*visualize)(const mjModel*m, mjData* d, mjvScene* scn, int instance); + void (*visualize)(const mjModel*m, mjData* d, const mjvOption* opt, mjvScene* scn, int instance); }; typedef struct mjpPlugin_ mjpPlugin; typedef enum mjtGridPos_ { // grid position for overlay @@ -2270,7 +2270,8 @@ void mjv_defaultSceneState(mjvSceneState* scnstate); void mjv_makeSceneState(const mjModel* m, const mjData* d, mjvSceneState* scnstate, int maxgeom); void mjv_freeSceneState(mjvSceneState* scnstate); -void mjv_updateSceneState(const mjModel* m, mjData* d, mjvSceneState* scnstate); +void mjv_updateSceneState(const mjModel* m, mjData* d, const mjvOption* opt, + mjvSceneState* scnstate); void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* opt, const mjvPerturb* pert, int catmask, mjvScene* scn); void mjv_makeLights(const mjModel* m, mjData* d, mjvScene* scn); diff --git a/include/mujoco/mjplugin.h b/include/mujoco/mjplugin.h index 3216e184..e0fe7d24 100644 --- a/include/mujoco/mjplugin.h +++ b/include/mujoco/mjplugin.h @@ -87,7 +87,7 @@ struct mjpPlugin_ { void (*advance)(const mjModel* m, mjData* d, int instance); // called by mjv_updateScene (optional) - void (*visualize)(const mjModel*m, mjData* d, mjvScene* scn, int instance); + void (*visualize)(const mjModel*m, mjData* d, const mjvOption* opt, mjvScene* scn, int instance); }; typedef struct mjpPlugin_ mjpPlugin; diff --git a/include/mujoco/mujoco.h b/include/mujoco/mujoco.h index d735dc41..9c1124fd 100644 --- a/include/mujoco/mujoco.h +++ b/include/mujoco/mujoco.h @@ -632,7 +632,8 @@ MJAPI void mjv_makeSceneState(const mjModel* m, const mjData* d, MJAPI void mjv_freeSceneState(mjvSceneState* scnstate); // Update a scene state from model and data. -MJAPI void mjv_updateSceneState(const mjModel* m, mjData* d, mjvSceneState* scnstate); +MJAPI void mjv_updateSceneState(const mjModel* m, mjData* d, const mjvOption* opt, + mjvSceneState* scnstate); // Add geoms from selected categories. MJAPI void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* opt, diff --git a/introspect/functions.py b/introspect/functions.py index 437c1b63..8fc22942 100644 --- a/introspect/functions.py +++ b/introspect/functions.py @@ -3945,6 +3945,12 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ inner_type=ValueType(name='mjData'), ), ), + FunctionParameterDecl( + name='opt', + type=PointerType( + inner_type=ValueType(name='mjvOption', is_const=True), + ), + ), FunctionParameterDecl( name='scnstate', type=PointerType( diff --git a/plugin/elasticity/cable.cc b/plugin/elasticity/cable.cc index afe8fa26..d9746439 100644 --- a/plugin/elasticity/cable.cc +++ b/plugin/elasticity/cable.cc @@ -302,11 +302,11 @@ return 0; auto* elasticity = reinterpret_cast(d->plugin_data[instance]); elasticity->Compute(m, d, instance); }; - plugin.visualize = - +[](const mjModel* m, mjData* d, mjvScene* scn, int instance) { - auto* elasticity = reinterpret_cast(d->plugin_data[instance]); - elasticity->Visualize(m, d, scn, instance); - }; + plugin.visualize = +[](const mjModel* m, mjData* d, const mjvOption* opt, mjvScene* scn, + int instance) { + auto* elasticity = reinterpret_cast(d->plugin_data[instance]); + elasticity->Visualize(m, d, scn, instance); + }; mjp_registerPlugin(&plugin); } diff --git a/simulate/simulate.cc b/simulate/simulate.cc index 135a3590..6700602a 100644 --- a/simulate/simulate.cc +++ b/simulate/simulate.cc @@ -1798,7 +1798,7 @@ void Simulate::Sync() { if (fully_managed_) { mjv_updateScene(m_, d_, &this->opt, &this->pert, &this->cam, mjCAT_ALL, &this->scn); } else { - mjv_updateSceneState(m_, d_, &scnstate_); + mjv_updateSceneState(m_, d_, &this->opt, &scnstate_); mjopt_prev_ = scnstate_.model.opt; warn_vgeomfull_prev_ = scnstate_.data.warning[mjWARN_VGEOMFULL].number; } @@ -1956,7 +1956,7 @@ void Simulate::LoadOnRenderThread() { mjv_updateScene(this->mnew_, this->dnew_, &this->opt, &this->pert, &this->cam, mjCAT_ALL, &this->scn); } else { - mjv_updateSceneState(this->mnew_, this->dnew_, &this->scnstate_); + mjv_updateSceneState(this->mnew_, this->dnew_, &this->opt, &this->scnstate_); } // set window title to model name diff --git a/src/engine/engine_vis_state.c b/src/engine/engine_vis_state.c index 2e0d62e9..0e980b5b 100644 --- a/src/engine/engine_vis_state.c +++ b/src/engine/engine_vis_state.c @@ -227,7 +227,8 @@ int mjv_updateSceneFromState(const mjvSceneState* scnstate, const mjvOption* opt // update a scene state from model and data -void mjv_updateSceneState(const mjModel* m, mjData* d, mjvSceneState* scnstate) { +void mjv_updateSceneState(const mjModel* m, mjData* d, const mjvOption* opt, + mjvSceneState* scnstate) { // Check that mjModel sizes haven't changed. #define X(var) #define XMJV(var) \ @@ -250,7 +251,7 @@ void mjv_updateSceneState(const mjModel* m, mjData* d, mjvSceneState* scnstate) mju_error("invalid plugin slot: %d", slot); } if (plugin->visualize) { - plugin->visualize(m, d, &scnstate->plugincache, i); + plugin->visualize(m, d, opt, &scnstate->plugincache, i); } } } diff --git a/src/engine/engine_vis_state.h b/src/engine/engine_vis_state.h index 61e7cddb..7e1abfbe 100644 --- a/src/engine/engine_vis_state.h +++ b/src/engine/engine_vis_state.h @@ -43,7 +43,8 @@ MJAPI int mjv_updateSceneFromState(const mjvSceneState* scnstate, const mjvOptio mjvScene* scn); // update a scene state from model and data -MJAPI void mjv_updateSceneState(const mjModel* m, mjData* d, mjvSceneState* scnstate); +MJAPI void mjv_updateSceneState(const mjModel* m, mjData* d, const mjvOption* opt, + mjvSceneState* scnstate); // move camera with mouse given a scene state; action is mjtMouse MJAPI void mjv_moveCameraFromState(const mjvSceneState* scnstate, int action, diff --git a/src/engine/engine_vis_visualize.c b/src/engine/engine_vis_visualize.c index a1ce9082..97f402ee 100644 --- a/src/engine/engine_vis_visualize.c +++ b/src/engine/engine_vis_visualize.c @@ -2071,7 +2071,7 @@ void mjv_updateScene(const mjModel* m, mjData* d, const mjvOption* opt, mju_error("invalid plugin slot: %d", slot); } if (plugin->visualize) { - plugin->visualize(m, d, scn, i); + plugin->visualize(m, d, opt, scn, i); } } } diff --git a/test/engine/engine_vis_state_test.cc b/test/engine/engine_vis_state_test.cc index a1b4f182..04b87d6a 100644 --- a/test/engine/engine_vis_state_test.cc +++ b/test/engine/engine_vis_state_test.cc @@ -67,7 +67,7 @@ TEST_F(MjvSceneStateTest, CanUpdateFromState) { mjvSceneState scnstate; mjv_defaultSceneState(&scnstate); mjv_makeSceneState(model, data, &scnstate, kMaxGeom); - mjv_updateSceneState(model, data, &scnstate); + mjv_updateSceneState(model, data, &opt, &scnstate); mjvScene scn2; mjv_defaultScene(&scn2); diff --git a/unity/Runtime/Bindings/MjBindings.cs b/unity/Runtime/Bindings/MjBindings.cs index 03eec554..c593562f 100644 --- a/unity/Runtime/Bindings/MjBindings.cs +++ b/unity/Runtime/Bindings/MjBindings.cs @@ -3389,7 +3389,7 @@ public static unsafe extern void mjv_makeSceneState(mjModel_* m, mjData_* d, mjv public static unsafe extern void mjv_freeSceneState(mjvSceneState_* scnstate); [DllImport("mujoco", CallingConvention = CallingConvention.Cdecl)] -public static unsafe extern void mjv_updateSceneState(mjModel_* m, mjData_* d, mjvSceneState_* scnstate); +public static unsafe extern void mjv_updateSceneState(mjModel_* m, mjData_* d, mjvOption_* opt, mjvSceneState_* scnstate); [DllImport("mujoco", CallingConvention = CallingConvention.Cdecl)] public static unsafe extern void mjv_addGeoms(mjModel_* m, mjData_* d, mjvOption_* opt, mjvPerturb_* pert, int catmask, mjvScene_* scn);