Skip to content

Commit 48e6446

Browse files
committed
break down functions
1 parent d2cb119 commit 48e6446

File tree

2 files changed

+52
-55
lines changed

2 files changed

+52
-55
lines changed

src/compas_viewer/renderer/renderer.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,9 @@ def paint(self, is_instance: bool = False):
525525
viewworld = self.camera.viewworld()
526526
self.update_projection()
527527

528+
# Update object settings (visibility, selection, etc.)
529+
self.buffer_manager.update_settings()
530+
528531
# Update uniforms for both shaders
529532
for shader in [self.shader_model, self.shader_lines]:
530533
shader.bind()
@@ -535,10 +538,12 @@ def paint(self, is_instance: bool = False):
535538
shader.uniform1i("is_instance", is_instance)
536539
shader.release()
537540

541+
# Update viewport uniform for line shader
538542
self.shader_lines.bind()
539543
self.shader_lines.uniform2f("viewport", (self.width(), self.height()))
540544
self.shader_lines.release()
541545

546+
# Draw the grid
542547
if self.viewer.config.renderer.show_grid:
543548
self.shader_model.bind()
544549
self.grid.draw(self.shader_model)
@@ -564,7 +569,7 @@ def paint(self, is_instance: bool = False):
564569

565570
# draw 2D box for multi-selection
566571
if self.viewer.mouse.is_tracing_a_window:
567-
# Ensure the shader is bound before drawing
572+
# Ensure the model shader is bound before drawing
568573
self.shader_model.bind()
569574

570575
# Draw the selection box

src/compas_viewer/scene/buffermanager.py

Lines changed: 46 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -177,36 +177,7 @@ def create_buffers(self) -> None:
177177
else:
178178
self.buffer_ids[buffer_type]["elements"] = make_index_buffer(self.elements[buffer_type])
179179

180-
def draw(self, shader: Shader, line_shader: Shader, rendermode: str, is_instance: bool = False) -> None:
181-
"""Draw all objects using the combined buffers.
182-
183-
Parameters
184-
----------
185-
shader : Shader
186-
The shader to use for rendering.
187-
line_shader : Shader
188-
The shader to use for rendering lines.
189-
rendermode : str
190-
The rendering mode to use, either "wireframe", "lighted", or "ghosted".
191-
is_instance : bool
192-
Whether the rendering is for an instance.
193-
"""
194-
195-
is_wireframe = rendermode == "wireframe"
196-
is_lighted = rendermode == "lighted"
197-
is_ghosted = rendermode == "ghosted"
198-
199-
for obj in self.objects:
200-
self.update_object_settings(obj)
201-
202-
shader.bind()
203-
shader.uniform1i("is_grid", False)
204-
shader.enable_attribute("position")
205-
shader.enable_attribute("color")
206-
shader.enable_attribute("object_index")
207-
208-
# Frist Draw all the opaque elements
209-
# Draw faces
180+
def _draw_faces(self, shader: Shader, is_instance: bool, is_lighted: bool, is_ghosted: bool, is_wireframe: bool):
210181
GL.glEnable(GL.GL_POLYGON_OFFSET_FILL)
211182
if not is_wireframe and (not is_ghosted or is_instance):
212183
shader.uniform1i("is_lighted", is_lighted)
@@ -218,19 +189,18 @@ def draw(self, shader: Shader, line_shader: Shader, rendermode: str, is_instance
218189
shader.bind_attribute("object_index", self.buffer_ids[face_type]["object_indices"], step=1)
219190
shader.draw_triangles(elements=self.buffer_ids[face_type]["elements"], n=len(self.elements[face_type]))
220191
if is_instance:
221-
# Also include transparent elements when rendering instance map
222192
shader.draw_triangles(elements=self.buffer_ids[face_type]["elements_transparent"], n=len(self.elements[face_type + "_transparent"]))
223193
GL.glDisable(GL.GL_POLYGON_OFFSET_FILL)
224194

225-
# Draw points
195+
def _draw_points(self, shader: Shader):
226196
shader.uniform1i("element_type", 0)
227197
if self.buffer_ids["_points_data"]:
228198
shader.bind_attribute("position", self.buffer_ids["_points_data"]["positions"])
229199
shader.bind_attribute("color", self.buffer_ids["_points_data"]["colors"], step=4)
230200
shader.bind_attribute("object_index", self.buffer_ids["_points_data"]["object_indices"], step=1)
231-
shader.draw_points(elements=self.buffer_ids["_points_data"]["elements"], n=len(self.elements["_points_data"]), size=10.0)
201+
shader.draw_points(elements=self.buffer_ids["_points_data"]["elements"], n=len(self.elements["_points_data"]))
232202

233-
# Draw lines
203+
def _draw_lines(self, line_shader: Shader):
234204
GL.glDisable(GL.GL_CULL_FACE)
235205
line_shader.bind()
236206
line_shader.uniform1i("is_lighted", False)
@@ -246,28 +216,45 @@ def draw(self, shader: Shader, line_shader: Shader, rendermode: str, is_instance
246216
line_shader.release()
247217
GL.glEnable(GL.GL_CULL_FACE)
248218

249-
if not is_instance and not is_wireframe:
250-
# Then Draw all the transparent elements
251-
shader.bind()
252-
shader.uniform1i("is_lighted", is_lighted)
253-
shader.uniform1i("element_type", 2)
254-
GL.glDepthMask(GL.GL_FALSE) # Disable depth writing for transparent objects
255-
for face_type in ["_frontfaces_data", "_backfaces_data"]:
256-
if self.buffer_ids[face_type]:
257-
shader.bind_attribute("position", self.buffer_ids[face_type]["positions"])
258-
shader.bind_attribute("color", self.buffer_ids[face_type]["colors"], step=4)
259-
shader.bind_attribute("object_index", self.buffer_ids[face_type]["object_indices"], step=1)
260-
shader.draw_triangles(elements=self.buffer_ids[face_type]["elements_transparent"], n=len(self.elements[face_type + "_transparent"]))
261-
if is_ghosted:
262-
# Draw the opaque elements in transparent pass too in ghosted mode
263-
shader.draw_triangles(elements=self.buffer_ids[face_type]["elements"], n=len(self.elements[face_type]))
264-
GL.glDepthMask(GL.GL_TRUE) # Re-enable depth writing
265-
266-
shader.disable_attribute("object_index")
267-
shader.disable_attribute("position")
268-
shader.disable_attribute("color")
219+
def _draw_transparent_faces(self, shader: Shader, is_lighted: bool, is_ghosted: bool):
220+
shader.bind()
221+
shader.uniform1i("is_lighted", is_lighted)
222+
shader.uniform1i("element_type", 2)
223+
GL.glDepthMask(GL.GL_FALSE)
224+
for face_type in ["_frontfaces_data", "_backfaces_data"]:
225+
if self.buffer_ids[face_type]:
226+
shader.bind_attribute("position", self.buffer_ids[face_type]["positions"])
227+
shader.bind_attribute("color", self.buffer_ids[face_type]["colors"], step=4)
228+
shader.bind_attribute("object_index", self.buffer_ids[face_type]["object_indices"], step=1)
229+
shader.draw_triangles(elements=self.buffer_ids[face_type]["elements_transparent"], n=len(self.elements[face_type + "_transparent"]))
230+
if is_ghosted:
231+
shader.draw_triangles(elements=self.buffer_ids[face_type]["elements"], n=len(self.elements[face_type]))
232+
GL.glDepthMask(GL.GL_TRUE)
233+
234+
def draw(self, shader: Shader, line_shader: Shader, rendermode: str, is_instance: bool = False) -> None:
235+
"""Draw all objects using the combined buffers."""
236+
is_wireframe = rendermode == "wireframe"
237+
is_lighted = rendermode == "lighted"
238+
is_ghosted = rendermode == "ghosted"
239+
240+
# Draw opaque elements
241+
shader.bind()
242+
shader.uniform1i("is_grid", False)
243+
shader.enable_attribute("position")
244+
shader.enable_attribute("color")
245+
shader.enable_attribute("object_index")
246+
247+
self._draw_faces(shader, is_instance, is_lighted, is_ghosted, is_wireframe)
248+
self._draw_points(shader)
269249
shader.release()
270250

251+
# Draw lines with their own shader
252+
self._draw_lines(line_shader)
253+
254+
# Draw transparent elements if not in instance mode
255+
if not is_instance and not is_wireframe:
256+
self._draw_transparent_faces(shader, is_lighted, is_ghosted)
257+
271258
def clear(self) -> None:
272259
"""Clear all buffer data."""
273260
for buffer_type in self.positions:
@@ -347,6 +334,11 @@ def update_object_data(self, obj: Any) -> None:
347334
col_byte_offset = start_idx * 4 * 4 # 4 floats per color * 4 bytes per float
348335
update_vertex_buffer(col_array, self.buffer_ids[data_type]["colors"], offset=col_byte_offset)
349336

337+
def update_settings(self):
338+
"""Update the settings for all objects."""
339+
for obj in self.objects:
340+
self.update_object_settings(obj)
341+
350342
def update_object_settings(self, obj: Any) -> None:
351343
"""Update the settings for a single object."""
352344
if obj not in self.objects:

0 commit comments

Comments
 (0)