[Bf-blender-cvs] [b626772] GPencil_EditStrokes: GP DopeSheet: It is now possible to set keyframe types for Grease Pencil frames

Joshua Leung noreply at git.blender.org
Tue Oct 14 15:32:29 CEST 2014


Commit: b62677210e5f0f48e0d3724ccb865d7c939d7d5b
Author: Joshua Leung
Date:   Wed Oct 15 02:31:41 2014 +1300
Branches: GPencil_EditStrokes
https://developer.blender.org/rBb62677210e5f0f48e0d3724ccb865d7c939d7d5b

GP DopeSheet: It is now possible to set keyframe types for Grease Pencil frames

Use the R-key shortcut as for normal keyframes

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

M	source/blender/editors/animation/keyframes_draw.c
M	source/blender/editors/gpencil/editaction_gpencil.c
M	source/blender/editors/include/ED_gpencil.h
M	source/blender/editors/space_action/action_edit.c
M	source/blender/makesdna/DNA_gpencil_types.h

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

diff --git a/source/blender/editors/animation/keyframes_draw.c b/source/blender/editors/animation/keyframes_draw.c
index c5e54cc..c5e5068 100644
--- a/source/blender/editors/animation/keyframes_draw.c
+++ b/source/blender/editors/animation/keyframes_draw.c
@@ -155,6 +155,7 @@ static DLRBT_Node *nalloc_ak_gpframe(void *data)
 	/* store settings based on state of BezTriple */
 	ak->cfra = gpf->framenum;
 	ak->sel = (gpf->flag & GP_FRAME_SELECT) ? SELECT : 0;
+	ak->key_type = gpf->key_type;
 	
 	/* set 'modified', since this is used to identify long keyframes */
 	ak->modified = 1;
@@ -171,6 +172,10 @@ static void nupdate_ak_gpframe(void *node, void *data)
 	/* set selection status and 'touched' status */
 	if (gpf->flag & GP_FRAME_SELECT) ak->sel = SELECT;
 	ak->modified += 1;
+	
+	/* for keyframe type, 'proper' keyframes have priority over breakdowns (and other types for now) */
+	if (gpf->key_type == BEZT_KEYTYPE_KEYFRAME)
+		ak->key_type = BEZT_KEYTYPE_KEYFRAME;
 }
 
 /* ......... */
diff --git a/source/blender/editors/gpencil/editaction_gpencil.c b/source/blender/editors/gpencil/editaction_gpencil.c
index dba8016..388a638 100644
--- a/source/blender/editors/gpencil/editaction_gpencil.c
+++ b/source/blender/editors/gpencil/editaction_gpencil.c
@@ -253,6 +253,23 @@ void ED_gplayer_frames_duplicate(bGPDlayer *gpl)
 	}
 }
 
+/* Set keyframe type for selected frames from given gp-layer 
+ * \param type The type of keyframe (eBezTriple_KeyframeType) to set selected frames to
+ */
+void ED_gplayer_frames_keytype_set(bGPDlayer *gpl, short type)
+{
+	bGPDframe *gpf;
+	
+	if (gpl == NULL)
+		return;
+	
+	for (gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+		if (gpf->flag & GP_FRAME_SELECT) {
+			gpf->key_type = type;
+		}
+	}
+}
+
 #if 0 // XXX disabled until grease pencil code stabilises again
 /* -------------------------------------- */
 /* Copy and Paste Tools */
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index 332c7be..1587582 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -113,6 +113,8 @@ void  ED_gpencil_select_frame(struct bGPDlayer *gpl, int selx, short select_mode
 bool  ED_gplayer_frames_delete(struct bGPDlayer *gpl);
 void  ED_gplayer_frames_duplicate(struct bGPDlayer *gpl);
 
+void ED_gplayer_frames_keytype_set(struct bGPDlayer *gpl, short type);
+
 void  ED_gplayer_snap_frames(struct bGPDlayer *gpl, struct Scene *scene, short mode);
 
 #if 0
diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c
index 091d3fe..da1a31b 100644
--- a/source/blender/editors/space_action/action_edit.c
+++ b/source/blender/editors/space_action/action_edit.c
@@ -1324,7 +1324,7 @@ void ACTION_OT_handle_type(wmOperatorType *ot)
 
 /* ******************** Set Keyframe-Type Operator *********************** */
 
-/* this function is responsible for setting interpolation mode for keyframes */
+/* this function is responsible for setting keyframe type for keyframes */
 static void setkeytype_action_keys(bAnimContext *ac, short mode) 
 {
 	ListBase anim_data = {NULL, NULL};
@@ -1349,6 +1349,29 @@ static void setkeytype_action_keys(bAnimContext *ac, short mode)
 	ANIM_animdata_freelist(&anim_data);
 }
 
+/* this function is responsible for setting the keyframe type for Grease Pencil frames */
+static void setkeytype_gpencil_keys(bAnimContext *ac, short mode)
+{
+	ListBase anim_data = {NULL, NULL};
+	bAnimListElem *ale;
+	int filter;
+	
+	/* filter data */
+	filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS);
+	ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+	
+	/* loop through each layer */
+	for (ale = anim_data.first; ale; ale = ale->next) {
+		if (ale->type == ANIMTYPE_GPLAYER) {
+			ED_gplayer_frames_keytype_set(ale->data, mode);
+			ale->update |= ANIM_UPDATE_DEPS;
+		}
+	}
+
+	ANIM_animdata_update(ac, &anim_data);
+	ANIM_animdata_freelist(&anim_data);
+}
+
 /* ------------------- */
 
 static int actkeys_keytype_exec(bContext *C, wmOperator *op)
@@ -1359,14 +1382,22 @@ static int actkeys_keytype_exec(bContext *C, wmOperator *op)
 	/* get editor data */
 	if (ANIM_animdata_get_context(C, &ac) == 0)
 		return OPERATOR_CANCELLED;
-	if (ELEM(ac.datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK))
+		
+	if (ac.datatype == ANIMCONT_MASK) {
+		BKE_report(op->reports, RPT_ERROR, "Not implemented for Masks");
 		return OPERATOR_PASS_THROUGH;
+	}
 		
 	/* get handle setting mode */
 	mode = RNA_enum_get(op->ptr, "type");
 	
 	/* set handle type */
-	setkeytype_action_keys(&ac, mode);
+	if (ac.datatype == ANIMCONT_GPENCIL) {
+		setkeytype_gpencil_keys(&ac, mode);
+	}
+	else {
+		setkeytype_action_keys(&ac, mode);
+	}
 	
 	/* set notifier that keyframe properties have changed */
 	WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME_PROP, NULL);
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index d4f3cf6..8e7804d 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -90,7 +90,9 @@ typedef struct bGPDframe {
 	ListBase strokes;	/* list of the simplified 'strokes' that make up the frame's data */
 	
 	int framenum;		/* frame number of this frame */
-	int flag;			/* temp settings */
+	
+	short flag;			/* temp settings */
+	short key_type;		/* keyframe type (eBezTriple_KeyframeType) */
 } bGPDframe;
 
 /* bGPDframe->flag */




More information about the Bf-blender-cvs mailing list