Page MenuHome

Active Tools Break Custom Gizmos
Closed, ResolvedPublic


Blender Version
Broken: 3d2ff33c261593

Short description of error

Using an active tool gizmo at the same time as a custom (as in Python defined) gizmo may entirely break gizmos.
This happens when the custom gizmo sets internal gizmo properties on redraws. We basically put Blender into a redraw + reinitialize loop then.

Exact steps for others to reproduce the error

  • Enter Scripting Workspace
  • In Text Editor, select TemplatesPythonGizmo Custom Geometry
  • Press "Run Script"
  • Select the light object (custom gizmo should appear)
  • Open toolbar, activate some transform gizmo

-> The transform gizmo will appear and disappear immediately. This should happen again after selecting a different object, and then the light again. The custom light gizmo won't function properly (glitchy hover highlight, dragging doesn't work).

The root cause is the gizmo properties sending a (NC_SCREEN | NA_EDITED) notifier when set.
If a custom gizmo sets any of these properties (e.g. alpha, matrix_basis, hide, etc.) in a redraw callback - something that should definitely supported -, that triggers such notifiers to be send on every redraw. While sending this notifer seems reasonable, that causes ED_screen_refresh & ED_area_initialize to be executed on every redraw too! These are not supposed to be used that way. The latter also reinitializes tools, causing a redraw which again causes the gizmo properties to send a notifier. Hence, this is a redraw + reinitialize loop.

Gizmos properties should update the UI without causing ED_screen_refresh calls. AFAICS we only need to redraw the region the gizmo is in. A few options:

  • Add a new notifier type triggering a region redraw.
  • Use new message bus to tag region redraw.
  • Use property setter to tag region redraw.

Not sure which way we should go for fixing. I also don't have much time for this, so opening a report to ensure it's not forgotten.

Event Timeline

Julian Eisel (Severin) triaged this task as Normal priority.Jan 7 2019, 8:00 PM
Julian Eisel (Severin) raised the priority of this task from Normal to Confirmed, High.

This seems like a very typical use case of custom gizmos so definitely something that should be fixed for 2.80.