[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