[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