Commit: 90f6fd0a3651587b2f1e875b2537a5d007d77630
Author: Campbell Barton
Date:   Fri Feb 15 13:32:31 2019 +1100
Branches: master
https://developer.blender.org/rB90f6fd0a3651587b2f1e875b2537a5d007d77630

Fix T60905: Crash using smooth tool

Tools were relying on gizmos drawing to initialize their gizmos,
now tool gizmos are initialized immediately.

===================================================================

M       source/blender/windowmanager/gizmo/WM_gizmo_api.h
M       source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
M       source/blender/windowmanager/gizmo/intern/wm_gizmo_intern.h
M       source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
M       source/blender/windowmanager/intern/wm_event_system.c

===================================================================

diff --git a/source/blender/windowmanager/gizmo/WM_gizmo_api.h 
b/source/blender/windowmanager/gizmo/WM_gizmo_api.h
index 74676221e7e..604328ee891 100644
--- a/source/blender/windowmanager/gizmo/WM_gizmo_api.h
+++ b/source/blender/windowmanager/gizmo/WM_gizmo_api.h
@@ -233,6 +233,9 @@ struct wmKeyMap *WM_gizmogroup_keymap_common(
 struct wmKeyMap *WM_gizmogroup_keymap_common_select(
         const struct wmGizmoGroupType *gzgt, struct wmKeyConfig *config);
 
+void WM_gizmogroup_ensure_init(
+        const struct bContext *C, struct wmGizmoGroup *gzgroup);
+
 /* Sort utilities for use with 'BLI_listbase_sort'. */
 int WM_gizmo_cmp_temp_fl(const void *gz_a_ptr, const void *gz_b_ptr);
 int WM_gizmo_cmp_temp_fl_reverse(const void *gz_a_ptr, const void *gz_b_ptr);
@@ -292,7 +295,7 @@ void WM_gizmomaptype_group_init_runtime_keymap(
 void WM_gizmomaptype_group_init_runtime(
         const struct Main *bmain, struct wmGizmoMapType *gzmap_type,
         struct wmGizmoGroupType *gzgt);
-void WM_gizmomaptype_group_init_runtime_with_region(
+wmGizmoGroup *WM_gizmomaptype_group_init_runtime_with_region(
         struct wmGizmoMapType *gzmap_type,
         struct wmGizmoGroupType *gzgt, struct ARegion *ar);
 void WM_gizmomaptype_group_unlink(
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c 
b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
index 9dcd3dc6743..821b452175b 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
@@ -190,7 +190,7 @@ void wm_gizmogroup_intersectable_gizmos_to_list(const 
wmGizmoGroup *gzgroup, Lis
        }
 }
 
-void wm_gizmogroup_ensure_initialized(wmGizmoGroup *gzgroup, const bContext *C)
+void WM_gizmogroup_ensure_init(const bContext *C, wmGizmoGroup *gzgroup)
 {
        /* prepare for first draw */
        if (UNLIKELY((gzgroup->init_flag & WM_GIZMOGROUP_INIT_SETUP) == 0)) {
@@ -806,7 +806,7 @@ void WM_gizmomaptype_group_init_runtime(
        }
 }
 
-void WM_gizmomaptype_group_init_runtime_with_region(
+wmGizmoGroup *WM_gizmomaptype_group_init_runtime_with_region(
         wmGizmoMapType *gzmap_type,
         wmGizmoGroupType *gzgt, ARegion *ar)
 {
@@ -814,10 +814,13 @@ void WM_gizmomaptype_group_init_runtime_with_region(
        BLI_assert(gzmap && gzmap->type == gzmap_type);
        UNUSED_VARS_NDEBUG(gzmap_type);
 
-       wm_gizmogroup_new_from_type(gzmap, gzgt);
+       wmGizmoGroup *gzgroup = wm_gizmogroup_new_from_type(gzmap, gzgt);
 
        wm_gizmomap_highlight_set(gzmap, NULL, NULL, 0);
+
        ED_region_tag_redraw(ar);
+
+       return gzgroup;
 }
 
 /**
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_intern.h 
b/source/blender/windowmanager/gizmo/intern/wm_gizmo_intern.h
index b89e46b4ba5..eabe4cce975 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_intern.h
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_intern.h
@@ -67,7 +67,6 @@ struct wmGizmo *wm_gizmogroup_find_intersected_gizmo(
         int *r_part);
 void wm_gizmogroup_intersectable_gizmos_to_list(
         const struct wmGizmoGroup *gzgroup, struct ListBase *listbase);
-void wm_gizmogroup_ensure_initialized(struct wmGizmoGroup *gzgroup, const 
struct bContext *C);
 bool wm_gizmogroup_is_visible_in_drawstep(
         const struct wmGizmoGroup *gzgroup, const eWM_GizmoFlagMapDrawStep 
drawstep);
 
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c 
b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
index b5081b0ebe9..824d36ec844 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
@@ -355,7 +355,7 @@ static void gizmomap_prepare_drawing(
                        gzgroup->init_flag &= ~WM_GIZMOGROUP_INIT_REFRESH;
                }
                /* Calls `setup`, `setup_keymap` and `refresh` if they're 
defined. */
-               wm_gizmogroup_ensure_initialized(gzgroup, C);
+               WM_gizmogroup_ensure_init(C, gzgroup);
 
                /* prepare drawing */
                if (gzgroup->type->draw_prepare) {
diff --git a/source/blender/windowmanager/intern/wm_event_system.c 
b/source/blender/windowmanager/intern/wm_event_system.c
index 8f4c2519e2d..ee32e045d29 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -2071,7 +2071,10 @@ static int wm_handler_operator_call(bContext *C, 
ListBase *handlers, wmEventHand
                                                                if (ar != NULL) 
{
                                                                        
wmGizmoMapType *gzmap_type = WM_gizmomaptype_ensure(&gzgt->gzmap_params);
                                                                        
WM_gizmo_group_type_ensure_ptr_ex(gzgt, gzmap_type);
-                                                                       
WM_gizmomaptype_group_init_runtime_with_region(gzmap_type, gzgt, ar);
+                                                                       
wmGizmoGroup *gzgroup = 
WM_gizmomaptype_group_init_runtime_with_region(gzmap_type, gzgt, ar);
+                                                                       /* We 
can't rely on drawing to initialize gizmo's since disabling
+                                                                        * 
overlays/gizmos will prevent pre-drawing setup calls. (see T60905) */
+                                                                       
WM_gizmogroup_ensure_init(C, gzgroup);
                                                                }
                                                        }
                                                }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to