|
59 | 59 |
|
60 | 60 |
|
61 | 61 | pyglet.options["shadow_window"] = False |
| 62 | +pyglet.options["dpi_scaling"] = "real" |
62 | 63 |
|
63 | 64 |
|
64 | 65 | MODULE_DIR = os.path.dirname(__file__) |
@@ -366,9 +367,7 @@ def __init__( |
366 | 367 | ####################################################################### |
367 | 368 | # Initialize OpenGL context and renderer |
368 | 369 | ####################################################################### |
369 | | - self._renderer = Renderer( |
370 | | - self._viewport_size[0], self._viewport_size[1], context.jit, self.render_flags["point_size"] |
371 | | - ) |
| 370 | + self._renderer = Renderer(*self._viewport_size, context.jit, self.render_flags["point_size"]) |
372 | 371 | self._is_active = True |
373 | 372 |
|
374 | 373 | # Starting the viewer would raise an exception if the OpenGL context is invalid for some reason. This exception |
@@ -654,12 +653,18 @@ def on_close(self): |
654 | 653 | super().close() |
655 | 654 | except Exception: |
656 | 655 | pass |
657 | | - finally: |
| 656 | + try: |
658 | 657 | super().on_close() |
659 | | - try: |
660 | | - pyglet.app.exit() |
661 | | - except Exception: |
662 | | - pass |
| 658 | + except Exception: |
| 659 | + pass |
| 660 | + try: |
| 661 | + pyglet.app.exit() |
| 662 | + except Exception: |
| 663 | + pass |
| 664 | + try: |
| 665 | + pyglet.app.platform_event_loop.stop() |
| 666 | + except Exception: |
| 667 | + pass |
663 | 668 |
|
664 | 669 | self._offscreen_semaphore.release() |
665 | 670 |
|
@@ -788,8 +793,8 @@ def on_resize(self, width: int, height: int) -> EVENT_HANDLE_STATE: |
788 | 793 |
|
789 | 794 | self._viewport_size = (width, height) |
790 | 795 | self._trackball.resize(self._viewport_size) |
791 | | - self._renderer.viewport_width = self._viewport_size[0] |
792 | | - self._renderer.viewport_height = self._viewport_size[1] |
| 796 | + self._renderer.viewport_width = width |
| 797 | + self._renderer.viewport_height = height |
793 | 798 | self.on_draw() |
794 | 799 |
|
795 | 800 | def on_mouse_motion(self, x: int, y: int, dx: int, dy: int) -> EVENT_HANDLE_STATE: |
@@ -998,9 +1003,9 @@ def _render(self, camera_node=None, renderer=None, normal=False): |
998 | 1003 | elif self.render_flags["all_solid"]: |
999 | 1004 | flags |= RenderFlags.ALL_SOLID |
1000 | 1005 |
|
1001 | | - if self.render_flags["shadows"]: |
| 1006 | + if self.render_flags["shadows"] and not self._is_software: |
1002 | 1007 | flags |= RenderFlags.SHADOWS_ALL |
1003 | | - if self.render_flags["plane_reflection"]: |
| 1008 | + if self.render_flags["plane_reflection"] and not self._is_software: |
1004 | 1009 | flags |= RenderFlags.REFLECTIVE_FLOOR |
1005 | 1010 | if self.render_flags["env_separate_rigid"]: |
1006 | 1011 | flags |= RenderFlags.ENV_SEPARATE |
@@ -1149,12 +1154,16 @@ def start(self, auto_refresh=True): |
1149 | 1154 | confs.insert(0, conf) |
1150 | 1155 | raise |
1151 | 1156 |
|
| 1157 | + # Determine if software emulation is being used |
| 1158 | + glinfo = self.context.get_info() |
| 1159 | + renderer = glinfo.get_renderer() |
| 1160 | + self._is_software = any(e in renderer for e in ("llvmpipe", "Apple Software Renderer")) |
| 1161 | + |
1152 | 1162 | # Run the entire rendering pipeline first without window, to make sure that all kernels are compiled |
1153 | 1163 | self.refresh() |
1154 | 1164 |
|
1155 | | - # At this point, we are all set to display the graphical window if requested |
1156 | | - if not pyglet.options["headless"]: |
1157 | | - self.set_visible(True) |
| 1165 | + # At this point, we are all set to display the graphical window |
| 1166 | + self.set_visible(True) |
1158 | 1167 |
|
1159 | 1168 | # Run the entire rendering pipeline once again, as a final validation that everything is fine |
1160 | 1169 | self.refresh() |
@@ -1202,6 +1211,13 @@ def start(self, auto_refresh=True): |
1202 | 1211 | if not self._initialized_event.is_set(): |
1203 | 1212 | self._initialized_event.set() |
1204 | 1213 |
|
| 1214 | + gs.logger.debug(f"Using interactive viewer OpenGL device: {renderer}") |
| 1215 | + if self._is_software: |
| 1216 | + gs.logger.info( |
| 1217 | + "Software rendering context detected. Shadows and plane reflection not supported. Beware rendering " |
| 1218 | + "will be extremely slow." |
| 1219 | + ) |
| 1220 | + |
1205 | 1221 | if auto_refresh: |
1206 | 1222 | while self._is_active: |
1207 | 1223 | try: |
|
0 commit comments