@@ -62,6 +62,7 @@ def __init__(self, viewer: "Viewer"):
6262 self .grid = None
6363
6464 self .shader_model : Shader = None
65+ self .shader_lines : Shader = None
6566 self ._shader_tag : Shader = None
6667 self .shader_arrow : Shader = None
6768 self .shader_instance : Shader = None
@@ -108,6 +109,9 @@ def rendermode(self, rendermode):
108109 self .shader_model .bind ()
109110 self .shader_model .uniform1f ("opacity" , self ._opacity )
110111 self .shader_model .release ()
112+ self .shader_lines .bind ()
113+ self .shader_lines .uniform1f ("opacity" , self ._opacity )
114+ self .shader_lines .release ()
111115 self .update ()
112116
113117 @property
@@ -197,7 +201,6 @@ def initializeGL(self):
197201 """
198202 GL .glClearColor (* self .viewer .config .renderer .backgroundcolor .rgba )
199203 GL .glPolygonOffset (1.0 , 1.0 )
200- GL .glEnable (GL .GL_POLYGON_OFFSET_FILL )
201204 GL .glEnable (GL .GL_CULL_FACE )
202205 GL .glCullFace (GL .GL_BACK )
203206 GL .glEnable (GL .GL_DEPTH_TEST )
@@ -432,6 +435,16 @@ def init(self):
432435 self .shader_model .uniformBuffer ("settingsBuffer" , self .buffer_manager .settings_texture , unit = 1 )
433436 self .shader_model .release ()
434437
438+ self .shader_lines = Shader (name = "modellines" )
439+ self .shader_lines .bind ()
440+ self .shader_lines .uniform4x4 ("projection" , projection )
441+ self .shader_lines .uniform4x4 ("viewworld" , viewworld )
442+ self .shader_lines .uniform1f ("opacity" , self .opacity )
443+ self .shader_lines .uniform3f ("selection_color" , self .viewer .config .renderer .selectioncolor .rgb )
444+ self .shader_lines .uniformBuffer ("transformBuffer" , self .buffer_manager .transform_texture , unit = 0 )
445+ self .shader_lines .uniformBuffer ("settingsBuffer" , self .buffer_manager .settings_texture , unit = 1 )
446+ self .shader_lines .release ()
447+
435448 def update_projection (self , w = None , h = None ):
436449 """
437450 Update the projection matrix.
@@ -451,6 +464,10 @@ def update_projection(self, w=None, h=None):
451464 self .shader_model .uniform4x4 ("projection" , projection )
452465 self .shader_model .release ()
453466
467+ self .shader_lines .bind ()
468+ self .shader_lines .uniform4x4 ("projection" , projection )
469+ self .shader_lines .release ()
470+
454471 self .shader_tag .bind ()
455472 self .shader_tag .uniform4x4 ("projection" , projection )
456473 self .shader_tag .release ()
@@ -508,21 +525,34 @@ def paint(self, is_instance: bool = False):
508525 viewworld = self .camera .viewworld ()
509526 self .update_projection ()
510527
511- # rebind the model shader
512- self .shader_model .bind ()
513- self .shader_model .uniform1f ("opacity" , self .opacity )
514- self .shader_model .uniformBuffer ("transformBuffer" , self .buffer_manager .transform_texture , unit = 0 )
515- self .shader_model .uniformBuffer ("settingsBuffer" , self .buffer_manager .settings_texture , unit = 1 )
516-
517- self .shader_model .uniform4x4 ("viewworld" , viewworld )
518- self .shader_model .uniform1i ("is_instance" , is_instance )
519-
528+ # Update object settings (visibility, selection, etc.)
529+ self .buffer_manager .update_settings ()
530+
531+ # Update uniforms for both shaders
532+ for shader in [self .shader_model , self .shader_lines ]:
533+ shader .bind ()
534+ shader .uniform1f ("opacity" , self .opacity )
535+ shader .uniformBuffer ("transformBuffer" , self .buffer_manager .transform_texture , unit = 0 )
536+ shader .uniformBuffer ("settingsBuffer" , self .buffer_manager .settings_texture , unit = 1 )
537+ shader .uniform4x4 ("viewworld" , viewworld )
538+ shader .uniform1i ("is_instance" , is_instance )
539+ shader .release ()
540+
541+ # Update viewport uniform for line shader
542+ self .shader_lines .bind ()
543+ self .shader_lines .uniform2f ("viewport" , (self .width (), self .height ()))
544+ self .shader_lines .release ()
545+
546+ # Draw the grid
520547 if self .viewer .config .renderer .show_grid :
548+ self .shader_model .bind ()
521549 self .grid .draw (self .shader_model )
550+ self .shader_model .release ()
522551
523552 # Draw all the objects in the buffer manager
524553 self .buffer_manager .draw (
525554 self .shader_model ,
555+ self .shader_lines ,
526556 self .rendermode ,
527557 is_instance = is_instance ,
528558 )
@@ -531,7 +561,6 @@ def paint(self, is_instance: bool = False):
531561 tag_objs = [obj for obj in self .viewer .scene .objects if isinstance (obj , TagObject )]
532562 if tag_objs :
533563 # release the model shader and bind the tag shader
534- self .shader_model .release ()
535564 self .shader_tag .bind ()
536565 self .shader_tag .uniform4x4 ("viewworld" , viewworld )
537566 for obj in tag_objs :
@@ -540,7 +569,7 @@ def paint(self, is_instance: bool = False):
540569
541570 # draw 2D box for multi-selection
542571 if self .viewer .mouse .is_tracing_a_window :
543- # Ensure the shader is bound before drawing
572+ # Ensure the model shader is bound before drawing
544573 self .shader_model .bind ()
545574
546575 # Draw the selection box
@@ -554,6 +583,7 @@ def paint(self, is_instance: bool = False):
554583 self .width (),
555584 self .height (),
556585 )
586+ self .shader_model .release ()
557587
558588 # Unbind once we're done
559589 GL .glBindVertexArray (0 )
0 commit comments