[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47016] branches/soc-2011-tomato/source/ blender: mask slide now auto-keys

Campbell Barton ideasman42 at gmail.com
Fri May 25 14:48:24 CEST 2012


Revision: 47016
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47016
Author:   campbellbarton
Date:     2012-05-25 12:48:24 +0000 (Fri, 25 May 2012)
Log Message:
-----------
mask slide now auto-keys

Modified Paths:
--------------
    branches/soc-2011-tomato/source/blender/blenkernel/intern/mask.c
    branches/soc-2011-tomato/source/blender/editors/include/ED_mask.h
    branches/soc-2011-tomato/source/blender/editors/mask/mask_ops.c
    branches/soc-2011-tomato/source/blender/editors/mask/mask_shapekey.c
    branches/soc-2011-tomato/source/blender/editors/transform/transform_conversions.c

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/mask.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/mask.c	2012-05-25 12:37:14 UTC (rev 47015)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/mask.c	2012-05-25 12:48:24 UTC (rev 47016)
@@ -1351,6 +1351,7 @@
 	                                       &spline, &spline_point_index))
 	{
 		/* sanity check */
+		/* the point has already been removed in this array so subtract one when comparing with the shapes */
 		int tot = BKE_mask_object_shape_totvert(maskobj) - 1;
 
 		/* for interpolation */
@@ -1376,8 +1377,8 @@
 		}
 
 		for (maskobj_shape = maskobj->splines_shapes.first;
-			 maskobj_shape;
-			 maskobj_shape = maskobj_shape->next)
+		     maskobj_shape;
+		     maskobj_shape = maskobj_shape->next)
 		{
 			if (tot == maskobj_shape->tot_vert) {
 				float *data_resized;
@@ -1386,14 +1387,14 @@
 				data_resized = MEM_mallocN(maskobj_shape->tot_vert * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE, __func__);
 				if (index > 0) {
 					memcpy(data_resized,
-						   maskobj_shape->data,
-						   index * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE);
+					       maskobj_shape->data,
+					       index * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE);
 				}
 
 				if (index != maskobj_shape->tot_vert - 1) {
 					memcpy(&data_resized[(index + 1) * MASK_OBJECT_SHAPE_ELEM_SIZE],
-						   maskobj_shape->data + (index * MASK_OBJECT_SHAPE_ELEM_SIZE),
-						   (maskobj_shape->tot_vert - (index + 1)) * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE);
+					       maskobj_shape->data + (index * MASK_OBJECT_SHAPE_ELEM_SIZE),
+					       (maskobj_shape->tot_vert - (index + 1)) * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE);
 				}
 
 				if (do_init) {
@@ -1404,16 +1405,16 @@
 					if (do_init_interpolate) {
 						for (i = 0; i < 3; i++) {
 							interp_weights_uv_v2_apply(uv[i],
-													   &fp[i * 2],
-													   &data_resized[(pi_prev_abs * MASK_OBJECT_SHAPE_ELEM_SIZE) + (i * 2)],
-													   &data_resized[(pi_next_abs * MASK_OBJECT_SHAPE_ELEM_SIZE) + (i * 2)]);
+							                           &fp[i * 2],
+							                           &data_resized[(pi_prev_abs * MASK_OBJECT_SHAPE_ELEM_SIZE) + (i * 2)],
+							                           &data_resized[(pi_next_abs * MASK_OBJECT_SHAPE_ELEM_SIZE) + (i * 2)]);
 						}
 					}
 				}
 				else {
 					memset(&data_resized[index * MASK_OBJECT_SHAPE_ELEM_SIZE],
-						   0,
-						   sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE);
+					       0,
+					       sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE);
 				}
 
 				MEM_freeN(maskobj_shape->data);
@@ -1428,24 +1429,43 @@
 }
 
 /* move array to account for removed point */
-#if 0
 void BKE_mask_object_shape_changed_remove(MaskObject *maskobj, int index)
 {
 	MaskObjectShape *maskobj_shape;
 
+	/* the point has already been removed in this array so add one when comparing with the shapes */
+	int tot = BKE_mask_object_shape_totvert(maskobj) + 1;
+
 	for (maskobj_shape = maskobj->splines_shapes.first;
 	     maskobj_shape;
 	     maskobj_shape = maskobj_shape->next)
 	{
-		if (frame == maskobj_shape->frame) {
-			return maskobj_shape;
+		if (tot == maskobj_shape->tot_vert) {
+			float *data_resized;
+
+			maskobj_shape->tot_vert--;
+			data_resized = MEM_mallocN(maskobj_shape->tot_vert * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE, __func__);
+			if (index > 0) {
+				memcpy(data_resized,
+				       maskobj_shape->data,
+				       (index - 1) * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE);
+			}
+
+			if (index != maskobj_shape->tot_vert - 1) {
+				memcpy(&data_resized[index * MASK_OBJECT_SHAPE_ELEM_SIZE],
+				       maskobj_shape->data + (index * MASK_OBJECT_SHAPE_ELEM_SIZE),
+				       (maskobj_shape->tot_vert - (index + 1)) * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE);
+			}
+
+			MEM_freeN(maskobj_shape->data);
+			maskobj_shape->data = data_resized;
 		}
-		else if (frame < maskobj_shape->frame) {
-			break;
+		else {
+			printf("%s: vert mismatch %d != %d (frame %d)\n",
+			       __func__, maskobj_shape->tot_vert, tot, maskobj_shape->frame);
 		}
 	}
 }
-#endif
 
 /* rasterization */
 void BKE_mask_rasterize(Mask *mask, int width, int height, float *buffer)

Modified: branches/soc-2011-tomato/source/blender/editors/include/ED_mask.h
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/include/ED_mask.h	2012-05-25 12:37:14 UTC (rev 47015)
+++ branches/soc-2011-tomato/source/blender/editors/include/ED_mask.h	2012-05-25 12:48:24 UTC (rev 47016)
@@ -41,4 +41,7 @@
 /* mask_draw.c */
 void ED_mask_draw(const bContext *C);
 
+/* mask_shapekey.c */
+int ED_mask_object_shape_auto_key_all(struct Mask *mask, const int frame);
+
 #endif /* ED_TEXT_H */

Modified: branches/soc-2011-tomato/source/blender/editors/mask/mask_ops.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/mask/mask_ops.c	2012-05-25 12:37:14 UTC (rev 47015)
+++ branches/soc-2011-tomato/source/blender/editors/mask/mask_ops.c	2012-05-25 12:48:24 UTC (rev 47016)
@@ -40,6 +40,7 @@
 #include "BKE_depsgraph.h"
 #include "BKE_mask.h"
 
+#include "DNA_scene_types.h"
 #include "DNA_mask_types.h"
 #include "DNA_object_types.h"  /* SELECT */
 
@@ -49,6 +50,7 @@
 #include "ED_screen.h"
 #include "ED_mask.h"
 #include "ED_clip.h"
+#include "ED_keyframing.h"
 
 #include "RNA_access.h"
 #include "RNA_define.h"
@@ -770,8 +772,14 @@
 
 		case LEFTMOUSE:
 			if (event->val == KM_RELEASE) {
+				Scene *scene = CTX_data_scene(C);
+
 				free_slide_point_data(op->customdata);
 
+				if (IS_AUTOKEY_ON(scene)) {
+					ED_mask_object_shape_auto_key_all(data->mask, CFRA);
+				}
+
 				WM_event_add_notifier(C, NC_MASK | NA_EDITED, data->mask);
 				DAG_id_tag_update(&data->mask->id, 0);
 

Modified: branches/soc-2011-tomato/source/blender/editors/mask/mask_shapekey.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/mask/mask_shapekey.c	2012-05-25 12:37:14 UTC (rev 47015)
+++ branches/soc-2011-tomato/source/blender/editors/mask/mask_shapekey.c	2012-05-25 12:48:24 UTC (rev 47016)
@@ -142,3 +142,19 @@
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
+
+int ED_mask_object_shape_auto_key_all(Mask *mask, const int frame)
+{
+	MaskObject *maskobj;
+	int change = FALSE;
+
+	for (maskobj = mask->maskobjs.first; maskobj; maskobj = maskobj->next) {
+		MaskObjectShape *maskobj_shape;
+
+		maskobj_shape = BKE_mask_object_shape_varify_frame(maskobj, frame);
+		BKE_mask_object_shape_from_mask(maskobj, maskobj_shape);
+		change = TRUE;
+	}
+
+	return change;
+}

Modified: branches/soc-2011-tomato/source/blender/editors/transform/transform_conversions.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/transform/transform_conversions.c	2012-05-25 12:37:14 UTC (rev 47015)
+++ branches/soc-2011-tomato/source/blender/editors/transform/transform_conversions.c	2012-05-25 12:48:24 UTC (rev 47016)
@@ -4913,16 +4913,9 @@
 
 			/* TODO - dont key all masks... */
 			if (IS_AUTOKEY_ON(t->scene)) {
-				MaskObject *maskobj;
 				Scene *scene = t->scene;
-				int frame = CFRA;
 
-				for (maskobj = mask->maskobjs.first; maskobj; maskobj = maskobj->next) {
-					MaskObjectShape *maskobj_shape;
-
-					maskobj_shape = BKE_mask_object_shape_varify_frame(maskobj, frame);
-					BKE_mask_object_shape_from_mask(maskobj, maskobj_shape);
-				}
+				ED_mask_object_shape_auto_key_all(mask, CFRA);
 			}
 		}
 	}




More information about the Bf-blender-cvs mailing list