@@ -63,7 +63,7 @@ def __init__(self, viewer: "Viewer"):
6363 self .grid = None
6464
6565 self .shader_model : Shader = None
66- self .shader_tag : Shader = None
66+ self ._shader_tag : Shader = None
6767 self .shader_arrow : Shader = None
6868 self .shader_instance : Shader = None
6969 self .shader_grid : Shader = None
@@ -145,6 +145,29 @@ def opacity(self) -> float:
145145 """
146146 return self ._opacity
147147
148+ @property
149+ def shader_tag (self ) -> Shader :
150+ """Lazy initialization of tag shader.
151+
152+ Returns
153+ -------
154+ Shader
155+ The tag shader, initialized on first access.
156+ """
157+ if self ._shader_tag is None :
158+ projection = self .camera .projection (self .width (), self .height ())
159+ viewworld = self .camera .viewworld ()
160+ transform = list (identity (4 , dtype = float32 ))
161+
162+ self ._shader_tag = Shader (name = "tag" )
163+ self ._shader_tag .bind ()
164+ self ._shader_tag .uniform4x4 ("projection" , projection )
165+ self ._shader_tag .uniform4x4 ("viewworld" , viewworld )
166+ self ._shader_tag .uniform4x4 ("transform" , transform )
167+ self ._shader_tag .uniform1f ("opacity" , self .opacity )
168+ self ._shader_tag .release ()
169+ return self ._shader_tag
170+
148171 # ==========================================================================
149172 # GL
150173 # ==========================================================================
@@ -413,14 +436,6 @@ def init(self):
413436 self .shader_model .uniformBuffer ("settingsBuffer" , self .buffer_manager .settings_texture , unit = 1 )
414437 self .shader_model .release ()
415438
416- self .shader_tag = Shader (name = "tag" )
417- self .shader_tag .bind ()
418- self .shader_tag .uniform4x4 ("projection" , projection )
419- self .shader_tag .uniform4x4 ("viewworld" , viewworld )
420- self .shader_tag .uniform4x4 ("transform" , transform )
421- self .shader_tag .uniform1f ("opacity" , self .opacity )
422- self .shader_tag .release ()
423-
424439 def update_projection (self , w = None , h = None ):
425440 """
426441 Update the projection matrix.
@@ -548,22 +563,25 @@ def paint(self, is_instance: bool = False):
548563 if self .viewer .config .renderer .show_grid :
549564 self .grid .draw (self .shader_model )
550565
551- # Draw opaque objects
566+ # Draw all the objects in the buffer manager
552567 self .buffer_manager .draw (
553568 self .shader_model ,
554569 self .rendermode ,
555570 is_instance = is_instance ,
556571 )
557572
558- self .shader_model .release ()
559-
560- # Draw text tag sprites
573+ # Draw text tag sprites if there are any
561574 tag_objs = [obj for obj in self .viewer .scene .objects if isinstance (obj , TagObject )]
562- self .shader_tag .bind ()
563- self .shader_tag .uniform4x4 ("viewworld" , viewworld )
564- for obj in tag_objs :
565- obj .draw (self .shader_tag , self .camera .position , self .width (), self .height ())
566- self .shader_tag .release ()
575+ if tag_objs :
576+ # release the model shader and bind the tag shader
577+ self .shader_model .release ()
578+ self .shader_tag .bind ()
579+ self .shader_tag .uniform4x4 ("viewworld" , viewworld )
580+ for obj in tag_objs :
581+ obj .draw (self .shader_tag , self .camera .position , self .width (), self .height ())
582+ # switch back to the model shader
583+ self .shader_tag .release ()
584+ self .shader_model .bind ()
567585
568586 # draw 2D box for multi-selection
569587 if self .viewer .mouse .is_tracing_a_window :
0 commit comments