[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47610] trunk/blender/source/blender: mask animation keys now editable in the dope sheet (duplicate, transform, delete, select- etc).

Campbell Barton ideasman42 at gmail.com
Fri Jun 8 16:31:48 CEST 2012


Revision: 47610
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47610
Author:   campbellbarton
Date:     2012-06-08 14:31:38 +0000 (Fri, 08 Jun 2012)
Log Message:
-----------
mask animation keys now editable in the dope sheet (duplicate, transform, delete, select- etc).

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_mask.h
    trunk/blender/source/blender/blenkernel/intern/mask.c
    trunk/blender/source/blender/editors/animation/anim_channels_defines.c
    trunk/blender/source/blender/editors/animation/anim_channels_edit.c
    trunk/blender/source/blender/editors/animation/anim_filter.c
    trunk/blender/source/blender/editors/animation/keyframes_draw.c
    trunk/blender/source/blender/editors/include/ED_anim_api.h
    trunk/blender/source/blender/editors/include/ED_gpencil.h
    trunk/blender/source/blender/editors/include/ED_keyframes_draw.h
    trunk/blender/source/blender/editors/include/ED_mask.h
    trunk/blender/source/blender/editors/mask/CMakeLists.txt
    trunk/blender/source/blender/editors/space_action/action_draw.c
    trunk/blender/source/blender/editors/space_action/action_edit.c
    trunk/blender/source/blender/editors/space_action/action_select.c
    trunk/blender/source/blender/editors/transform/transform.h
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/editors/transform/transform_generics.c
    trunk/blender/source/blender/makesdna/DNA_action_types.h
    trunk/blender/source/blender/makesdna/DNA_mask_types.h
    trunk/blender/source/blender/makesrna/intern/rna_space.c

Added Paths:
-----------
    trunk/blender/source/blender/editors/mask/mask_editaction.c

Modified: trunk/blender/source/blender/blenkernel/BKE_mask.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mask.h	2012-06-08 13:08:58 UTC (rev 47609)
+++ trunk/blender/source/blender/blenkernel/BKE_mask.h	2012-06-08 14:31:38 UTC (rev 47610)
@@ -151,6 +151,7 @@
 struct MaskLayerShape *BKE_mask_layer_shape_alloc(struct MaskLayer *masklay, const int frame);
 void BKE_mask_layer_shape_free(struct MaskLayerShape *masklay_shape);
 struct MaskLayerShape *BKE_mask_layer_shape_varify_frame(struct MaskLayer *masklay, const int frame);
+struct MaskLayerShape *BKE_mask_layer_shape_duplicate(struct MaskLayerShape *masklay_shape);
 void BKE_mask_layer_shape_unlink(struct MaskLayer *masklay, struct MaskLayerShape *masklay_shape);
 void BKE_mask_layer_shape_sort(struct MaskLayer *masklay);
 

Modified: trunk/blender/source/blender/blenkernel/intern/mask.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mask.c	2012-06-08 13:08:58 UTC (rev 47609)
+++ trunk/blender/source/blender/blenkernel/intern/mask.c	2012-06-08 14:31:38 UTC (rev 47610)
@@ -1820,6 +1820,19 @@
 	return masklay_shape;
 }
 
+MaskLayerShape *BKE_mask_layer_shape_duplicate(MaskLayerShape *masklay_shape)
+{
+	MaskLayerShape *masklay_shape_copy;
+
+	masklay_shape_copy = MEM_dupallocN(masklay_shape);
+
+	if (LIKELY(masklay_shape_copy->data)) {
+		masklay_shape_copy->data = MEM_dupallocN(masklay_shape_copy->data);
+	}
+
+	return masklay_shape_copy;
+}
+
 void BKE_mask_layer_shape_unlink(MaskLayer *masklay, MaskLayerShape *masklay_shape)
 {
 	BLI_remlink(&masklay->splines_shapes, masklay_shape);

Modified: trunk/blender/source/blender/editors/animation/anim_channels_defines.c
===================================================================
--- trunk/blender/source/blender/editors/animation/anim_channels_defines.c	2012-06-08 13:08:58 UTC (rev 47609)
+++ trunk/blender/source/blender/editors/animation/anim_channels_defines.c	2012-06-08 14:31:38 UTC (rev 47610)
@@ -54,6 +54,7 @@
 #include "DNA_world_types.h"
 #include "DNA_gpencil_types.h"
 #include "DNA_speaker_types.h"
+#include "DNA_mask_types.h"
 
 #include "RNA_access.h"
 
@@ -2516,6 +2517,172 @@
 	acf_gpl_setting_ptr             /* pointer for setting */
 };
 
+
+/* Mask Datablock ------------------------------------------- */
+
+/* get backdrop color for mask datablock widget */
+static void acf_mask_color(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), float r_color[3])
+{
+	/* these are ID-blocks, but not exactly standalone... */
+	UI_GetThemeColorShade3fv(TH_DOPESHEET_CHANNELSUBOB, 20, r_color);
+}
+
+// TODO: just get this from RNA?
+static int acf_mask_icon(bAnimListElem *UNUSED(ale))
+{
+	return ICON_GREASEPENCIL; // MASK_TODO - need real icon
+}
+
+/* check if some setting exists for this channel */
+static short acf_mask_setting_valid(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), int setting)
+{
+	switch (setting) {
+		/* only select and expand supported */
+		case ACHANNEL_SETTING_SELECT:
+		case ACHANNEL_SETTING_EXPAND:
+			return 1;
+
+		default:
+			return 0;
+	}
+}
+
+/* get the appropriate flag(s) for the setting when it is valid  */
+static int acf_mask_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
+{
+	/* clear extra return data first */
+	*neg = 0;
+
+	switch (setting) {
+		case ACHANNEL_SETTING_SELECT: /* selected */
+			return AGRP_SELECTED;
+
+		case ACHANNEL_SETTING_EXPAND: /* expanded */
+			return MASK_ANIMF_EXPAND;
+	}
+
+	/* this shouldn't happen */
+	return 0;
+}
+
+/* get pointer to the setting */
+static void *acf_mask_setting_ptr(bAnimListElem *ale, int UNUSED(setting), short *type)
+{
+	Mask *mask = (Mask *)ale->data;
+
+	/* all flags are just in mask->flag for now... */
+	return GET_ACF_FLAG_PTR(mask->flag, type);
+}
+
+/* mask datablock type define */
+static bAnimChannelType ACF_MASKDATA =
+{
+	"Mask Datablock",            /* type name */
+
+	acf_mask_color,                  /* backdrop color */
+	acf_group_backdrop,             /* backdrop */
+	acf_generic_indention_0,        /* indent level */
+	acf_generic_group_offset,       /* offset */
+
+	acf_generic_idblock_name,       /* name */
+	acf_generic_idfill_nameprop,    /* name prop */
+	acf_mask_icon,                   /* icon */
+
+	acf_mask_setting_valid,          /* has setting */
+	acf_mask_setting_flag,           /* flag for setting */
+	acf_mask_setting_ptr             /* pointer for setting */
+};
+
+/* Mask Layer ------------------------------------------- */
+
+/* name for grease pencil layer entries */
+static void acf_masklay_name(bAnimListElem *ale, char *name)
+{
+	MaskLayer *masklay = (MaskLayer *)ale->data;
+
+	if (masklay && name)
+		BLI_strncpy(name, masklay->name, ANIM_CHAN_NAME_SIZE);
+}
+
+/* name property for grease pencil layer entries */
+static short acf_masklay_name_prop(bAnimListElem *ale, PointerRNA *ptr, PropertyRNA **prop)
+{
+	if (ale->data) {
+		RNA_pointer_create(ale->id, &RNA_MaskLayer, ale->data, ptr);
+		*prop = RNA_struct_name_property(ptr->type);
+
+		return (*prop != NULL);
+	}
+
+	return 0;
+}
+
+/* check if some setting exists for this channel */
+static short acf_masklay_setting_valid(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), int setting)
+{
+	switch (setting) {
+		/* unsupported */
+		case ACHANNEL_SETTING_EXPAND: /* mask layers are more like F-Curves than groups */
+		case ACHANNEL_SETTING_VISIBLE: /* graph editor only */
+			return 0;
+
+		/* always available */
+		default:
+			return 1;
+	}
+}
+
+/* get the appropriate flag(s) for the setting when it is valid  */
+static int acf_masklay_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
+{
+	/* clear extra return data first */
+	*neg = 0;
+
+	switch (setting) {
+		case ACHANNEL_SETTING_SELECT: /* selected */
+			return MASK_LAYERFLAG_SELECT;
+
+//		case ACHANNEL_SETTING_MUTE: /* muted */
+//			return GP_LAYER_HIDE;
+
+		case ACHANNEL_SETTING_PROTECT: /* protected */
+			// *neg = 1; - if we change this to edtiability
+			return MASK_LAYERFLAG_LOCKED;
+
+		default: /* unsupported */
+			return 0;
+	}
+}
+
+/* get pointer to the setting */
+static void *acf_masklay_setting_ptr(bAnimListElem *ale, int UNUSED(setting), short *type)
+{
+	MaskLayer *masklay = (MaskLayer *)ale->data;
+
+	/* all flags are just in agrp->flag for now... */
+	return GET_ACF_FLAG_PTR(masklay->flag, type);
+}
+
+/* grease pencil layer type define */
+static bAnimChannelType ACF_MASKLAYER =
+{
+	"Mask Layer",                /* type name */
+
+	acf_generic_channel_color,      /* backdrop color */
+	acf_generic_channel_backdrop,   /* backdrop */
+	acf_generic_indention_flexible, /* indent level */
+	acf_generic_group_offset,       /* offset */
+
+	acf_masklay_name,                   /* name */
+	acf_masklay_name_prop,              /* name prop */
+	NULL,                           /* icon */
+
+	acf_masklay_setting_valid,          /* has setting */
+	acf_masklay_setting_flag,           /* flag for setting */
+	acf_masklay_setting_ptr             /* pointer for setting */
+};
+
+
 /* *********************************************** */
 /* Type Registration and General Access */
 
@@ -2566,6 +2733,9 @@
 		animchannelTypeInfo[type++] = &ACF_GPD;          /* Grease Pencil Datablock */
 		animchannelTypeInfo[type++] = &ACF_GPL;          /* Grease Pencil Layer */
 
+		animchannelTypeInfo[type++] = &ACF_MASKDATA;     /* Mask Datablock */
+		animchannelTypeInfo[type++] = &ACF_MASKLAYER;    /* Mask Layer */
+
 		// TODO: these types still need to be implemented!!!
 		// probably need a few extra flags for these special cases...
 		animchannelTypeInfo[type++] = NULL;              /* NLA Track */

Modified: trunk/blender/source/blender/editors/animation/anim_channels_edit.c
===================================================================
--- trunk/blender/source/blender/editors/animation/anim_channels_edit.c	2012-06-08 13:08:58 UTC (rev 47609)
+++ trunk/blender/source/blender/editors/animation/anim_channels_edit.c	2012-06-08 14:31:38 UTC (rev 47610)
@@ -43,6 +43,7 @@
 #include "DNA_scene_types.h"
 #include "DNA_key_types.h"
 #include "DNA_gpencil_types.h"
+#include "DNA_mask_types.h"
 
 #include "RNA_access.h"
 #include "RNA_define.h"
@@ -51,6 +52,7 @@
 #include "BKE_fcurve.h"
 #include "BKE_gpencil.h"
 #include "BKE_context.h"
+#include "BKE_mask.h"
 #include "BKE_global.h"
 
 #include "UI_view2d.h"
@@ -258,6 +260,10 @@
 					if (ale->flag & GP_LAYER_SELECT)
 						sel = ACHANNEL_SETFLAG_CLEAR;
 					break;
+				case ANIMTYPE_MASKLAYER:
+					if (ale->flag & MASK_LAYERFLAG_SELECT)
+						sel = ACHANNEL_SETFLAG_CLEAR;
+					break;
 			}
 		}
 	}
@@ -354,6 +360,14 @@
 				ACHANNEL_SET_FLAG(gpl, sel, GP_LAYER_SELECT);
 			}
 			break;
+
+			case ANIMTYPE_MASKLAYER:
+			{
+				MaskLayer *masklay = (MaskLayer *)ale->data;
+
+				ACHANNEL_SET_FLAG(masklay, sel, MASK_LAYERFLAG_SELECT);
+			}
+			break;
 		}
 	}
 	
@@ -1055,6 +1069,10 @@
 		/* Grease Pencil channels */
 		printf("Grease Pencil not supported for moving yet\n");
 	}
+	else if (ac.datatype == ANIMCONT_MASK) {
+		/* Grease Pencil channels */
+		printf("Mask does not supported for moving yet\n");
+	}
 	else if (ac.datatype == ANIMCONT_ACTION) {
 		/* Directly rearrange action's channels */
 		rearrange_action_channels(&ac, ac.data, mode);
@@ -1205,6 +1223,17 @@
 				BLI_freelinkN(&gpd->layers, gpl);
 			}
 			break;
+
+			case ANIMTYPE_MASKLAYER:
+			{
+				/* Grease Pencil layer */
+				Mask *mask = (Mask *)ale->id;
+				MaskLayer *masklay = (MaskLayer *)ale->data;
+
+				/* try to delete the layer's data and the layer itself */
+				BKE_mask_layer_remove(mask, masklay);
+			}
+			break;
 		}
 	}
 	
@@ -2287,6 +2316,36 @@
 			notifierFlags |= (ND_ANIMCHAN | NA_EDITED);
 		}
 		break;
+		case ANIMTYPE_MASKDATABLOCK:
+		{
+			Mask *mask = (Mask *)ale->data;
+
+			/* toggle expand
+			 *	- although the triangle widget already allows this, the whole channel can also be used for this purpose
+			 */
+			mask->flag ^= MASK_ANIMF_EXPAND;
+
+			notifierFlags |= (ND_ANIMCHAN | NA_EDITED);
+		}
+		break;
+		case ANIMTYPE_MASKLAYER:
+		{
+			MaskLayer *masklay = (MaskLayer *)ale->data;
+
+			/* select/deselect */
+			if (selectmode == SELECT_INVERT) {
+				/* invert selection status of this layer only */
+				masklay->flag ^= MASK_LAYERFLAG_SELECT;
+			}
+			else {
+				/* select layer by itself */
+				ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list