[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46969] branches/soc-2011-tomato/source/ blender: shapekeys for masks - this doesnt use existing shapekey code however.

Campbell Barton ideasman42 at gmail.com
Thu May 24 15:31:36 CEST 2012


Revision: 46969
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46969
Author:   campbellbarton
Date:     2012-05-24 13:31:36 +0000 (Thu, 24 May 2012)
Log Message:
-----------
shapekeys for masks - this doesnt use existing shapekey code however.

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/blenkernel/intern/scene.c
    branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c
    branches/soc-2011-tomato/source/blender/blenloader/intern/writefile.c
    branches/soc-2011-tomato/source/blender/editors/mask/CMakeLists.txt
    branches/soc-2011-tomato/source/blender/editors/mask/mask_editor.c
    branches/soc-2011-tomato/source/blender/editors/mask/mask_intern.h
    branches/soc-2011-tomato/source/blender/makesdna/DNA_mask_types.h

Modified: branches/soc-2011-tomato/source/blender/blenkernel/BKE_mask.h
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/BKE_mask.h	2012-05-24 13:18:53 UTC (rev 46968)
+++ branches/soc-2011-tomato/source/blender/blenkernel/BKE_mask.h	2012-05-24 13:31:36 UTC (rev 46969)
@@ -31,6 +31,7 @@
 struct Mask;
 struct MaskParent;
 struct MaskObject;
+struct MaskObjectShape;
 struct MaskSpline;
 struct MaskSplinePoint;
 struct MaskSplinePointUW;
@@ -83,8 +84,8 @@
 
 /* parenting */
 
-void BKE_mask_evaluate_all_masks(struct Main *bmain, float ctime);
-void BKE_mask_update_scene(struct Main *bmain, struct Scene *scene);
+void BKE_mask_evaluate_all_masks(struct Main *bmain, float ctime, const int do_newframe);
+void BKE_mask_update_scene(struct Main *bmain, struct Scene *scene, const int do_newframe);
 void BKE_mask_parent_init(struct MaskParent *parent);
 void BKE_mask_calc_handle_adjacent_length(struct Mask *mask, struct MaskSpline *spline, struct MaskSplinePoint *point);
 void BKE_mask_calc_handle_point(struct Mask *mask, struct MaskSpline *spline, struct MaskSplinePoint *point);
@@ -93,6 +94,22 @@
                                         struct MaskSplinePoint **r_point_prev, struct MaskSplinePoint **r_point_next);
 void BKE_mask_calc_handles(struct Mask *mask);
 
+/* animation */
+int  BKE_mask_object_shape_totvert(struct MaskObject *maskobj);
+void BKE_mask_object_shape_from_mask(struct MaskObject *maskobj, struct MaskObjectShape *maskobj_shape);
+void BKE_mask_object_shape_to_mask(struct MaskObject *maskobj, struct MaskObjectShape *maskobj_shape);
+void BKE_mask_object_shape_to_mask_interp(struct MaskObject *maskobj,
+                                          struct MaskObjectShape *maskobj_shape_a,
+                                          struct MaskObjectShape *maskobj_shape_b,
+                                          const float fac);
+struct MaskObjectShape *BKE_mask_object_shape_find_frame(struct MaskObject *maskobj, int frame);
+int BKE_mask_object_shape_find_frame_range(struct MaskObject *maskobj, int frame,
+                                           struct MaskObjectShape **r_maskobj_shape_a,
+                                           struct MaskObjectShape **r_maskobj_shape_b);
+struct MaskObjectShape *BKE_mask_object_shape_varify_frame(struct MaskObject *maskobj, int frame);
+void BKE_mask_object_shape_unlink(struct MaskObject *maskobj, struct MaskObjectShape *maskobj_shape);
+void BKE_mask_object_shape_sort(struct MaskObject *maskobj);
+
 #define MASKPOINT_ISSEL(p)  ( ((p)->bezt.f1 | (p)->bezt.f2 | (p)->bezt.f2) & SELECT)
 #define MASKPOINT_SEL(p)    { (p)->bezt.f1 |=  SELECT; (p)->bezt.f2 |=  SELECT; (p)->bezt.f3 |=  SELECT; } (void)0
 #define MASKPOINT_DESEL(p)  { (p)->bezt.f1 &= ~SELECT; (p)->bezt.f2 &= ~SELECT; (p)->bezt.f3 &= ~SELECT; } (void)0

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/mask.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/mask.c	2012-05-24 13:18:53 UTC (rev 46968)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/mask.c	2012-05-24 13:31:36 UTC (rev 46969)
@@ -662,10 +662,20 @@
 	MEM_freeN(spline);
 }
 
+void BKE_mask_object_shape_free(MaskObjectShape *maskobj_shape)
+{
+	MEM_freeN(maskobj_shape->data);
+
+	MEM_freeN(maskobj_shape);
+}
+
 void BKE_mask_object_free(MaskObject *maskobj)
 {
-	MaskSpline *spline = maskobj->splines.first;
+	MaskSpline *spline;
+	MaskObjectShape *maskobj_shape;
 
+	/* free splines */
+	spline = maskobj->splines.first;
 	while (spline) {
 		MaskSpline *next_spline = spline->next;
 
@@ -675,6 +685,17 @@
 		spline = next_spline;
 	}
 
+	/* free animation data */
+	maskobj_shape = maskobj->splines_shapes.first;
+	while (maskobj_shape) {
+		MaskObjectShape *next_maskobj_shape = maskobj_shape->next;
+
+		BLI_remlink(&maskobj->splines_shapes, maskobj_shape);
+		BKE_mask_object_shape_free(maskobj_shape);
+
+		maskobj_shape = next_maskobj_shape;
+	}
+
 	MEM_freeN(maskobj);
 }
 
@@ -956,7 +977,7 @@
 	}
 }
 
-void BKE_mask_evaluate(Mask *mask, float ctime)
+void BKE_mask_evaluate(Mask *mask, float ctime, const int do_newframe)
 {
 	MaskObject *maskobj;
 
@@ -964,6 +985,42 @@
 		MaskSpline *spline;
 		int i;
 
+		/* animation if available */
+		if (do_newframe) {
+			//MaskObjectShape *maskobj_shape = BKE_mask_object_shape_find_frame(maskobj, (int)ctime);
+
+			MaskObjectShape *maskobj_shape_a;
+			MaskObjectShape *maskobj_shape_b;
+			int found;
+
+			if ((found = BKE_mask_object_shape_find_frame_range(maskobj, (int)ctime,
+			                                                    &maskobj_shape_a, &maskobj_shape_b)))
+			{
+				if (found == 1) {
+#if 0
+					printf("%s: exact %d %d (%d)\n", __func__, (int)ctime, BLI_countlist(&maskobj->splines_shapes),
+					       maskobj_shape_a->frame);
+#endif
+
+					BKE_mask_object_shape_to_mask(maskobj, maskobj_shape_a);
+				}
+				else if (found == 2) {
+					float w = maskobj_shape_b->frame - maskobj_shape_a->frame;
+#if 0
+					printf("%s: tween %d %d (%d %d)\n", __func__, (int)ctime, BLI_countlist(&maskobj->splines_shapes),
+					       maskobj_shape_a->frame, maskobj_shape_b->frame);
+#endif
+					BKE_mask_object_shape_to_mask_interp(maskobj, maskobj_shape_a, maskobj_shape_b,
+					                                     (ctime - maskobj_shape_a->frame) / w);
+				}
+				else {
+					/* always fail, should never happen */
+					BLI_assert(found == 2);
+				}
+			}
+		}
+		/* animation done... */
+
 		for (spline = maskobj->splines.first; spline; spline = spline->next) {
 			for (i = 0; i < spline->tot_point; i++) {
 				MaskSplinePoint *point = &spline->points[i];
@@ -984,22 +1041,22 @@
 	BKE_mask_calc_handles(mask);
 }
 
-void BKE_mask_evaluate_all_masks(Main *bmain, float ctime)
+void BKE_mask_evaluate_all_masks(Main *bmain, float ctime, const int do_newframe)
 {
 	Mask *mask;
 
 	for (mask = bmain->mask.first; mask; mask = mask->id.next) {
-		BKE_mask_evaluate(mask, ctime);
+		BKE_mask_evaluate(mask, ctime, do_newframe);
 	}
 }
 
-void BKE_mask_update_scene(Main *bmain, Scene *scene)
+void BKE_mask_update_scene(Main *bmain, Scene *scene, const int do_newframe)
 {
 	Mask *mask;
 
 	for (mask = bmain->mask.first; mask; mask = mask->id.next) {
 		if (mask->id.flag & LIB_ID_RECALC) {
-			BKE_mask_evaluate_all_masks(bmain, CFRA);
+			BKE_mask_evaluate_all_masks(bmain, CFRA, do_newframe);
 		}
 	}
 }
@@ -1008,3 +1065,211 @@
 {
 	parent->id_type = ID_MC;
 }
+
+
+/* *** own animation/shapekey implimentation ***
+ * BKE_mask_object_shape_XXX */
+
+int BKE_mask_object_shape_totvert(MaskObject *maskobj)
+{
+	int tot = 0;
+	MaskSpline *spline;
+
+	for (spline = maskobj->splines.first; spline; spline = spline->next) {
+		tot += spline->tot_point;
+	}
+
+	return tot;
+}
+
+/* these functions match. copy is swapped */
+void BKE_mask_object_shape_from_mask(MaskObject *maskobj, MaskObjectShape *maskobj_shape)
+{
+	int tot = BKE_mask_object_shape_totvert(maskobj);
+
+	if (maskobj_shape->tot_vert == tot) {
+		float *fp = maskobj_shape->data;
+
+		MaskSpline *spline;
+		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;
+			}
+		}
+	}
+	else {
+		printf("%s: vert mismatch %d != %d\n", __func__, maskobj_shape->tot_vert, tot);
+	}
+}
+
+void BKE_mask_object_shape_to_mask(MaskObject *maskobj, MaskObjectShape *maskobj_shape)
+{
+	int tot = BKE_mask_object_shape_totvert(maskobj);
+
+	if (maskobj_shape->tot_vert == tot) {
+		float *fp = maskobj_shape->data;
+
+		MaskSpline *spline;
+		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;
+			}
+		}
+	}
+	else {
+		printf("%s: vert mismatch %d != %d\n", __func__, maskobj_shape->tot_vert, tot);
+	}
+}
+
+BLI_INLINE void interp_v2_v2v2_flfl(float target[2], const float a[2], const float b[2],
+                              const float t, const float s)
+{
+	target[0] = s * a[0] + t * b[0];
+	target[1] = s * a[1] + t * b[1];
+}
+
+/* linear interpolation only */
+void BKE_mask_object_shape_to_mask_interp(MaskObject *maskobj,
+                                          MaskObjectShape *maskobj_shape_a,
+                                          MaskObjectShape *maskobj_shape_b,
+                                          const float fac)
+{
+	int tot = BKE_mask_object_shape_totvert(maskobj);
+	printf("%.6f\n", fac);
+	if (maskobj_shape_a->tot_vert == tot && maskobj_shape_b->tot_vert == tot) {
+		float *fp_a = maskobj_shape_a->data;
+		float *fp_b = maskobj_shape_b->data;
+		const float ifac = 1.0f - fac;
+
+		MaskSpline *spline;
+		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 *** */
+				interp_v2_v2v2_flfl(bezt->vec[0], fp_a, fp_b, fac, ifac); fp_a += 2; fp_b += 2;
+				interp_v2_v2v2_flfl(bezt->vec[1], fp_a, fp_b, fac, ifac); fp_a += 2; fp_b += 2;
+				interp_v2_v2v2_flfl(bezt->vec[2], fp_a, fp_b, fac, ifac); fp_a += 2; fp_b += 2;
+				bezt->weight = (fp_a[0] * ifac) + (fp_b[0] * fac);
+				bezt->radius = (fp_a[1] * ifac) + (fp_b[1] * fac); fp_a += 2; fp_b += 2;
+			}
+		}
+	}
+	else {
+		printf("%s: vert mismatch %d != %d != %d\n",
+		       __func__, maskobj_shape_a->tot_vert, maskobj_shape_b->tot_vert, tot);
+	}
+}
+
+MaskObjectShape *BKE_mask_object_shape_find_frame(MaskObject *maskobj, int frame)
+{
+	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;
+		}

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list