void PlaneTrackCommonOperation::initExecution()
{
	MovieTracking *tracking;
	MovieTrackingObject *object;

	memset(this->m_corners, 0, sizeof(this->m_corners));
	memset(this->m_frameSpaceCorners, 0, sizeof(this->m_frameSpaceCorners));

	if (!this->m_movieClip)
		return;

	tracking = &this->m_movieClip->tracking;

	object = BKE_tracking_object_get_named(tracking, this->m_trackingObjectName);
	if (object) {
		MovieTrackingPlaneTrack *plane_track;

		plane_track = BKE_tracking_plane_track_get_named(tracking, object, this->m_planeTrackName);

		if (plane_track) {
			MovieTrackingPlaneMarker *plane_marker;
			int clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(this->m_movieClip, this->m_framenumber);

			plane_marker = BKE_tracking_plane_marker_get(plane_track, clip_framenr);
			memcpy(this->m_corners, plane_marker->corners, sizeof(this->m_corners));
		}
	}

	for (int i = 0; i < 4; i++) {
		this->m_frameSpaceCorners[i][0] = this->m_corners[i][0] * this->getWidth();
		this->m_frameSpaceCorners[i][1] = this->m_corners[i][1] * this->getHeight();
	}
}
static void rna_Mask_update_parent(Main *bmain, Scene *scene, PointerRNA *ptr)
{
	MaskParent *parent = ptr->data;

	if (parent->id) {
		if (GS(parent->id->name) == ID_MC) {
			MovieClip *clip = (MovieClip *) parent->id;
			MovieTracking *tracking = &clip->tracking;
			MovieTrackingObject *object = BKE_tracking_object_get_named(tracking, parent->parent);

			if (object) {
				int clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, scene->r.cfra);

				if (parent->type == MASK_PARENT_POINT_TRACK) {
					MovieTrackingTrack *track = BKE_tracking_track_get_named(tracking, object, parent->sub_parent);

					if (track) {
						MovieTrackingMarker *marker = BKE_tracking_marker_get(track, clip_framenr);
						float marker_pos_ofs[2], parmask_pos[2];
						MovieClipUser user = {0};

						BKE_movieclip_user_set_frame(&user, scene->r.cfra);

						add_v2_v2v2(marker_pos_ofs, marker->pos, track->offset);

						BKE_mask_coord_from_movieclip(clip, &user, parmask_pos, marker_pos_ofs);

						copy_v2_v2(parent->parent_orig, parmask_pos);
					}
				}
				else /* if (parent->type == MASK_PARENT_PLANE_TRACK) */ {
					MovieTrackingPlaneTrack *plane_track = BKE_tracking_plane_track_get_named(tracking, object, parent->sub_parent);
					if (plane_track) {
						MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get(plane_track, clip_framenr);

						memcpy(parent->parent_corners_orig, plane_marker->corners, sizeof(parent->parent_corners_orig));
						zero_v2(parent->parent_orig);
					}
				}
			}
		}
	}

	rna_Mask_update_data(bmain, scene, ptr);
}