[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58988] branches/soc-2011-tomato: Mask points now could be parented to the plane track

Sergey Sharybin sergey.vfx at gmail.com
Wed Aug 7 09:45:18 CEST 2013


Revision: 58988
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58988
Author:   nazgul
Date:     2013-08-07 07:45:17 +0000 (Wed, 07 Aug 2013)
Log Message:
-----------
Mask points now could be parented to the plane track

MaskParent structure was extended by:
- type, which indicates whether it's a parent to point
  or plane track. Types might be extended further.

- Original corners, which are used to obtain homography
  used to deform point's coordinate.

Homoraphy is detecting between original corners position
(corners at the parenting time) and current plne corners,
and the it's being applied on mask point coordinate.

Some tricks with switching between mask and clip coords
is needed, but it's all pretty much straightforward in
the code.

Parenting happens on spline point level, not spline one.
This fits existing design, and it's not so big difference
for artist.

Parenting operator (Ctrl-P) might for sure be used to
parent points to the active plane track.

Additional change: added visualization of plane corners
orientation. Corner which corresponds to left bottom
image corner now has got two axis: red which corresponds
to X axis, and green one for Y axis. This way it's
easier to orient corners on the footage.

Modified Paths:
--------------
    branches/soc-2011-tomato/release/scripts/startup/bl_ui/properties_mask_common.py
    branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
    branches/soc-2011-tomato/source/blender/blenkernel/intern/mask.c
    branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
    branches/soc-2011-tomato/source/blender/compositor/operations/COM_PlaneTrackWarpImageOperation.cpp
    branches/soc-2011-tomato/source/blender/editors/mask/mask_relationships.c
    branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c
    branches/soc-2011-tomato/source/blender/editors/space_clip/tracking_ops.c
    branches/soc-2011-tomato/source/blender/makesdna/DNA_mask_types.h
    branches/soc-2011-tomato/source/blender/makesrna/intern/rna_mask.c

Modified: branches/soc-2011-tomato/release/scripts/startup/bl_ui/properties_mask_common.py
===================================================================
--- branches/soc-2011-tomato/release/scripts/startup/bl_ui/properties_mask_common.py	2013-08-07 05:54:02 UTC (rev 58987)
+++ branches/soc-2011-tomato/release/scripts/startup/bl_ui/properties_mask_common.py	2013-08-07 07:45:17 UTC (rev 58988)
@@ -190,16 +190,21 @@
             clip = parent.id
             tracking = clip.tracking
 
+            row = col.row()
+            row.prop(parent, "type", expand=True)
+
             col.prop_search(parent, "parent", tracking,
                             "objects", icon='OBJECT_DATA', text="Object:")
 
+            tracks_list = "tracks" if parent.type == 'POINT_TRACK' else 'plane_tracks'
+
             if parent.parent in tracking.objects:
                 object = tracking.objects[parent.parent]
                 col.prop_search(parent, "sub_parent", object,
-                                "tracks", icon='ANIM_DATA', text="Track:")
+                                tracks_list, icon='ANIM_DATA', text="Track:")
             else:
                 col.prop_search(parent, "sub_parent", tracking,
-                                "tracks", icon='ANIM_DATA', text="Track:")
+                                tracks_list, icon='ANIM_DATA', text="Track:")
 
 
 class MASK_PT_display():

Modified: branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h	2013-08-07 05:54:02 UTC (rev 58987)
+++ branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h	2013-08-07 07:45:17 UTC (rev 58988)
@@ -235,6 +235,7 @@
 /* **** Plane tracking **** */
 
 void BKE_tracking_track_plane_from_existing_motion(struct MovieTrackingPlaneTrack *plane_track, int start_frame);
+void BKE_tracking_homography_between_two_quads(/*const*/ float reference_corners[4][2], /*const*/ float corners[4][2], float H[3][3]);
 
 /* **** Camera solving **** */
 int BKE_tracking_reconstruction_check(struct MovieTracking *tracking, struct MovieTrackingObject *object,

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/mask.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/mask.c	2013-08-07 05:54:02 UTC (rev 58987)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/mask.c	2013-08-07 07:45:17 UTC (rev 58988)
@@ -1095,7 +1095,7 @@
 	BKE_mask_coord_to_frame(r_co, co, frame_size);
 }
 
-static int BKE_mask_evaluate_parent(MaskParent *parent, float ctime, float r_co[2])
+static int mask_evaluate_parent(MaskParent *parent, float ctime, float orig_co[2], float r_co[2])
 {
 	if (!parent)
 		return FALSE;
@@ -1107,19 +1107,39 @@
 			MovieTrackingObject *ob = BKE_tracking_object_get_named(tracking, parent->parent);
 
 			if (ob) {
-				MovieTrackingTrack *track = BKE_tracking_track_get_named(tracking, ob, parent->sub_parent);
+				MovieClipUser user = {0};
 				float clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, ctime);
+				BKE_movieclip_user_set_frame(&user, ctime);
 
-				MovieClipUser user = {0};
-				user.framenr = ctime;
+				if (parent->type == MASK_PARENT_POINT_TRACK) {
+					MovieTrackingTrack *track = BKE_tracking_track_get_named(tracking, ob, parent->sub_parent);
 
-				if (track) {
-					float marker_pos_ofs[2];
-					BKE_tracking_marker_get_subframe_position(track, clip_framenr, marker_pos_ofs);
-					BKE_mask_coord_from_movieclip(clip, &user, r_co, marker_pos_ofs);
+					if (track) {
+						float marker_pos_ofs[2];
+						BKE_tracking_marker_get_subframe_position(track, clip_framenr, marker_pos_ofs);
+						BKE_mask_coord_from_movieclip(clip, &user, r_co, marker_pos_ofs);
 
-					return TRUE;
+						return TRUE;
+					}
 				}
+				else /* if (parent->type == MASK_PARENT_PLANE_TRACK) */ {
+					MovieTrackingPlaneTrack *plane_track = BKE_tracking_plane_track_get_named(tracking, ob, parent->sub_parent);
+
+					if (plane_track) {
+						MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get(plane_track, clip_framenr);
+						float H[3][3], vec[3], warped[3];
+
+						BKE_tracking_homography_between_two_quads(parent->parent_corners_orig, plane_marker->corners, H);
+
+						BKE_mask_coord_to_movieclip(clip, &user, vec, orig_co);
+						vec[2] = 1.0f;
+						mul_v3_m3v3(warped, H, vec);
+						warped[0] /= warped[2];
+						warped[1] /= warped[2];
+
+						BKE_mask_coord_from_movieclip(clip, &user, r_co, warped);
+					}
+				}
 			}
 		}
 	}
@@ -1127,17 +1147,26 @@
 	return FALSE;
 }
 
-/* could make external but for now its only used internally */
-static int mask_evaluate_parent_delta(MaskParent *parent, float ctime, float r_delta[2])
+static void mask_evaluate_apply_point_parent(MaskSplinePoint *point, float ctime)
 {
-	float parent_co[2];
+	MaskParent *parent = &point->parent;
 
-	if (BKE_mask_evaluate_parent(parent, ctime, parent_co)) {
-		sub_v2_v2v2(r_delta, parent_co, parent->parent_orig);
-		return TRUE;
+	if (parent->type == MASK_PARENT_POINT_TRACK) {
+		float parent_co[2];
+
+		if (mask_evaluate_parent(parent, ctime, NULL, parent_co)) {
+			float delta[2];
+			sub_v2_v2v2(delta, parent_co, parent->parent_orig);
+
+			add_v2_v2(point->bezt.vec[0], delta);
+			add_v2_v2(point->bezt.vec[1], delta);
+			add_v2_v2(point->bezt.vec[2], delta);
+		}
 	}
-	else {
-		return FALSE;
+	else /* if (parent->type == MASK_PARENT_PLANE_TRACK) */ {
+		mask_evaluate_parent(parent, ctime, point->bezt.vec[0], point->bezt.vec[0]);
+		mask_evaluate_parent(parent, ctime, point->bezt.vec[1], point->bezt.vec[1]);
+		mask_evaluate_parent(parent, ctime, point->bezt.vec[2], point->bezt.vec[2]);
 	}
 }
 
@@ -1461,18 +1490,13 @@
 			for (i = 0; i < spline->tot_point; i++) {
 				MaskSplinePoint *point = &spline->points[i];
 				MaskSplinePoint *point_deform = &spline->points_deform[i];
-				float delta[2];
 
 				BKE_mask_point_free(point_deform);
 
 				*point_deform = *point;
 				point_deform->uw = point->uw ? MEM_dupallocN(point->uw) : NULL;
 
-				if (mask_evaluate_parent_delta(&point->parent, ctime, delta)) {
-					add_v2_v2(point_deform->bezt.vec[0], delta);
-					add_v2_v2(point_deform->bezt.vec[1], delta);
-					add_v2_v2(point_deform->bezt.vec[2], delta);
-				}
+				mask_evaluate_apply_point_parent(point_deform, ctime);
 
 				if (ELEM(point->bezt.h1, HD_AUTO, HD_VECT)) {
 					need_handle_recalc = TRUE;

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2013-08-07 05:54:02 UTC (rev 58987)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2013-08-07 07:45:17 UTC (rev 58988)
@@ -3415,6 +3415,27 @@
 	track_plane_from_existing_motion(plane_track, start_frame, -1);
 }
 
+BLI_INLINE void float_corners_to_double(/*const*/ float corners[4][2], double double_corners[4][2])
+{
+	copy_v2db_v2fl(double_corners[0], corners[0]);
+	copy_v2db_v2fl(double_corners[1], corners[1]);
+	copy_v2db_v2fl(double_corners[2], corners[2]);
+	copy_v2db_v2fl(double_corners[3], corners[3]);
+}
+
+void BKE_tracking_homography_between_two_quads(/*const*/ float reference_corners[4][2], /*const*/ float corners[4][2], float H[3][3])
+{
+	Vec2 x1[4], x2[4];
+	double H_double[3][3];
+
+	float_corners_to_double(reference_corners, x1);
+	float_corners_to_double(corners, x2);
+
+	libmv_homography2DFromCorrespondencesLinear(x1, x2, 4, H_double, 1e-8);
+
+	mat3f_from_mat3d(H, H_double);
+}
+
 /*********************** Camera solving *************************/
 
 typedef struct MovieReconstructContext {

Modified: branches/soc-2011-tomato/source/blender/compositor/operations/COM_PlaneTrackWarpImageOperation.cpp
===================================================================
--- branches/soc-2011-tomato/source/blender/compositor/operations/COM_PlaneTrackWarpImageOperation.cpp	2013-08-07 05:54:02 UTC (rev 58987)
+++ branches/soc-2011-tomato/source/blender/compositor/operations/COM_PlaneTrackWarpImageOperation.cpp	2013-08-07 07:45:17 UTC (rev 58988)
@@ -140,7 +140,7 @@
 		u = inputUV[0] * this->m_pixelReader->getWidth();
 		v = inputUV[1] * this->m_pixelReader->getHeight();
 
-		this->m_pixelReader->read(output, u, v, dx, dy, COM_PS_NEAREST);
+		this->m_pixelReader->read(output, u, v, dx, dy, COM_PS_BICUBIC);
 	}
 	else {
 		zero_v4(output);

Modified: branches/soc-2011-tomato/source/blender/editors/mask/mask_relationships.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/mask/mask_relationships.c	2013-08-07 05:54:02 UTC (rev 58987)
+++ branches/soc-2011-tomato/source/blender/editors/mask/mask_relationships.c	2013-08-07 07:45:17 UTC (rev 58988)
@@ -102,33 +102,54 @@
 	MaskLayer *masklay;
 
 	/* parent info */
-	SpaceClip *sc;
-	MovieClip *clip;
+	SpaceClip *sc = CTX_wm_space_clip(C);
+	MovieClip *clip = ED_space_clip_get_clip(sc);
+	MovieTracking *tracking;
 	MovieTrackingTrack *track;
-	MovieTrackingMarker *marker;
+	MovieTrackingPlaneTrack *plane_track;
 	MovieTrackingObject *tracking_object;
 	/* done */
 
-	int framenr;
+	int framenr, parent_type;
+	float parmask_pos[2], orig_corners[4][2];
+	char *sub_parent_name;
 
-	float marker_pos_ofs[2];
-	float parmask_pos[2];
-
-	if ((NULL == (sc = CTX_wm_space_clip(C))) ||
-	    (NULL == (clip = sc->clip)) ||
-	    (NULL == (track = clip->tracking.act_track)) ||
-	    (NULL == (tracking_object = BKE_tracking_object_get_active(&clip->tracking))))
-	{
+	if (ELEM(NULL, sc, clip)) {
 		return OPERATOR_CANCELLED;
 	}
 
 	framenr = ED_space_clip_get_clip_frame_number(sc);
-	marker = BKE_tracking_marker_get(track, framenr);
 
-	add_v2_v2v2(marker_pos_ofs, marker->pos, track->offset);
+	tracking = &clip->tracking;
+	tracking_object = BKE_tracking_object_get_active(&clip->tracking);
 
-	BKE_mask_coord_from_movieclip(clip, &sc->user, parmask_pos, marker_pos_ofs);
+	if (tracking_object == NULL) {
+		return OPERATOR_CANCELLED;
+	}
 
+	if ((track = BKE_tracking_track_get_active(tracking)) != NULL) {
+		MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
+		float marker_pos_ofs[2];
+
+		add_v2_v2v2(marker_pos_ofs, marker->pos, track->offset);
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list