Skip to content

Commit 3c16d9b

Browse files
committed
avoid shader switching when possible
1 parent 5c73613 commit 3c16d9b

File tree

1 file changed

+36
-18
lines changed

1 file changed

+36
-18
lines changed

src/compas_viewer/renderer/renderer.py

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)