glue-viz / glue

Linked Data Visualizations Across Multiple Files
http://glueviz.org
Other
728 stars 152 forks source link

3d scatter fails to plot with PyQt5 and GL errors #2311

Open JoseBlanca opened 2 years ago

JoseBlanca commented 2 years ago

Describe the bug The 3d viewer does not plot any markers

To Reproduce Steps to reproduce the behavior such as:

  1. Open glue
  2. Load csv data
  3. Open a 3d viewer
  4. The viewer window opens, and the 3d frame is drawn, but no markers a plotted

Expected behavior The dots should be plotted as before

Details:

Versions: Glue: 1.5.0 Python: 3.10.5 PyQt5: PyQt: 5.15.7 - Qt: 5.15.2 PySide2: Not installed qtpy: 2.1.0 setuptools: 58.1.0 echo: 0.6 numpy: 1.23.1 matplotlib: 3.5.2 pandas: 1.4.3 astropy: 5.1 dill: 0.3.5.1 h5py: 3.7.0 xlrd: 2.0.1 openpyxl: 3.0.10 mpl-scatter-density: 0.7 glue-core: 1.5.0 glue-vispy-viewers: 1.0.5 IPython: 8.4.0 qtconsole: 5.3.1 ipykernel: 6.15.1 traitlets: 5.3.0 pygments: 2.12.0 pyzmq: 23.2.0 scipy: 1.8.1 scikit-image: Not installed PyAVM: Not installed spectral-cube: 0.6.0 astrodendro: Not installed mock: Not installed pytest: Not installed plotly: Not installed

Additional context Add any other context about the problem here.

I've run glue. A warning has appeared. $ glue QSocketNotifier: Can only be used with threads started with QThread

I've loaded a csv and and I've created a 3D Scatter viewer. The viewer appears, but there's no markers plotted.

Up until yesterday it worked, no problem. I don't know if it's related but yesterday I installed mesa:

$ sudo apt install libgl1-mesa-dev libglu1-mesa-dev

I also don't know if it its related to https://github.com/glue-viz/glue/issues/2291

There's a stack:

WARNING:vispy:Error drawing visual <glue_vispy_viewers.compat.text.TextVisual object at 0x7f9aa77b8a00> WARNING:vispy:Traceback (most recent call last): File "/home/jose/analyses/g2psol/pyenv/bin/glue", line 8, in sys.exit(main()) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/glue/main.py", line 259, in main start_glue(kwargs) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/glue/main.py", line 197, in startglue return ga.start(maximized=maximized) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/glue/app/qt/application.py", line 1225, in start return self.app.exec() File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/glue/utils/misc.py", line 55, in result return func(*args, *kwargs) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/glue/app/qt/layer_tree_widget.py", line 125, in _do_action app.choose_new_data_viewer(data) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/glue/app/qt/application.py", line 1009, in choose_new_data_viewer return self.do(cmd) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/glue/core/application_base.py", line 261, in do return self._cmds.do(command) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/glue/core/command.py", line 134, in do result = cmd.do(self._session) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/glue/core/command.py", line 235, in do viewer = session.application.new_data_viewer(self.viewer, self.data) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/glue/utils/matplotlib.py", line 186, in wrapper result = func(args, kwargs) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/glue/app/qt/application.py", line 1015, in new_data_viewer viewer.show() File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/glue_vispy_viewers/common/vispy_data_viewer.py", line 188, in show super(BaseVispyViewer, self).show() File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/app/backends/_qt.py", line 567, in event out = super(QtBaseCanvasBackend, self).event(ev) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/app/backends/_qt.py", line 567, in event out = super(QtBaseCanvasBackend, self).event(ev) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/app/backends/_qt.py", line 903, in paintGL self._vispy_canvas.events.draw(region=None) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/util/event.py", line 453, in call self._invoke_callback(cb, event) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/util/event.py", line 471, in _invoke_callback _handle_exception(self.ignore_callback_errors, << caught exception here: >> File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/util/event.py", line 469, in _invoke_callback cb(event) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/scene/canvas.py", line 218, in on_draw self._draw_scene() File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/scene/canvas.py", line 277, in _draw_scene self.draw_visual(self.scene) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/scene/canvas.py", line 315, in draw_visual node.draw() File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/scene/visuals.py", line 103, in draw self._visual_superclass.draw(self) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/visuals/visual.py", line 605, in draw v.draw() File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/visuals/visual.py", line 451, in draw self._program.draw(self._vshare.draw_mode, File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/visuals/shaders/program.py", line 102, in draw Program.draw(self, *args, *kwargs) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/gloo/program.py", line 526, in draw canvas.context.flush_commands() File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/gloo/context.py", line 172, in flush_commands self.glir.flush(self.shared.parser) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/gloo/glir.py", line 582, in flush self._shared.flush(parser) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/gloo/glir.py", line 504, in flush parser.parse(self._filter(self.clear(), parser)) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/gloo/glir.py", line 822, in parse self._parse(command) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/gloo/glir.py", line 792, in _parse ob.set_data(args) File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/gloo/glir.py", line 931, in set_data raise RuntimeError("Shader compilation error in %s:\n%s" % RuntimeError: Shader compilation error in GL_FRAGMENT_SHADER: on line 3: warning: extension `GL_OES_element_index_uint' unsupported in fragment shader

extension GL_OES_element_index_uint : enable

on line 4: warning: extension `GL_OES_standard_derivatives' unsupported in fragment shader
  #extension GL_OES_standard_derivatives : enable
on line 1482: error: no function with name 'CatRom'
  rgb = CatRom(u_font_atlas, u_font_atlas_shape, uv);

ERROR:vispy:Invoking <bound method SceneCanvas.on_draw of <SceneCanvas (PyQt5) at 0x7f9aa50a5db0>> for DrawEvent WARNING:vispy:Error drawing visual <glue_vispy_viewers.compat.text.TextVisual object at 0x7f9aa77b8a00> ERROR:vispy:Invoking <bound method SceneCanvas.on_draw of <SceneCanvas (PyQt5) at 0x7f9aa50a5db0>> repeat 2 WARNING:vispy:Error drawing visual <glue_vispy_viewers.compat.text.TextVisual object at 0x7f9aa77b8a00> WARNING:vispy:Error drawing visual <glue_vispy_viewers.compat.text.TextVisual object at 0x7f9aa77b8a00> ERROR:vispy:Invoking <bound method SceneCanvas.on_draw of <SceneCanvas (PyQt5) at 0x7f9aa50a5db0>> repeat 4 WARNING:vispy:Error drawing visual <glue_vispy_viewers.compat.text.TextVisual object at 0x7f9aa77b8a00> WARNING:vispy:Error drawing visual <glue_vispy_viewers.compat.text.TextVisual object at 0x7f9aa77b8a00> WARNING:vispy:Error drawing visual <glue_vispy_viewers.compat.text.TextVisual object at 0x7f9aa77b8a00

Captura desde 2022-07-21 08-42-43

JoseBlanca commented 2 years ago

I've found a workaround.

I think that the problem was caused by a new version of vispy. Vispy released v0.11.0 on 2022-07-04. I guess I might have regenerated my virtual environment and I've got this newer vispy. I've uninstalled vispy and reinstalled pinning my requirements to vispy==0.10.0 and the 3D scatter is back!

dhomeier commented 2 years ago

Thanks for the detailed bug report and backtrace! I could isolate the error

File "/home/jose/analyses/g2psol/pyenv/lib/python3.10/site-packages/vispy/gloo/glir.py", line 931, in set_data raise RuntimeError("Shader compilation error in %s:\n%s" % RuntimeError: Shader compilation error in GL_FRAGMENT_SHADER: on line 3: warning: extension GL_OES_element_index_uint' unsupported in fragment shader #extension GL_OES_element_index_uint : enable on line 4: warning: extensionGL_OES_standard_derivatives' unsupported in fragment shader

extension GL_OES_standard_derivatives : enable

on line 1482: error: no function with name 'CatRom' rgb = CatRom(u_font_atlas, u_font_atlas_shape, uv);

to the changes from vispy/vispy#2322.

@astrofrog it appears that this removed CatRom from the available shaders resp. has renamed all the "plain" shaders to *2D ones, looking at the declaration in build_spatial_filters.py and the output in spatial-filters.frag. I could only find one remaining instance of CatRom in vispy/glsl/markers/marker-sdf.frag.

So changing the shader in glue_vispy_viewers/compat/text.py to call CatRom2D as well duly restores the 3D Scatter viewer for the current vispy, but I am not sure how to elegantly do this conditionally for vispy.__version__ >= 0.11. Perhaps run some f-string or .format() tricks on self.FRAGMENT_SHADER; or maybe it's better to bump the minimum version to 0.11 right away?

astrofrog commented 2 years ago

Maybe just bumping the min version is fine if everything else seems to work

dhomeier commented 2 years ago

Will see if I can test this properly, but a large fraction of the tests have already been failing before, e.g. in glue-viz/glue-vispy-viewers#371. It does not trigger any of the existing add_viewer tests afaics, might be a widget_cls not covered by the tests? [EDIT: was breaking app.new_data_viewer(VispyScatterViewer) in the toolbar tests]