[Bf-blender-cvs] [ddec812c5b2] greasepencil-object: Fix crashes after selecting GP keyframes with onion skinning enabled

Joshua Leung noreply at git.blender.org
Fri Dec 1 23:37:19 CET 2017


Commit: ddec812c5b22b0197cdb841e0eef9c526d5b67f9
Author: Joshua Leung
Date:   Sat Dec 2 11:37:11 2017 +1300
Branches: greasepencil-object
https://developer.blender.org/rBddec812c5b22b0197cdb841e0eef9c526d5b67f9

Fix crashes after selecting GP keyframes with onion skinning enabled

The code here was still using the old approach of just tagging all
GP datablocks for recalculation, instead of the newer depsgraph
tagging approach.

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

M	source/blender/editors/space_action/action_select.c

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

diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c
index 19c7d142a92..e5c384d8032 100644
--- a/source/blender/editors/space_action/action_select.c
+++ b/source/blender/editors/space_action/action_select.c
@@ -135,29 +135,25 @@ static void deselect_action_keys(bAnimContext *ac, short test, short sel)
 	
 	/* Now set the flags */
 	for (ale = anim_data.first; ale; ale = ale->next) {
-		if (ale->type == ANIMTYPE_GPLAYER)
+		if (ale->type == ANIMTYPE_GPLAYER) {
 			ED_gplayer_frame_select_set(ale->data, sel);
-		else if (ale->type == ANIMTYPE_MASKLAYER)
+			ale->update |= ANIM_UPDATE_DEPS;
+		}
+		else if (ale->type == ANIMTYPE_MASKLAYER) {
 			ED_masklayer_frame_select_set(ale->data, sel);
-		else
+		}
+		else {
 			ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, sel_cb, NULL); 
+		}
 	}
 	
 	/* Cleanup */
+	ANIM_animdata_update(ac, &anim_data);
 	ANIM_animdata_freelist(&anim_data);
 }
 
 /* ------------------- */
 
-/* helper to update grease pencil related data */
-static void gpencil_action_redraw(bContext *C, bAnimContext *ac)
-{
-	if ((ac) && (ac->datatype == ANIMCONT_GPENCIL)) {
-		BKE_gpencil_batch_cache_alldirty_main(CTX_data_main(C));
-		WM_event_add_notifier(C, NC_GPENCIL | NA_EDITED, NULL);
-	}
-}
-
 static int actkeys_deselectall_exec(bContext *C, wmOperator *op)
 {
 	bAnimContext ac;
@@ -172,8 +168,6 @@ static int actkeys_deselectall_exec(bContext *C, wmOperator *op)
 	else
 		deselect_action_keys(&ac, 1, SELECT_ADD);
 	
-	/* if grease pencil, redraw first */
-	gpencil_action_redraw(C, &ac);
 	/* set notifier that keyframe selection have changed */
 	WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, NULL);
 	
@@ -282,12 +276,16 @@ static void borderselect_action(bAnimContext *ac, const rcti rect, short mode, s
 					for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
 						ED_gplayer_frames_select_border(gpl, rectf.xmin, rectf.xmax, selectmode);
 					}
+					ale->update |= ANIM_UPDATE_DEPS;
 					break;
 				}
 #endif
 				case ANIMTYPE_GPLAYER:
+				{	
 					ED_gplayer_frames_select_border(ale->data, rectf.xmin, rectf.xmax, selectmode);
+					ale->update |= ANIM_UPDATE_DEPS;
 					break;
+				}
 				case ANIMTYPE_MASKDATABLOCK:
 				{
 					Mask *mask = ale->data;
@@ -311,6 +309,7 @@ static void borderselect_action(bAnimContext *ac, const rcti rect, short mode, s
 	}
 	
 	/* cleanup */
+	ANIM_animdata_update(ac, &anim_data);
 	ANIM_animdata_freelist(&anim_data);
 }
 
@@ -361,8 +360,6 @@ static int actkeys_borderselect_exec(bContext *C, wmOperator *op)
 	/* apply borderselect action */
 	borderselect_action(&ac, rect, mode, selectmode);
 	
-	/* if grease pencil, redraw first */
-	gpencil_action_redraw(C, &ac);
 	/* set notifier that keyframe selection have changed */
 	WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, NULL);
 	
@@ -480,6 +477,7 @@ static void region_select_action_keys(bAnimContext *ac, const rctf *rectf_view,
 		{
 			/* loop over data selecting */
 			switch (ale->type) {
+#if 0 /* XXX: Keyframes are not currently shown here */
 				case ANIMTYPE_GPDATABLOCK:
 				{
 					bGPdata *gpd = ale->data;
@@ -489,9 +487,11 @@ static void region_select_action_keys(bAnimContext *ac, const rctf *rectf_view,
 					}
 					break;
 				}
+#endif
 				case ANIMTYPE_GPLAYER:
 				{
 					ED_gplayer_frames_select_region(&ked, ale->data, mode, selectmode);
+					ale->update |= ANIM_UPDATE_DEPS;
 					break;
 				}
 				case ANIMTYPE_MASKDATABLOCK:
@@ -519,6 +519,7 @@ static void region_select_action_keys(bAnimContext *ac, const rctf *rectf_view,
 	}
 	
 	/* cleanup */
+	ANIM_animdata_update(ac, &anim_data);
 	ANIM_animdata_freelist(&anim_data);
 }
  
@@ -563,8 +564,6 @@ static int actkeys_lassoselect_exec(bContext *C, wmOperator *op)
 	
 	MEM_freeN((void *)data_lasso.mcords);
 	
-	/* if grease pencil, redraw first */
-	gpencil_action_redraw(C, &ac);
 	/* send notifier that keyframe selection has changed */
 	WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, NULL);
 	
@@ -624,8 +623,6 @@ static int action_circle_select_exec(bContext *C, wmOperator *op)
 	/* apply region select action */
 	region_select_action_keys(&ac, &rect_fl, BEZT_OK_CHANNEL_CIRCLE, selectmode, &data);
 	
-	/* if grease pencil, redraw first */
-	gpencil_action_redraw(C, &ac);
 	/* send notifier that keyframe selection has changed */
 	WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, NULL);
 	
@@ -710,6 +707,7 @@ static void markers_selectkeys_between(bAnimContext *ac)
 		}
 		else if (ale->type == ANIMTYPE_GPLAYER) {
 			ED_gplayer_frames_select_border(ale->data, min, max, SELECT_ADD);
+			ale->update |= ANIM_UPDATE_DEPS;
 		}
 		else if (ale->type == ANIMTYPE_MASKLAYER) {
 			ED_masklayer_frames_select_border(ale->data, min, max, SELECT_ADD);
@@ -720,6 +718,7 @@ static void markers_selectkeys_between(bAnimContext *ac)
 	}
 	
 	/* Cleanup */
+	ANIM_animdata_update(ac, &anim_data);
 	ANIM_animdata_freelist(&anim_data);
 }
 
@@ -736,8 +735,6 @@ static void columnselect_action_keys(bAnimContext *ac, short mode)
 	KeyframeEditFunc select_cb, ok_cb;
 	KeyframeEditData ked = {{NULL}};
 	
-	/* initialize keyframe editing data */
-	
 	/* build list of columns */
 	switch (mode) {
 		case ACTKEYS_COLUMNSEL_KEYS: /* list of selected keys */
@@ -801,17 +798,23 @@ static void columnselect_action_keys(bAnimContext *ac, short mode)
 				ked.f1 = ce->cfra;
 			
 			/* select elements with frame number matching cfraelem */
-			if (ale->type == ANIMTYPE_GPLAYER)
+			if (ale->type == ANIMTYPE_GPLAYER) {
 				ED_gpencil_select_frame(ale->data, ce->cfra, SELECT_ADD);
-			else if (ale->type == ANIMTYPE_MASKLAYER)
+				ale->update |= ANIM_UPDATE_DEPS;
+			}
+			else if (ale->type == ANIMTYPE_MASKLAYER) {
 				ED_mask_select_frame(ale->data, ce->cfra, SELECT_ADD);
-			else
+			}
+			else {
 				ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
+			}
 		}
 	}
 	
 	/* free elements */
 	BLI_freelistN(&ked.list);
+	
+	ANIM_animdata_update(ac, &anim_data);
 	ANIM_animdata_freelist(&anim_data);
 }
 
@@ -834,8 +837,6 @@ static int actkeys_columnselect_exec(bContext *C, wmOperator *op)
 	else
 		columnselect_action_keys(&ac, mode);
 	
-	/* if grease pencil, redraw first */
-	gpencil_action_redraw(C, &ac);
 	/* set notifier that keyframe selection have changed */
 	WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, NULL);
 	
@@ -894,8 +895,6 @@ static int actkeys_select_linked_exec(bContext *C, wmOperator *UNUSED(op))
 	/* Cleanup */
 	ANIM_animdata_freelist(&anim_data);
 	
-	/* if grease pencil, redraw first */
-	gpencil_action_redraw(C, &ac);
 	/* set notifier that keyframe selection has changed */
 	WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, NULL);
 	
@@ -973,8 +972,6 @@ static int actkeys_select_more_exec(bContext *C, wmOperator *UNUSED(op))
 	/* perform select changes */
 	select_moreless_action_keys(&ac, SELMAP_MORE);
 	
-	/* if grease pencil, redraw first */
-	gpencil_action_redraw(C, &ac);
 	/* set notifier that keyframe selection has changed */
 	WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, NULL);
 	
@@ -1009,8 +1006,6 @@ static int actkeys_select_less_exec(bContext *C, wmOperator *UNUSED(op))
 	/* perform select changes */
 	select_moreless_action_keys(&ac, SELMAP_LESS);
 	
-	/* if grease pencil, redraw first */
-	gpencil_action_redraw(C, &ac);
 	/* set notifier that keyframe selection has changed */
 	WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, NULL);
 	
@@ -1094,12 +1089,16 @@ static void actkeys_select_leftright(bAnimContext *ac, short leftright, short se
 			ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
 			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
 		}
-		else if (ale->type == ANIMTYPE_GPLAYER)
+		else if (ale->type == ANIMTYPE_GPLAYER) {
 			ED_gplayer_frames_select_border(ale->data, ked.f1, ked.f2, select_mode);
-		else if (ale->type == ANIMTYPE_MASKLAYER)
+			ale->update |= ANIM_UPDATE_DEPS;
+		}
+		else if (ale->type == ANIMTYPE_MASKLAYER) {
 			ED_masklayer_frames_select_border(ale->data, ked.f1, ked.f2, select_mode);
-		else
+		}
+		else {
 			ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
+		}
 	}
 	
 	/* Sync marker support */
@@ -1124,6 +1123,7 @@ static void actkeys_select_leftright(bAnimContext *ac, short leftright, short se
 	}
 
 	/* Cleanup */
+	ANIM_animdata_update(ac, &anim_data);
 	ANIM_animdata_freelist(&anim_data);
 }
 
@@ -1152,8 +1152,6 @@ static int actkeys_select_leftright_exec(bContext *C, wmOperator *op)
 	/* do the selecting now */
 	actkeys_select_leftright(&ac, leftright, selectmode);
 	
-	/* if grease pencil, redraw first */
-	gpencil_action_redraw(C, &ac);
 	/* set notifier that keyframe selection (and channels too) have changed */
 	WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | ND_ANIMCHAN | NA_SELECTED, NULL);
 	
@@ -1241,6 +1239,7 @@ static void actkeys_mselect_single(bAnimContext *ac, bAnimListElem *ale, short s
 	/* select the nominated keyframe on the given frame */
 	if (ale->type == ANIMTYPE_GPLAYER) {
 		ED_gpencil_select_frame(ale->data, selx, select_mode);
+		ale->update |= ANIM_UPDATE_DEPS;
 	}
 	else if (ale->type == ANIMTYPE_MASKLAYER) {
 		ED_mask_select_frame(ale->data, selx, select_mode);
@@ -1258,12 +1257,14 @@ static void actkeys_mselect_single(bAnimContext *ac, bAnimListElem *ale, short s
 			for (ale = anim_data.first; ale; ale = ale->next) {
 				if (ale->type == ANIMTYPE_GPLAYER) {
 					ED_gpencil_select_frame(ale->data, selx, select_mode);
+					ale->update |= ANIM_UPDATE_DEPS;
 				}
 				else if (ale->type == ANIMTYPE_MASKLAYER) {
 					ED_mask_select_frame(ale->data, selx, select_mode);
 				}
 			}
 			
+			ANIM_animdata_update(ac, &anim_data);
 			ANIM_animdata_freelist(&anim_data);
 		}
 		else {
@@ -1308,16 +1309,22 @@ static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float se
 			ked.f1 = selx;
 		
 		/* select elements with frame number matching cfra */
-		if (ale->type == ANIMTYPE_GPLAYER)
+		if (ale->type == ANIMTYPE_GPLAYER) {
 			ED_gpencil_select_frame(ale->key_data, 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list