[Bf-blender-cvs] [90f6fd0a365] master: Fix T60905: Crash using smooth tool

Campbell Barton noreply at git.blender.org
Fri Feb 15 03:35:43 CET 2019


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);
 								}
 							}
 						}



More information about the Bf-blender-cvs mailing list