[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46982] branches/soc-2011-tomato/source/ blender: adding new keyframes now updates existing shapekeys

Campbell Barton ideasman42 at gmail.com
Thu May 24 21:16:09 CEST 2012


Revision: 46982
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46982
Author:   campbellbarton
Date:     2012-05-24 19:16:08 +0000 (Thu, 24 May 2012)
Log Message:
-----------
adding new keyframes now updates existing shapekeys

Modified Paths:
--------------
    branches/soc-2011-tomato/source/blender/blenkernel/BKE_mask.h
    branches/soc-2011-tomato/source/blender/blenkernel/intern/mask.c
    branches/soc-2011-tomato/source/blender/editors/mask/mask_ops.c

Modified: branches/soc-2011-tomato/source/blender/blenkernel/BKE_mask.h
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/BKE_mask.h	2012-05-24 18:22:36 UTC (rev 46981)
+++ branches/soc-2011-tomato/source/blender/blenkernel/BKE_mask.h	2012-05-24 19:16:08 UTC (rev 46982)
@@ -110,6 +110,11 @@
 void BKE_mask_object_shape_unlink(struct MaskObject *maskobj, struct MaskObjectShape *maskobj_shape);
 void BKE_mask_object_shape_sort(struct MaskObject *maskobj);
 
+int BKE_mask_object_shape_spline_index(struct MaskObject *maskobj, int index,
+                                       struct MaskSpline **r_maskobj_shape, int *r_index);
+void BKE_mask_object_shape_changed_add(struct MaskObject *maskobj, int index,
+                                       int do_init, int do_init_interpolate);
+
 /* rasterization */
 void BKE_mask_rasterize(struct Mask *mask, int width, int height, float *buffer);
 

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/mask.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/mask.c	2012-05-24 18:22:36 UTC (rev 46981)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/mask.c	2012-05-24 19:16:08 UTC (rev 46982)
@@ -1082,6 +1082,24 @@
 	return tot;
 }
 
+static void mask_object_shape_from_mask_point(BezTriple *bezt, float fp[MASK_OBJECT_SHAPE_ELEM_SIZE])
+{
+	copy_v2_v2(&fp[0], bezt->vec[0]);
+	copy_v2_v2(&fp[2], bezt->vec[1]);
+	copy_v2_v2(&fp[4], bezt->vec[2]);
+	fp[6] = bezt->weight;
+	fp[7] = bezt->radius;
+}
+
+static void mask_object_shape_to_mask_point(BezTriple *bezt, float fp[MASK_OBJECT_SHAPE_ELEM_SIZE])
+{
+	copy_v2_v2(bezt->vec[0], &fp[0]);
+	copy_v2_v2(bezt->vec[1], &fp[2]);
+	copy_v2_v2(bezt->vec[2], &fp[4]);
+	bezt->weight = fp[6];
+	bezt->radius = fp[7];
+}
+
 /* these functions match. copy is swapped */
 void BKE_mask_object_shape_from_mask(MaskObject *maskobj, MaskObjectShape *maskobj_shape)
 {
@@ -1094,13 +1112,8 @@
 		for (spline = maskobj->splines.first; spline; spline = spline->next) {
 			int i;
 			for (i = 0; i < spline->tot_point; i++) {
-				BezTriple *bezt = &spline->points[i].bezt;
-				/* *** BKE_mask_object_shape_to_mask - swapped *** */
-				copy_v2_v2(fp, bezt->vec[0]); fp += 2;
-				copy_v2_v2(fp, bezt->vec[1]); fp += 2;
-				copy_v2_v2(fp, bezt->vec[2]); fp += 2;
-				fp[0] = bezt->weight;
-				fp[1] = bezt->radius;         fp += 2;
+				mask_object_shape_from_mask_point(&spline->points[i].bezt, fp);
+				fp += MASK_OBJECT_SHAPE_ELEM_SIZE;
 			}
 		}
 	}
@@ -1120,13 +1133,8 @@
 		for (spline = maskobj->splines.first; spline; spline = spline->next) {
 			int i;
 			for (i = 0; i < spline->tot_point; i++) {
-				BezTriple *bezt = &spline->points[i].bezt;
-				/* *** BKE_mask_object_shape_from_mask - swapped *** */
-				copy_v2_v2(bezt->vec[0], fp); fp += 2;
-				copy_v2_v2(bezt->vec[1], fp); fp += 2;
-				copy_v2_v2(bezt->vec[2], fp); fp += 2;
-				bezt->weight = fp[0];
-				bezt->radius = fp[1];         fp += 2;
+				mask_object_shape_to_mask_point(&spline->points[i].bezt, fp);
+				fp += MASK_OBJECT_SHAPE_ELEM_SIZE;
 			}
 		}
 	}
@@ -1287,6 +1295,96 @@
 	BLI_sortlist(&maskobj->splines_shapes, mask_object_shape_sort_cb);
 }
 
+int BKE_mask_object_shape_spline_index(MaskObject *maskobj, int index,
+                                       MaskSpline **r_maskobj_shape, int *r_index)
+{
+	MaskSpline *spline;
+
+	for (spline = maskobj->splines.first; spline; spline = spline->next) {
+		if (index < spline->tot_point) {
+			*r_maskobj_shape = spline;
+			*r_index = index;
+			return TRUE;
+		}
+		index -= spline->tot_point;
+	}
+
+	return FALSE;
+}
+
+/* when a now points added - resize all shapekey array  */
+void BKE_mask_object_shape_changed_add(MaskObject *maskobj, int index,
+                                       int do_init, int do_init_interpolate)
+{
+	MaskObjectShape *maskobj_shape;
+
+	for (maskobj_shape = maskobj->splines_shapes.first;
+	     maskobj_shape;
+	     maskobj_shape = maskobj_shape->next)
+	{
+		/* spline index from maskobj */
+		MaskSpline *spline;
+		int         spline_point_index;
+
+		float *data_resized;
+
+		if (BKE_mask_object_shape_spline_index(maskobj, index,
+		                                       &spline, &spline_point_index))
+		{
+			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 * sizeof(float) * MASK_OBJECT_SHAPE_ELEM_SIZE);
+			}
+
+			if (do_init) {
+				if (do_init_interpolate) {
+					/* TODO */
+				}
+				else {
+					mask_object_shape_from_mask_point(&spline->points[spline_point_index].bezt, &data_resized[index * MASK_OBJECT_SHAPE_ELEM_SIZE]);
+				}
+			}
+			else {
+				memset(&data_resized[index * MASK_OBJECT_SHAPE_ELEM_SIZE],
+				       0,
+				       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);
+			}
+
+			MEM_freeN(maskobj_shape->data);
+			maskobj_shape->data = data_resized;
+		}
+	}
+}
+
+/* move array to account for removed point */
+#if 0
+void BKE_mask_object_shape_changed_remove(MaskObject *maskobj, int index)
+{
+	MaskObjectShape *maskobj_shape;
+
+	for (maskobj_shape = maskobj->splines_shapes.first;
+	     maskobj_shape;
+	     maskobj_shape = maskobj_shape->next)
+	{
+		if (frame == maskobj_shape->frame) {
+			return maskobj_shape;
+		}
+		else if (frame < maskobj_shape->frame) {
+			break;
+		}
+	}
+}
+#endif
+
 /* rasterization */
 void BKE_mask_rasterize(Mask *mask, int width, int height, float *buffer)
 {

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-24 18:22:36 UTC (rev 46981)
+++ branches/soc-2011-tomato/source/blender/editors/mask/mask_ops.c	2012-05-24 19:16:08 UTC (rev 46982)
@@ -972,6 +972,23 @@
 
 		setup_vertex_point(C, mask, spline, new_point, co, tangent, NULL, TRUE);
 
+
+		{
+
+			/* this block could be a function */
+			MaskSpline *spline_iter;
+			int i_abs = 0;
+			for (spline_iter = maskobj->splines.first;
+			     spline_iter && spline_iter != spline;
+			     spline_iter = spline_iter->next, i_abs += spline_iter->tot_point)
+			{
+				/* pass */
+			}
+
+			/* TODO - we could pass the spline! */
+			BKE_mask_object_shape_changed_add(maskobj, i_abs + point_index + 1, TRUE, FALSE);
+		}
+
 		maskobj->act_point = new_point;
 
 		WM_event_add_notifier(C, NC_MASK | NA_EDITED, mask);




More information about the Bf-blender-cvs mailing list