Skip to content

Commit 0a5b75f

Browse files
duburcqaKashu7100
authored andcommitted
Do not consider markers as physical objects for rendering. (Genesis-Embodied-AI#1494)
1 parent fd243ca commit 0a5b75f

File tree

10 files changed

+107
-320
lines changed

10 files changed

+107
-320
lines changed

examples/rigid/single_franka_envs.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ def main():
2020
########################## create a scene ##########################
2121
scene = gs.Scene(
2222
vis_options=gs.options.VisOptions(
23-
plane_reflection=False,
23+
plane_reflection=True,
2424
rendered_envs_idx=list(range(args.num_env)),
2525
env_separate_rigid=args.sep,
26-
show_world_frame=False,
27-
show_link_frame=False,
26+
show_world_frame=True,
27+
show_link_frame=True,
2828
),
2929
viewer_options=gs.options.ViewerOptions(
3030
camera_pos=(3.5, 0.0, 2.5),

genesis/ext/pyrender/interaction/viewer_interaction_base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55

66
EVENT_HANDLE_STATE = Union[Literal[True], None]
7-
EVENT_HANDLED = True
7+
EVENT_HANDLED: Literal[True] = True
88

99
# Note: Viewer window is based on pyglet.window.Window, mouse events are defined in pyglet.window.BaseWindow
1010

genesis/ext/pyrender/jit_render.py

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ def load_const(const_name):
5757
RenderFlags_SHADOWS_DIRECTIONAL = RenderFlags.SHADOWS_DIRECTIONAL
5858
RenderFlags_SHADOWS_POINT = RenderFlags.SHADOWS_POINT
5959
RenderFlags_SKIP_FLOOR = RenderFlags.SKIP_FLOOR
60+
RenderFlags_OFFSCREEN = RenderFlags.OFFSCREEN
6061
RenderFlags_REFLECTIVE_FLOOR = RenderFlags.REFLECTIVE_FLOOR
6162
RenderFlags_FLAT = RenderFlags.FLAT
6263

@@ -289,8 +290,8 @@ def set_primitive(self, scene, node_list, primitive_list):
289290
self.pbr_mat = np.zeros((n, 9), np.float32) # base_color <- 4, metallic <- 1, roughness <- 1, emissive <- 3
290291
self.spec_mat = np.zeros((n, 11), np.float32) # diffuse <- 4, specular <- 3, glossiness <- 1, emissive <- 3
291292
self.render_flags = np.zeros(
292-
(n, 7), np.int8
293-
) # (blend, wireframe, double sided, pbr texture, reflective floor, transparent, env shared)
293+
(n, 8), np.int8
294+
) # (blend, wireframe, double sided, pbr texture, reflective floor, transparent, marker, env shared)
294295
self.mode = np.zeros(n, np.int32)
295296
self.n_instances = np.zeros(n, np.int32)
296297
self.n_indices = np.zeros(n, np.int32) # positive: indices, negative: positions
@@ -336,7 +337,8 @@ def set_primitive(self, scene, node_list, primitive_list):
336337
self.render_flags[i, 3] = isinstance(material, MetallicRoughnessMaterial)
337338
self.render_flags[i, 4] = primitive.is_floor and not floor_existed
338339
self.render_flags[i, 5] = node_list[i].mesh.is_transparent
339-
self.render_flags[i, 6] = primitive.env_shared
340+
self.render_flags[i, 6] = node_list[i].mesh.is_marker
341+
self.render_flags[i, 7] = primitive.env_shared
340342

341343
if primitive.is_floor:
342344
floor_existed = True
@@ -414,19 +416,25 @@ def forward_pass(
414416
env_idx,
415417
gl,
416418
):
419+
is_rgba = not (flags & RenderFlags_DEPTH_ONLY or flags & RenderFlags_SEG)
420+
417421
det_reflection = np.linalg.det(reflection_mat)
418422
last_pid = -1
419423
lighting_texture = 0
420424
solid_idx = [i for i in range(len(vao_id)) if not render_flags[i, 5]]
421425
trans_idx = [i for i in range(len(vao_id)) if render_flags[i, 5]]
422426
idx = solid_idx + trans_idx
423427
for id in idx:
424-
if render_flags[id, 4] and (flags & RenderFlags_SKIP_FLOOR):
428+
# Only render markers on the main graphical window, while skipping plane-reflection
429+
if ((render_flags[id, 4] or render_flags[id, 6]) and flags & RenderFlags_SKIP_FLOOR) or (
430+
render_flags[id, 6] and (not is_rgba or flags & RenderFlags_OFFSCREEN)
431+
):
425432
continue
433+
426434
pid = program_id[id]
427435
if pid != last_pid:
428436
gl.glUseProgram(pid)
429-
if not (flags & RenderFlags_DEPTH_ONLY or flags & RenderFlags_SEG or flags & RenderFlags_FLAT):
437+
if is_rgba and not flags & RenderFlags_FLAT:
430438
lighting_texture = bind_lighting(pid, flags, light, shadow_map, light_matrix, ambient_light, gl)
431439
set_uniform_3fv(pid, "cam_pos", cam_pos, gl)
432440
set_uniform_matrix_4fv(pid, "reflection_mat", reflection_mat, gl)
@@ -438,21 +446,22 @@ def forward_pass(
438446

439447
active_texture = lighting_texture
440448

441-
if render_flags[id, 4] and (flags & RenderFlags_REFLECTIVE_FLOOR):
442-
gl.glActiveTexture(GL_TEXTURE0 + active_texture)
443-
gl.glBindTexture(GL_TEXTURE_2D, floor_tex)
444-
set_uniform_1i(pid, "floor_tex", active_texture, gl)
445-
set_uniform_1i(pid, "floor_flag", 1, gl)
446-
set_uniform_2f(pid, "screen_size", screen_size[0], screen_size[1], gl)
447-
active_texture += 1
448-
elif flags & RenderFlags_REFLECTIVE_FLOOR:
449-
set_uniform_1i(pid, "floor_tex", 0, gl)
450-
set_uniform_1i(pid, "floor_flag", 0, gl)
449+
if flags & RenderFlags_REFLECTIVE_FLOOR:
450+
if render_flags[id, 4]:
451+
gl.glActiveTexture(GL_TEXTURE0 + active_texture)
452+
gl.glBindTexture(GL_TEXTURE_2D, floor_tex)
453+
set_uniform_1i(pid, "floor_tex", active_texture, gl)
454+
set_uniform_1i(pid, "floor_flag", 1, gl)
455+
set_uniform_2f(pid, "screen_size", screen_size[0], screen_size[1], gl)
456+
active_texture += 1
457+
else:
458+
set_uniform_1i(pid, "floor_tex", 0, gl)
459+
set_uniform_1i(pid, "floor_flag", 0, gl)
451460

452461
set_uniform_matrix_4fv(pid, "M", pose[id], gl)
453462
gl.glBindVertexArray(vao_id[id])
454463

455-
if not (flags & RenderFlags_DEPTH_ONLY or flags & RenderFlags_SEG or flags & RenderFlags_FLAT):
464+
if is_rgba and not flags & RenderFlags_FLAT:
456465
tf = textures[id, 0]
457466
texture_list = [
458467
"normal_texture",
@@ -492,7 +501,7 @@ def forward_pass(
492501
wf = render_flags[id, 1]
493502
if flags & RenderFlags_FLIP_WIREFRAME:
494503
wf = not wf
495-
if (flags & RenderFlags_ALL_WIREFRAME) or wf:
504+
if wf or flags & RenderFlags_ALL_WIREFRAME:
496505
gl.glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
497506
else:
498507
gl.glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
@@ -516,7 +525,7 @@ def forward_pass(
516525
continue
517526
set_uniform_3fv(pid, "color", color_list[id], gl)
518527

519-
if render_flags[id, 6] or env_idx == -1:
528+
if render_flags[id, 7] or env_idx == -1:
520529
if n_indices[id] > 0:
521530
gl.glDrawElementsInstanced(
522531
mode[id], n_indices[id], GL_UNSIGNED_INT, address_to_ptr(0), n_instances[id]
@@ -558,8 +567,10 @@ def shadow_mapping_pass(
558567
):
559568
last_pid = -1
560569
for id in range(len(vao_id)):
561-
if render_flags[id, 5]:
570+
# Do not render shadows for markers and transparent objects
571+
if render_flags[id, 5] or render_flags[id, 6]:
562572
continue
573+
563574
pid = program_id[id]
564575
if pid != last_pid:
565576
gl.glUseProgram(pid)
@@ -579,7 +590,7 @@ def shadow_mapping_pass(
579590

580591
gl.glDisable(GL_PROGRAM_POINT_SIZE)
581592

582-
if render_flags[id, 6] or env_idx == -1:
593+
if render_flags[id, 7] or env_idx == -1:
583594
if n_indices[id] > 0:
584595
gl.glDrawElementsInstanced(
585596
mode[id], n_indices[id], GL_UNSIGNED_INT, address_to_ptr(0), n_instances[id]
@@ -621,8 +632,10 @@ def point_shadow_mapping_pass(
621632
):
622633
last_pid = -1
623634
for id in range(len(vao_id)):
624-
if render_flags[id, 5]:
635+
# Do not render shadows for markers and transparent objects
636+
if render_flags[id, 5] or render_flags[id, 6]:
625637
continue
638+
626639
pid = program_id[id]
627640
if pid != last_pid:
628641
gl.glUseProgram(pid)
@@ -643,7 +656,7 @@ def point_shadow_mapping_pass(
643656

644657
gl.glDisable(GL_PROGRAM_POINT_SIZE)
645658

646-
if render_flags[id, 6] or env_idx == -1:
659+
if render_flags[id, 7] or env_idx == -1:
647660
if n_indices[id] > 0:
648661
gl.glDrawElementsInstanced(
649662
mode[id], n_indices[id], GL_UNSIGNED_INT, address_to_ptr(0), n_instances[id]

genesis/ext/pyrender/mesh.py

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,12 @@ class Mesh(object):
2929
If False, the mesh will not be rendered.
3030
"""
3131

32-
def __init__(self, primitives, name=None, weights=None, is_visible=True):
32+
def __init__(self, primitives, name=None, weights=None, is_visible=True, is_marker=False):
3333
self.primitives = primitives
3434
self.name = name
3535
self.weights = weights
3636
self.is_visible = is_visible
37+
self.is_marker = is_marker
3738

3839
self._bounds = None
3940

@@ -48,35 +49,6 @@ def name(self, value):
4849
value = str(value)
4950
self._name = value
5051

51-
@property
52-
def primitives(self):
53-
"""list of :class:`Primitive` : The primitives associated
54-
with this mesh.
55-
"""
56-
return self._primitives
57-
58-
@primitives.setter
59-
def primitives(self, value):
60-
self._primitives = value
61-
62-
@property
63-
def weights(self):
64-
"""(k,) float : Weights to be applied to morph targets."""
65-
return self._weights
66-
67-
@weights.setter
68-
def weights(self, value):
69-
self._weights = value
70-
71-
@property
72-
def is_visible(self):
73-
"""bool : Whether the mesh is visible."""
74-
return self._is_visible
75-
76-
@is_visible.setter
77-
def is_visible(self, value):
78-
self._is_visible = value
79-
8052
@property
8153
def bounds(self):
8254
"""(2,3) float : The axis-aligned bounds of the mesh."""
@@ -119,7 +91,7 @@ def is_transparent(self):
11991
return False
12092

12193
@staticmethod
122-
def from_points(points, name=None, colors=None, normals=None, is_visible=True, poses=None):
94+
def from_points(points, name=None, colors=None, normals=None, is_visible=True, poses=None, is_marker=False):
12395
"""Create a Mesh from a set of points.
12496
12597
Parameters
@@ -143,7 +115,7 @@ def from_points(points, name=None, colors=None, normals=None, is_visible=True, p
143115
The created mesh.
144116
"""
145117
primitive = Primitive(positions=points, normals=normals, color_0=colors, mode=GLTF.POINTS, poses=poses)
146-
mesh = Mesh(primitives=[primitive], name=name, is_visible=is_visible)
118+
mesh = Mesh(primitives=[primitive], name=name, is_visible=is_visible, is_marker=is_marker)
147119
return mesh
148120

149121
@staticmethod
@@ -152,6 +124,7 @@ def from_trimesh(
152124
name=None,
153125
material=None,
154126
is_visible=True,
127+
is_marker=False,
155128
poses=None,
156129
wireframe=False,
157130
smooth=False,
@@ -245,7 +218,7 @@ def from_trimesh(
245218
)
246219
)
247220

248-
return Mesh(primitives=primitives, name=name, is_visible=is_visible)
221+
return Mesh(primitives=primitives, name=name, is_visible=is_visible, is_marker=is_marker)
249222

250223
@staticmethod
251224
def _get_trimesh_props(mesh, smooth=False, material=None):

0 commit comments

Comments
 (0)