@@ -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