Add flag for depth rendering.

PiperOrigin-RevId: 846203691
Change-Id: I5ec494446bcfc1f7c81536a87dd24f9967973563
This commit is contained in:
Haroon Qureshi
2025-12-18 04:35:28 -08:00
committed by Copybara-Service
parent 47e35e632f
commit 7190bd4912
11 changed files with 76 additions and 17 deletions
+1
View File
@@ -12,6 +12,7 @@ General
- The type of the ``sig`` (signature) argument of :ref:`mj_stateSize` and related functions has been changed from - The type of the ``sig`` (signature) argument of :ref:`mj_stateSize` and related functions has been changed from
``unsigned int`` to ``int``. Before this change, invalid negative arguments passed to this function would result in ``unsigned int`` to ``int``. Before this change, invalid negative arguments passed to this function would result in
a silent implicit cast, now negativity will trigger an error. a silent implicit cast, now negativity will trigger an error.
- Added a :ref:`depth<mjtRndFlag>` rendering flag
MJX MJX
^^^ ^^^
+1
View File
@@ -2829,6 +2829,7 @@ typedef enum mjtRndFlag_ { // flags enabling rendering effects
mjRND_SKYBOX, // skybox mjRND_SKYBOX, // skybox
mjRND_FOG, // fog mjRND_FOG, // fog
mjRND_HAZE, // haze mjRND_HAZE, // haze
mjRND_DEPTH, // depth
mjRND_SEGMENT, // segmentation with random color mjRND_SEGMENT, // segmentation with random color
mjRND_IDCOLOR, // segmentation with segid+1 color mjRND_IDCOLOR, // segmentation with segid+1 color
mjRND_CULL_FACE, // cull backward faces mjRND_CULL_FACE, // cull backward faces
+1
View File
@@ -146,6 +146,7 @@ typedef enum mjtRndFlag_ { // flags enabling rendering effects
mjRND_SKYBOX, // skybox mjRND_SKYBOX, // skybox
mjRND_FOG, // fog mjRND_FOG, // fog
mjRND_HAZE, // haze mjRND_HAZE, // haze
mjRND_DEPTH, // depth
mjRND_SEGMENT, // segmentation with random color mjRND_SEGMENT, // segmentation with random color
mjRND_IDCOLOR, // segmentation with segid+1 color mjRND_IDCOLOR, // segmentation with segid+1 color
mjRND_CULL_FACE, // cull backward faces mjRND_CULL_FACE, // cull backward faces
+5 -4
View File
@@ -814,10 +814,11 @@ ENUMS: Mapping[str, EnumDecl] = dict([
('mjRND_SKYBOX', 4), ('mjRND_SKYBOX', 4),
('mjRND_FOG', 5), ('mjRND_FOG', 5),
('mjRND_HAZE', 6), ('mjRND_HAZE', 6),
('mjRND_SEGMENT', 7), ('mjRND_DEPTH', 7),
('mjRND_IDCOLOR', 8), ('mjRND_SEGMENT', 8),
('mjRND_CULL_FACE', 9), ('mjRND_IDCOLOR', 9),
('mjNRNDFLAG', 10), ('mjRND_CULL_FACE', 10),
('mjNRNDFLAG', 11),
]), ]),
)), )),
('mjtStereo', ('mjtStereo',
+1 -1
View File
@@ -10169,7 +10169,7 @@ STRUCTS: Mapping[str, StructDecl] = dict([
name='flags', name='flags',
type=ArrayType( type=ArrayType(
inner_type=ValueType(name='mjtByte'), inner_type=ValueType(name='mjtByte'),
extents=(10,), extents=(11,),
), ),
doc='rendering flags (indexed by mjtRndFlag)', doc='rendering flags (indexed by mjtRndFlag)',
), ),
+1
View File
@@ -111,6 +111,7 @@ const char* mjRNDSTRING[mjNRNDFLAG][3] = {
{"Skybox", "1", "K"}, {"Skybox", "1", "K"},
{"Fog", "0", "G"}, {"Fog", "0", "G"},
{"Haze", "1", "/"}, {"Haze", "1", "/"},
{"Depth", "0", ""},
{"Segment", "0", ","}, {"Segment", "0", ","},
{"Id Color", "0", ""}, {"Id Color", "0", ""},
{"Cull Face", "1", ""} {"Cull Face", "1", ""}
@@ -154,9 +154,13 @@ void FilamentContext::Render(const mjrRect& viewport, const mjvScene* scene,
render_gui_ = gui_view_->PrepareRenderable(); render_gui_ = gui_view_->PrepareRenderable();
} }
last_render_mode_ = scene->flags[mjRND_SEGMENT] last_render_mode_ = SceneView::DrawMode::kNormal;
? SceneView::DrawMode::kSegmentation if (scene->flags[mjRND_SEGMENT]) {
: SceneView::DrawMode::kNormal; last_render_mode_ = SceneView::DrawMode::kSegmentation;
} else if (scene->flags[mjRND_DEPTH]) {
last_render_mode_ = SceneView::DrawMode::kDepth;
}
// Render the frame if we're not rendering to a texture. // Render the frame if we're not rendering to a texture.
if (!render_to_texture_) { if (!render_to_texture_) {
filament::View* view = scene_view_->PrepareRenderView(last_render_mode_); filament::View* view = scene_view_->PrepareRenderView(last_render_mode_);
+49 -1
View File
@@ -1019,7 +1019,7 @@ void mjr_render(mjrRect viewport, mjvScene* scn, const mjrContext* con) {
//---------------------------------- reflection rendering //---------------------------------- reflection rendering
// plane and box reflection rendering // plane and box reflection rendering
if (scn->flags[mjRND_REFLECTION]) { if (scn->flags[mjRND_REFLECTION] && !scn->flags[mjRND_DEPTH]) {
for (int i=0; i < ngeom; i++) { for (int i=0; i < ngeom; i++) {
// get geom pointer // get geom pointer
thisgeom = scn->geoms + i; thisgeom = scn->geoms + i;
@@ -1481,6 +1481,54 @@ void mjr_render(mjrRect viewport, mjvScene* scn, const mjrContext* con) {
glDisable(GL_SCISSOR_TEST); glDisable(GL_SCISSOR_TEST);
} }
if (scn->flags[mjRND_DEPTH]) {
glPushAttrib(GL_ENABLE_BIT | GL_TRANSFORM_BIT | GL_TEXTURE_BIT |
GL_LIGHTING_BIT | GL_POLYGON_BIT);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, 1, 0, 1, -1, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
void* depth_buf = mju_malloc(sizeof(float) * viewport.width * viewport.height);
glReadPixels(0, 0, viewport.width, viewport.height, GL_DEPTH_COMPONENT, GL_FLOAT, depth_buf);
GLuint depth_tex;
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &depth_tex);
glBindTexture(GL_TEXTURE_2D, depth_tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, viewport.width, viewport.height,
0, GL_LUMINANCE, GL_FLOAT, depth_buf);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glColor4f(1, 1, 1, 1);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(0, 0);
glTexCoord2f(1, 0); glVertex2f(1, 0);
glTexCoord2f(1, 1); glVertex2f(1, 1);
glTexCoord2f(0, 1); glVertex2f(0, 1);
glEnd();
glDeleteTextures(1, &depth_tex);
mju_free(depth_buf);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glPopAttrib();
}
// restore currentBuffer // restore currentBuffer
mjr_restoreBuffer(con); mjr_restoreBuffer(con);
} }
+6 -5
View File
@@ -678,10 +678,11 @@ public enum mjtRndFlag : int{
mjRND_SKYBOX = 4, mjRND_SKYBOX = 4,
mjRND_FOG = 5, mjRND_FOG = 5,
mjRND_HAZE = 6, mjRND_HAZE = 6,
mjRND_SEGMENT = 7, mjRND_DEPTH = 7,
mjRND_IDCOLOR = 8, mjRND_SEGMENT = 8,
mjRND_CULL_FACE = 9, mjRND_IDCOLOR = 9,
mjNRNDFLAG = 10, mjRND_CULL_FACE = 10,
mjNRNDFLAG = 11,
} }
public enum mjtStereo : int{ public enum mjtStereo : int{
mjSTEREO_NONE = 0, mjSTEREO_NONE = 0,
@@ -6315,7 +6316,7 @@ public unsafe struct mjvScene_ {
public fixed float rotate[4]; public fixed float rotate[4];
public float scale; public float scale;
public int stereo; public int stereo;
public fixed byte flags[10]; public fixed byte flags[11];
public int framewidth; public int framewidth;
public fixed float framergb[3]; public fixed float framergb[3];
public int status; public int status;
+2 -1
View File
@@ -7523,7 +7523,7 @@ struct MjvScene {
// skinvertadr field is handled manually in template file struct declaration // skinvertadr field is handled manually in template file struct declaration
// skinvertnum field is handled manually in template file struct declaration // skinvertnum field is handled manually in template file struct declaration
emscripten::val flags() const { emscripten::val flags() const {
return emscripten::val(emscripten::typed_memory_view(10, ptr_->flags)); return emscripten::val(emscripten::typed_memory_view(11, ptr_->flags));
} }
emscripten::val framergb() const { emscripten::val framergb() const {
return emscripten::val(emscripten::typed_memory_view(3, ptr_->framergb)); return emscripten::val(emscripten::typed_memory_view(3, ptr_->framergb));
@@ -10511,6 +10511,7 @@ EMSCRIPTEN_BINDINGS(mujoco_bindings) {
.value("mjRND_SKYBOX", mjRND_SKYBOX) .value("mjRND_SKYBOX", mjRND_SKYBOX)
.value("mjRND_FOG", mjRND_FOG) .value("mjRND_FOG", mjRND_FOG)
.value("mjRND_HAZE", mjRND_HAZE) .value("mjRND_HAZE", mjRND_HAZE)
.value("mjRND_DEPTH", mjRND_DEPTH)
.value("mjRND_SEGMENT", mjRND_SEGMENT) .value("mjRND_SEGMENT", mjRND_SEGMENT)
.value("mjRND_IDCOLOR", mjRND_IDCOLOR) .value("mjRND_IDCOLOR", mjRND_IDCOLOR)
.value("mjRND_CULL_FACE", mjRND_CULL_FACE) .value("mjRND_CULL_FACE", mjRND_CULL_FACE)
+2 -2
View File
@@ -692,8 +692,8 @@ describe('MuJoCo WASM Bindings', () => {
expect(mujoco.get_mjRNDSTRING()).toEqual([ expect(mujoco.get_mjRNDSTRING()).toEqual([
['Shadow', '1', 'S'], ['Wireframe', '0', 'W'], ['Reflection', '1', 'R'], ['Shadow', '1', 'S'], ['Wireframe', '0', 'W'], ['Reflection', '1', 'R'],
['Additive', '0', 'L'], ['Skybox', '1', 'K'], ['Fog', '0', 'G'], ['Additive', '0', 'L'], ['Skybox', '1', 'K'], ['Fog', '0', 'G'],
['Haze', '1', '/'], ['Segment', '0', ','], ['Id Color', '0', ''], ['Haze', '1', '/'], ['Depth', '0', ''], ['Segment', '0', ','],
['Cull Face', '1', ''] ['Id Color', '0', ''], ['Cull Face', '1', '']
]); ]);
expect(mujoco.get_mjFRAMESTRING().length) expect(mujoco.get_mjFRAMESTRING().length)
.toEqual(mujoco.mjtFrame.mjNFRAME.value); .toEqual(mujoco.mjtFrame.mjNFRAME.value);