From c16fe1855acfa21a61b4810e98bba4f3f33fc0a1 Mon Sep 17 00:00:00 2001 From: Almar Klein Date: Tue, 27 May 2025 13:20:46 +0200 Subject: [PATCH 1/4] Tweaks to adjust to new pygfx blending --- fastplotlib/graphics/selectors/_base_selector.py | 3 +-- fastplotlib/layouts/_figure.py | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/fastplotlib/graphics/selectors/_base_selector.py b/fastplotlib/graphics/selectors/_base_selector.py index b74bcf75..1542d2ba 100644 --- a/fastplotlib/graphics/selectors/_base_selector.py +++ b/fastplotlib/graphics/selectors/_base_selector.py @@ -215,7 +215,7 @@ def _fpl_add_plot_area_hook(self, plot_area): wo.add_event_handler(self._toggle_arrow_key_moveable, "double_click") for fill in self._fill: - if fill.material.color_is_transparent: + if fill.material.color.a < 1 or fill.material.opacity < 1: self._pfunc_fill = partial(self._check_fill_pointer_event, fill) self._plot_area.renderer.add_event_handler( self._pfunc_fill, "pointer_down" @@ -392,7 +392,6 @@ def _move_to_pointer(self, ev): self._move_graphic(move_info) def _pointer_enter(self, ev): - if self._hover_responsive is None: return diff --git a/fastplotlib/layouts/_figure.py b/fastplotlib/layouts/_figure.py index bfd97000..8a926518 100644 --- a/fastplotlib/layouts/_figure.py +++ b/fastplotlib/layouts/_figure.py @@ -560,6 +560,11 @@ def _render(self, draw=True): # draw the underlay planes self.renderer.render(self._underlay_scene, self._underlay_camera, flush=False) + # With new pygfx' blending, the depth buffer is only cleared after each flush, we need a manual depth + # clear to erase the depth values set by the underlay. + if hasattr(self.renderer, "clear"): + self.renderer.clear(depth=True) + # call the animation functions before render self._call_animate_functions(self._animate_funcs_pre) for subplot in self: From 52e894594b6f279c96375010bde14fc53e7e60cf Mon Sep 17 00:00:00 2001 From: Almar Klein Date: Thu, 3 Jul 2025 14:54:50 +0200 Subject: [PATCH 2/4] disable ppaa for screenshot tests --- examples/tests/test_examples.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/examples/tests/test_examples.py b/examples/tests/test_examples.py index 7fbd32e2..c0cdffbd 100644 --- a/examples/tests/test_examples.py +++ b/examples/tests/test_examples.py @@ -47,7 +47,7 @@ def check_skip_imgui(module): @pytest.mark.parametrize("module", examples_to_run, ids=lambda x: x.stem) -def test_examples_run(module, force_offscreen): +def test_examples_run(module, prep_environment): """Run every example marked to see if they run without error.""" if not fpl.IMGUI: check_skip_imgui(module) @@ -56,13 +56,17 @@ def test_examples_run(module, force_offscreen): @pytest.fixture -def force_offscreen(): +def prep_environment(): """Force the offscreen canvas to be selected by the auto gui module.""" + # Make that examples using rendercanvas.auto, will use the offscreen backend os.environ["RENDERCANVAS_FORCE_OFFSCREEN"] = "true" + # Disable ppaa on the renderer by default. Otherwise all screenshots change when the ppaa shaders are updated. + os.environ["PYGFX_PPAA"] = "none" try: yield finally: del os.environ["RENDERCANVAS_FORCE_OFFSCREEN"] + del os.environ["PYGFX_PPAA"] def test_that_we_are_on_lavapipe(): @@ -86,7 +90,7 @@ def import_from_path(module_name, filename): @pytest.mark.parametrize("module", examples_to_test, ids=lambda x: x.stem) -def test_example_screenshots(module, force_offscreen): +def test_example_screenshots(module, prep_environment): """Make sure that every example marked outputs the expected.""" if not fpl.IMGUI: @@ -98,7 +102,9 @@ def test_example_screenshots(module, force_offscreen): if fpl.IMGUI: # there doesn't seem to be a resize event for the manual offscreen canvas - example.figure.imgui_renderer._backend.io.display_size = example.figure.canvas.get_logical_size() + example.figure.imgui_renderer._backend.io.display_size = ( + example.figure.canvas.get_logical_size() + ) # run this once so any edge widgets set their sizes and therefore the subplots get the correct rect # hacky but it works for now example.figure.imgui_renderer.render() @@ -148,9 +154,9 @@ def test_example_screenshots(module, force_offscreen): if os.environ["REGENERATE_SCREENSHOTS"] == "1": iio.imwrite(screenshot_path, rgb) - assert ( - screenshot_path.exists() - ), "found # test_example = true but no reference screenshot available" + assert screenshot_path.exists(), ( + "found # test_example = true but no reference screenshot available" + ) ref_img = iio.imread(screenshot_path) @@ -200,5 +206,7 @@ def get_diffs_rgba(slicer): if __name__ == "__main__": + os.environ["RENDERCANVAS_FORCE_OFFSCREEN"] = "true" + os.environ["PYGFX_PPAA"] = "none" test_examples_run("simple") test_example_screenshots("simple") From 8cb599a9a0119377af22a98167b186f83cb30b51 Mon Sep 17 00:00:00 2001 From: Almar Klein Date: Thu, 3 Jul 2025 15:27:58 +0200 Subject: [PATCH 3/4] also clear for overlay --- fastplotlib/layouts/_figure.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fastplotlib/layouts/_figure.py b/fastplotlib/layouts/_figure.py index 8a926518..af1a6a61 100644 --- a/fastplotlib/layouts/_figure.py +++ b/fastplotlib/layouts/_figure.py @@ -571,6 +571,8 @@ def _render(self, draw=True): subplot._render() # overlay render pass + if hasattr(self.renderer, "clear"): + self.renderer.clear(depth=True) self.renderer.render(self._overlay_scene, self._overlay_camera, flush=False) self.renderer.flush() From 9ca57b668a750171fb466be71f8b5009e9fb74a3 Mon Sep 17 00:00:00 2001 From: Almar Klein Date: Fri, 4 Jul 2025 11:35:46 +0200 Subject: [PATCH 4/4] pin imgui-bundle --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 216b4ab4..59421ba1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,7 +55,7 @@ tests = [ "scikit-learn", "tqdm", ] -imgui = ["imgui-bundle"] +imgui = ["imgui-bundle<1.92"] dev = ["fastplotlib[docs,notebook,tests,imgui]"] [project.urls]