From 1a47a97040cd46babfacf5d336a423598c9d54b7 Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Wed, 25 Oct 2023 09:07:22 -0700 Subject: [PATCH] Disable shadows for geoms of category `mjCAT_DECOR`. Fixes #1114. Added `frustum` to `rgba` and `scale` in the `visual` section. PiperOrigin-RevId: 576547599 Change-Id: I69bf528680e3d4a59d6e04f6db99a6d345001d1d --- doc/XMLreference.rst | 10 ++++++++++ doc/XMLschema.rst | 4 +++- doc/includes/references.h | 2 ++ include/mujoco/mjmodel.h | 2 ++ introspect/structs.py | 13 +++++++++++++ python/mujoco/structs.cc | 8 ++++++-- python/mujoco/structs.h | 1 + src/engine/engine_io.c | 2 ++ src/engine/engine_vis_visualize.c | 14 ++++++++------ src/render/render_gl3.c | 4 ++-- src/xml/xml_native_reader.cc | 10 ++++++---- src/xml/xml_native_writer.cc | 2 ++ test/engine/testdata/vis_visualize/frustum.xml | 2 ++ unity/Runtime/Bindings/MjBindings.cs | 2 ++ 14 files changed, 61 insertions(+), 15 deletions(-) diff --git a/doc/XMLreference.rst b/doc/XMLreference.rst index ac95fdbf..ef72df1f 100644 --- a/doc/XMLreference.rst +++ b/doc/XMLreference.rst @@ -920,6 +920,11 @@ documented below. The radius of the capsules used to render slider-crank mechanisms. The second part of the mechanism is automatically scaled relative to this setting. +.. _visual-scale-frustum: + +:at:`frustum`: :at-val:`real, "10"` + The distance of the zfar plane from the camera pinhole for rendering the frustum. + .. _visual-rgba: @@ -1046,6 +1051,11 @@ disables the rendering of the corresponding object. Color used to render the crank of slide-crank mechanisms, in model configurations where the specified rod length cannot be maintained, i.e., it is "broken". +.. _visual-rgba-frustum: + +:at:`frustum`: :at-val:`real(4), "1 1 0 0.2"` + Color used to render the camera frustum. + .. _asset: diff --git a/doc/XMLschema.rst b/doc/XMLschema.rst index 149ebc74..04b6dbd8 100644 --- a/doc/XMLschema.rst +++ b/doc/XMLschema.rst @@ -109,6 +109,8 @@ | | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ | | | | | :ref:`framelength` | :ref:`framewidth` | :ref:`constraint` | :ref:`slidercrank` | | | | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ | +| | | | :ref:`frustum` | | | | | +| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ | +------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | |_| visual |br| |_| |L| | | .. table:: | | :ref:`rgba | ? | :class: mjcf-attributes | @@ -124,7 +126,7 @@ | | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ | | | | | :ref:`contacttorque` | :ref:`contactgap` | :ref:`rangefinder` | :ref:`constraint` | | | | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ | -| | | | :ref:`slidercrank` | :ref:`crankbroken` | | | | +| | | | :ref:`slidercrank` | :ref:`crankbroken` | :ref:`frustum` | | | | | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ | +------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | mujoco |br| |L| | | *no attributes* | diff --git a/doc/includes/references.h b/doc/includes/references.h index dd8a5448..fd0ad34d 100644 --- a/doc/includes/references.h +++ b/doc/includes/references.h @@ -800,6 +800,7 @@ struct mjVisual_ { // visualization options float framewidth; // bodyframe axis width float constraint; // constraint width float slidercrank; // slidercrank width + float frustum; // frustum zfar plane } scale; struct { // color of decor elements @@ -825,6 +826,7 @@ struct mjVisual_ { // visualization options float constraint[4]; // constraint float slidercrank[4]; // slidercrank float crankbroken[4]; // used when crank must be stretched/broken + float frustum[4]; // camera frustum } rgba; }; typedef struct mjVisual_ mjVisual; diff --git a/include/mujoco/mjmodel.h b/include/mujoco/mjmodel.h index a781f7fa..fafe7a36 100644 --- a/include/mujoco/mjmodel.h +++ b/include/mujoco/mjmodel.h @@ -505,6 +505,7 @@ struct mjVisual_ { // visualization options float framewidth; // bodyframe axis width float constraint; // constraint width float slidercrank; // slidercrank width + float frustum; // frustum zfar plane } scale; struct { // color of decor elements @@ -530,6 +531,7 @@ struct mjVisual_ { // visualization options float constraint[4]; // constraint float slidercrank[4]; // slidercrank float crankbroken[4]; // used when crank must be stretched/broken + float frustum[4]; // camera frustum } rgba; }; typedef struct mjVisual_ mjVisual; diff --git a/introspect/structs.py b/introspect/structs.py index a4b7c414..848d8e23 100644 --- a/introspect/structs.py +++ b/introspect/structs.py @@ -578,6 +578,11 @@ STRUCTS: Mapping[str, StructDecl] = dict([ type=ValueType(name='float'), doc='slidercrank width', ), + StructFieldDecl( + name='frustum', + type=ValueType(name='float'), + doc='frustum zfar plane', + ), ), ), doc='', @@ -762,6 +767,14 @@ STRUCTS: Mapping[str, StructDecl] = dict([ ), doc='used when crank must be stretched/broken', ), + StructFieldDecl( + name='frustum', + type=ArrayType( + inner_type=ValueType(name='float'), + extents=(4,), + ), + doc='camera frustum', + ), ), ), doc='', diff --git a/python/mujoco/structs.cc b/python/mujoco/structs.cc index 436ba53f..deb1ba88 100644 --- a/python/mujoco/structs.cc +++ b/python/mujoco/structs.cc @@ -147,7 +147,8 @@ MjVisualRgbaWrapper::MjWrapper() X(rangefinder), X(constraint), X(slidercrank), - X(crankbroken) {} + X(crankbroken), + X(frustum) {} MjVisualRgbaWrapper::MjWrapper(raw::MjVisualRgba* ptr, py::handle owner) : WrapperBase(ptr, owner), @@ -172,7 +173,8 @@ MjVisualRgbaWrapper::MjWrapper(raw::MjVisualRgba* ptr, py::handle owner) X(rangefinder), X(constraint), X(slidercrank), - X(crankbroken) {} + X(crankbroken), + X(frustum) {} #undef X MjVisualRgbaWrapper::MjWrapper(const MjVisualRgbaWrapper& other) @@ -1488,6 +1490,7 @@ PYBIND11_MODULE(_structs, m) { X(framewidth); X(constraint); X(slidercrank); + X(frustum); #undef X py::class_ mjVisualRgba(mjVisual, "Rgba"); @@ -1522,6 +1525,7 @@ PYBIND11_MODULE(_structs, m) { X(constraint); X(slidercrank); X(crankbroken); + X(frustum); #undef X #define X(var) \ diff --git a/python/mujoco/structs.h b/python/mujoco/structs.h index bb581e9b..291dc96b 100644 --- a/python/mujoco/structs.h +++ b/python/mujoco/structs.h @@ -232,6 +232,7 @@ class MjWrapper : public WrapperBase { X(constraint); X(slidercrank); X(crankbroken); + X(frustum); #undef X }; diff --git a/src/engine/engine_io.c b/src/engine/engine_io.c index 6c0c3198..7a3f7fee 100644 --- a/src/engine/engine_io.c +++ b/src/engine/engine_io.c @@ -245,6 +245,7 @@ void mj_defaultVisual(mjVisual* vis) { vis->scale.framewidth = 0.1; vis->scale.constraint = 0.1; vis->scale.slidercrank = 0.2; + vis->scale.frustum = 10.0; // colors setf4(vis->rgba.fog, 0., 0., 0., 1.); @@ -269,6 +270,7 @@ void mj_defaultVisual(mjVisual* vis) { setf4(vis->rgba.constraint, .9, .0, .0, 1.); setf4(vis->rgba.slidercrank, .5, .3, .8, 1.); setf4(vis->rgba.crankbroken, .9, .0, .0, 1.); + setf4(vis->rgba.frustum, 1., 1., .0, .2); } diff --git a/src/engine/engine_vis_visualize.c b/src/engine/engine_vis_visualize.c index f86f92ed..48e04d67 100644 --- a/src/engine/engine_vis_visualize.c +++ b/src/engine/engine_vis_visualize.c @@ -1407,7 +1407,7 @@ void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* vopt, FINISH // set type and category: frame - objtype = mjOBJ_UNKNOWN; + objtype = mjOBJ_UNKNOWN; category = mjCAT_DECOR; if (!(category & catmask) || vopt->frame != mjFRAME_GEOM) { continue; @@ -1483,7 +1483,7 @@ void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* vopt, FINISH // set category for site frame - category = mjCAT_DECOR; + category = mjCAT_DECOR; if (!(category & catmask) || vopt->frame != mjFRAME_SITE) { continue; } @@ -1563,7 +1563,7 @@ void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* vopt, FINISH // set category for camera frame - category = mjCAT_DECOR; + category = mjCAT_DECOR; if (!(category & catmask) || vopt->frame != mjFRAME_CAMERA) { continue; } @@ -1600,11 +1600,13 @@ void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* vopt, // camera frustum if (vopt->flags[mjVIS_CAMERA]) { - float rgba[] = {1, 1, 0, .2}; + objtype = mjOBJ_CAMERA; + category = mjCAT_DECOR; + const float* rgba = m->vis.rgba.frustum; mjtNum vnear[4][3], vfar[4][3]; mjtNum center[3]; mjtNum znear = m->vis.map.znear * m->stat.extent; - mjtNum zfar = m->vis.map.zfar * m->stat.extent; + mjtNum zfar = m->vis.scale.frustum * scl; float zver[2], zhor[2]; for (int i=0; i < m->ncam; i++) { if (m->cam_sensorsize[2*i+1] == 0) { @@ -1710,7 +1712,7 @@ void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* vopt, FINISH // set category for light frame - category = mjCAT_DECOR; + category = mjCAT_DECOR; if (!(category & catmask) || vopt->frame != mjFRAME_LIGHT) { continue; } diff --git a/src/render/render_gl3.c b/src/render/render_gl3.c index abe2a8f5..ea75d05a 100644 --- a/src/render/render_gl3.c +++ b/src/render/render_gl3.c @@ -215,8 +215,8 @@ static void renderGeom(const mjvGeom* geom, int mode, const float* headpos, float rgba[4] = {geom->rgba[0], geom->rgba[1], geom->rgba[2], geom->rgba[3]}; int behind, whichface, lighting; - // lines to do not cast shadows - if (mode == mjrRND_SHADOWCAST && geom->type == mjGEOM_LINE) { + // lines and triangles do not cast shadows + if (mode == mjrRND_SHADOWCAST && (geom->type == mjGEOM_LINE || geom->category == mjCAT_DECOR)) { return; } diff --git a/src/xml/xml_native_reader.cc b/src/xml/xml_native_reader.cc index 4b927369..648197ea 100644 --- a/src/xml/xml_native_reader.cc +++ b/src/xml/xml_native_reader.cc @@ -121,14 +121,14 @@ static const char* MJCF[nMJCF][mjXATTRNUM] = { {"map", "?", "13", "stiffness", "stiffnessrot", "force", "torque", "alpha", "fogstart", "fogend", "znear", "zfar", "haze", "shadowclip", "shadowscale", "actuatortendon"}, - {"scale", "?", "16", "forcewidth", "contactwidth", "contactheight", "connect", "com", + {"scale", "?", "17", "forcewidth", "contactwidth", "contactheight", "connect", "com", "camera", "light", "selectpoint", "jointlength", "jointwidth", "actuatorlength", - "actuatorwidth", "framelength", "framewidth", "constraint", "slidercrank"}, - {"rgba", "?", "22", "fog", "haze", "force", "inertia", "joint", + "actuatorwidth", "framelength", "framewidth", "constraint", "slidercrank", "frustum"}, + {"rgba", "?", "23", "fog", "haze", "force", "inertia", "joint", "actuator", "actuatornegative", "actuatorpositive", "com", "camera", "light", "selectpoint", "connect", "contactpoint", "contactforce", "contactfriction", "contacttorque", "contactgap", "rangefinder", - "constraint", "slidercrank", "crankbroken"}, + "constraint", "slidercrank", "crankbroken", "frustum"}, {">"}, {"statistic", "*", "5", "meaninertia", "meanmass", "meansize", "extent", "center"}, @@ -2765,6 +2765,7 @@ void mjXReader::Visual(XMLElement* section) { ReadAttr(elem, "framewidth", 1, &vis->scale.framewidth, text); ReadAttr(elem, "constraint", 1, &vis->scale.constraint, text); ReadAttr(elem, "slidercrank", 1, &vis->scale.slidercrank, text); + ReadAttr(elem, "frustum", 1, &vis->scale.frustum, text); } // rgba sub-element @@ -2791,6 +2792,7 @@ void mjXReader::Visual(XMLElement* section) { ReadAttr(elem, "constraint", 4, vis->rgba.constraint, text); ReadAttr(elem, "slidercrank", 4, vis->rgba.slidercrank, text); ReadAttr(elem, "crankbroken", 4, vis->rgba.crankbroken, text); + ReadAttr(elem, "frustum", 4, vis->rgba.frustum, text); } // advance to next element diff --git a/src/xml/xml_native_writer.cc b/src/xml/xml_native_writer.cc index 13de9be0..ef3f8e3a 100644 --- a/src/xml/xml_native_writer.cc +++ b/src/xml/xml_native_writer.cc @@ -1082,6 +1082,7 @@ void mjXWriter::Visual(XMLElement* root) { WriteAttr(elem, "framewidth", 1, &vis->scale.framewidth, &visdef.scale.framewidth); WriteAttr(elem, "constraint", 1, &vis->scale.constraint, &visdef.scale.constraint); WriteAttr(elem, "slidercrank", 1, &vis->scale.slidercrank, &visdef.scale.slidercrank); + WriteAttr(elem, "frustum", 1, &vis->scale.frustum, &visdef.scale.frustum); if (!elem->FirstAttribute()) { section->DeleteChild(elem); } @@ -1110,6 +1111,7 @@ void mjXWriter::Visual(XMLElement* root) { WriteAttr(elem, "constraint", 4, vis->rgba.constraint, visdef.rgba.constraint); WriteAttr(elem, "slidercrank", 4, vis->rgba.slidercrank, visdef.rgba.slidercrank); WriteAttr(elem, "crankbroken", 4, vis->rgba.crankbroken, visdef.rgba.crankbroken); + WriteAttr(elem, "frustum", 4, vis->rgba.frustum, visdef.rgba.frustum); if (!elem->FirstAttribute()) { section->DeleteChild(elem); } diff --git a/test/engine/testdata/vis_visualize/frustum.xml b/test/engine/testdata/vis_visualize/frustum.xml index 17e50555..47c66253 100644 --- a/test/engine/testdata/vis_visualize/frustum.xml +++ b/test/engine/testdata/vis_visualize/frustum.xml @@ -4,6 +4,8 @@ + + diff --git a/unity/Runtime/Bindings/MjBindings.cs b/unity/Runtime/Bindings/MjBindings.cs index a4ad4f93..d51b2403 100644 --- a/unity/Runtime/Bindings/MjBindings.cs +++ b/unity/Runtime/Bindings/MjBindings.cs @@ -5038,6 +5038,7 @@ public unsafe struct scale { public float framewidth; public float constraint; public float slidercrank; + public float frustum; } [StructLayout(LayoutKind.Sequential)] @@ -5064,6 +5065,7 @@ public unsafe struct rgba { public fixed float constraint[4]; public fixed float slidercrank[4]; public fixed float crankbroken[4]; + public fixed float frustum[4]; } [StructLayout(LayoutKind.Sequential)]