@@ -57,6 +57,7 @@ def load_const(const_name):
5757RenderFlags_SHADOWS_DIRECTIONAL = RenderFlags .SHADOWS_DIRECTIONAL
5858RenderFlags_SHADOWS_POINT = RenderFlags .SHADOWS_POINT
5959RenderFlags_SKIP_FLOOR = RenderFlags .SKIP_FLOOR
60+ RenderFlags_OFFSCREEN = RenderFlags .OFFSCREEN
6061RenderFlags_REFLECTIVE_FLOOR = RenderFlags .REFLECTIVE_FLOOR
6162RenderFlags_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 ]
0 commit comments