[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38024] branches/soc-2011-tomato: Camera tracking integration

Sergey Sharybin g.ulairi at gmail.com
Fri Jul 1 19:12:08 CEST 2011


Revision: 38024
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38024
Author:   nazgul
Date:     2011-07-01 17:12:08 +0000 (Fri, 01 Jul 2011)
Log Message:
-----------
Camera tracking integration
===========================

- Removed unneeded checking of marker==NULL
- Tracks could be named now.
- Implemented "Follow Track" constraint to "parent"
  objects to tracks from movie clip.
- Added operator to create such constraint for active object
  using clip and track from current context.

Modified Paths:
--------------
    branches/soc-2011-tomato/release/scripts/startup/bl_ui/properties_object_constraint.py
    branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py
    branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
    branches/soc-2011-tomato/source/blender/blenkernel/intern/constraint.c
    branches/soc-2011-tomato/source/blender/blenkernel/intern/depsgraph.c
    branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
    branches/soc-2011-tomato/source/blender/editors/object/object_constraint.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/editors/transform/transform.c
    branches/soc-2011-tomato/source/blender/editors/transform/transform_generics.c
    branches/soc-2011-tomato/source/blender/makesdna/DNA_constraint_types.h
    branches/soc-2011-tomato/source/blender/makesdna/DNA_tracking_types.h
    branches/soc-2011-tomato/source/blender/makesrna/intern/rna_constraint.c
    branches/soc-2011-tomato/source/blender/makesrna/intern/rna_tracking.c

Modified: branches/soc-2011-tomato/release/scripts/startup/bl_ui/properties_object_constraint.py
===================================================================
--- branches/soc-2011-tomato/release/scripts/startup/bl_ui/properties_object_constraint.py	2011-07-01 16:39:13 UTC (rev 38023)
+++ branches/soc-2011-tomato/release/scripts/startup/bl_ui/properties_object_constraint.py	2011-07-01 17:12:08 UTC (rev 38024)
@@ -751,6 +751,10 @@
         col = layout.column()
         col.prop(con, "rotation_range", text="Pivot When")
 
+    def FOLLOW_TRACK(self, context, layout, con):
+        layout.prop(con, "clip")
+        layout.prop(con, "track")
+
     def SCRIPT(self, context, layout, con):
         layout.label("Blender 2.5 has no py-constraints")
 

Modified: branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py
===================================================================
--- branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py	2011-07-01 16:39:13 UTC (rev 38023)
+++ branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py	2011-07-01 17:12:08 UTC (rev 38024)
@@ -20,6 +20,42 @@
 import bpy
 
 
+class CLIP_OT_apply_follow_track(bpy.types.Operator):
+    bl_idname = "clip.apply_follow_track"
+    bl_label = "Apply Follow Track"
+    bl_options = {'UNDO', 'REGISTER'}
+
+    @classmethod
+    def poll(cls, context):
+        if context.space_data.type != 'CLIP_EDITOR':
+            return False
+
+        sc = context.space_data
+        clip = sc.clip
+
+        return clip and clip.tracking.active_track and context.active_object
+
+    def execute(self, context):
+        ob = context.active_object
+        sc = context.space_data
+        clip = sc.clip
+        track = clip.tracking.active_track
+        constraint = None
+
+        for con in ob.constraints:
+            if con.type == 'FOLLOW_TRACK':
+                constraint = con
+                break
+
+        if constraint is None:
+            constraint = ob.constraints.new(type='FOLLOW_TRACK')
+
+        constraint.clip = sc.clip
+        constraint.track = track.name
+
+        return {'FINISHED'}
+
+
 class CLIP_HT_header(bpy.types.Header):
     bl_space_type = 'CLIP_EDITOR'
 
@@ -96,16 +132,17 @@
         sc = context.space_data
         clip = sc.clip
 
-        return clip and clip.tracking.act_track
+        return clip and clip.tracking.active_track
 
     def draw(self, context):
         layout = self.layout
         sc = context.space_data
         clip = context.space_data.clip
+        act_track = clip.tracking.active_track
 
-        layout.template_track(clip.tracking, "act_track", sc.clip_user, clip)
+        layout.prop(act_track, "name")
 
-        act_track = clip.tracking.act_track
+        layout.template_track(clip.tracking, "active_track", sc.clip_user, clip)
 
         if act_track:
             row = layout.row()
@@ -190,6 +227,7 @@
         layout = self.layout
         sc = context.space_data
 
+        layout.operator("clip.apply_follow_track")
         layout.operator("clip.track_to_fcurves")
 
 

Modified: branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h	2011-07-01 16:39:13 UTC (rev 38023)
+++ branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h	2011-07-01 17:12:08 UTC (rev 38024)
@@ -64,6 +64,9 @@
 void BKE_tracking_sync_user(struct MovieClipUser *user, struct MovieTrackingContext *context);
 int BKE_tracking_next(struct MovieTrackingContext *context);
 
+void BKE_track_unique_name(struct MovieTracking *tracking, struct MovieTrackingTrack *track);
+struct MovieTrackingTrack *BKE_find_track_by_name(struct MovieTracking *tracking, const char *name);
+
 #define TRACK_SELECTED(track) ((track)->flag&SELECT || (track)->pat_flag&SELECT || (track)->search_flag&SELECT)
 #define TRACK_AREA_SELECTED(track, area) ((area)==TRACK_AREA_POINT?(track)->flag&SELECT : ((area)==TRACK_AREA_PAT?(track)->pat_flag&SELECT:(track)->search_flag&SELECT))
 

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/constraint.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/constraint.c	2011-07-01 16:39:13 UTC (rev 38023)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/constraint.c	2011-07-01 17:12:08 UTC (rev 38024)
@@ -57,6 +57,8 @@
 #include "DNA_lattice_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_text_types.h"
+#include "DNA_tracking_types.h"
+#include "DNA_movieclip_types.h"
 
 
 #include "BKE_action.h"
@@ -75,6 +77,8 @@
 #include "BKE_idprop.h"
 #include "BKE_shrinkwrap.h"
 #include "BKE_mesh.h"
+#include "BKE_tracking.h"
+#include "BKE_movieclip.h"
 
 #ifdef WITH_PYTHON
 #include "BPY_extern.h"
@@ -3929,6 +3933,62 @@
 	pivotcon_evaluate /* evaluate */
 };
 
+/* ----------- Follow Track ------------- */
+
+static void followtrack_new_data (void *cdata)
+{
+	bFollowTrackConstraint *data= (bFollowTrackConstraint *)cdata;
+
+	data->clip= NULL;
+}
+
+static void followtrack_id_looper (bConstraint *con, ConstraintIDFunc func, void *userdata)
+{
+	bFollowTrackConstraint *data= con->data;
+
+	func(con, (ID**)&data->clip, userdata);
+}
+
+static void followtrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *UNUSED(targets))
+{
+	bFollowTrackConstraint *data= con->data;
+	MovieClipUser user;
+	MovieTrackingTrack *track;
+	MovieTrackingMarker *marker;
+	float tx, ty;
+	int width, height;
+
+	if(!data->clip || !data->track[0])
+		return;
+
+	user.framenr= cob->scene->r.cfra;
+	BKE_movieclip_acquire_size(data->clip, &user, &width, &height);
+
+	track= BKE_find_track_by_name(&data->clip->tracking, data->track);
+	marker= BKE_tracking_get_marker(track, user.framenr);
+
+	tx= marker->pos[0]*width;
+	ty= marker->pos[1]*height;
+
+	translate_m4(cob->matrix, tx, ty, 0);
+}
+
+static bConstraintTypeInfo CTI_FOLLOWTRACK = {
+	CONSTRAINT_TYPE_FOLLOWTRACK, /* type */
+	sizeof(bFollowTrackConstraint), /* size */
+	"Follow Track", /* name */
+	"bFollowTrackConstraint", /* struct name */
+	NULL, /* free data */
+	NULL, /* relink data */
+	followtrack_id_looper, /* id looper */
+	NULL, /* copy data */
+	followtrack_new_data, /* new data */
+	NULL, /* get constraint targets */
+	NULL, /* flush constraint targets */
+	NULL, /* get target matrix */
+	followtrack_evaluate /* evaluate */
+};
+
 /* ************************* Constraints Type-Info *************************** */
 /* All of the constraints api functions use bConstraintTypeInfo structs to carry out
  * and operations that involve constraint specific code.
@@ -3966,6 +4026,7 @@
 	constraintsTypeInfo[23]= &CTI_TRANSLIKE;		/* Copy Transforms Constraint */
 	constraintsTypeInfo[24]= &CTI_SAMEVOL;			/* Maintain Volume Constraint */
 	constraintsTypeInfo[25]= &CTI_PIVOT;			/* Pivot Constraint */
+	constraintsTypeInfo[26]= &CTI_FOLLOWTRACK;		/* Follow Track Constraint */
 }
 
 /* This function should be used for getting the appropriate type-info when only

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/depsgraph.c	2011-07-01 16:39:13 UTC (rev 38023)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/depsgraph.c	2011-07-01 17:12:08 UTC (rev 38024)
@@ -51,6 +51,7 @@
 #include "DNA_scene_types.h"
 #include "DNA_screen_types.h"
 #include "DNA_windowmanager_types.h"
+#include "DNA_movieclip_types.h"
 
 #include "BKE_animsys.h"
 #include "BKE_action.h"
@@ -639,7 +640,15 @@
 		ListBase targets = {NULL, NULL};
 		bConstraintTarget *ct;
 		
-		if (cti && cti->get_constraint_targets) {
+		if(!cti)
+			continue;
+
+		/* special case for FollowTrack -- it doesn't use targets to define relations */
+		if(cti->type==CONSTRAINT_TYPE_FOLLOWTRACK) {
+			dag_add_relation(dag,scenenode,node,DAG_RL_SCENE, "Scene Relation");
+			addtoroot = 0;
+		}
+		else if (cti->get_constraint_targets) {
 			cti->get_constraint_targets(con, &targets);
 			
 			for (ct= targets.first; ct; ct= ct->next) {
@@ -2073,18 +2082,25 @@
 			ListBase targets = {NULL, NULL};
 			bConstraintTarget *ct;
 			
-			if (cti && cti->get_constraint_targets) {
-				cti->get_constraint_targets(con, &targets);
-				
-				for (ct= targets.first; ct; ct= ct->next) {
-					if (ct->tar) {
-						ob->recalc |= OB_RECALC_OB;
-						break;
+			if (cti) {
+				/* special case for FollowTrack -- it doesn't use targets to define relations */
+				if(cti->type==CONSTRAINT_TYPE_FOLLOWTRACK) {
+					ob->recalc |= OB_RECALC_OB;
+				}
+				else if (cti->get_constraint_targets) {
+					cti->get_constraint_targets(con, &targets);
+					
+					for (ct= targets.first; ct; ct= ct->next) {
+						if (ct->tar) {
+							ob->recalc |= OB_RECALC_OB;
+							break;
+						}
 					}
+					
+					if (cti->flush_constraint_targets)
+						cti->flush_constraint_targets(con, &targets, 1);
 				}
 				
-				if (cti->flush_constraint_targets)
-					cti->flush_constraint_targets(con, &targets, 1);
 			}
 		}
 	}
@@ -2442,6 +2458,19 @@
 						BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH);
 		}
 
+		if(idtype == ID_MC) {
+			for(obt=bmain->object.first; obt; obt= obt->id.next){
+				bConstraint *con;
+				for (con = obt->constraints.first; con; con=con->next) {
+					bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+					if(cti->type == CONSTRAINT_TYPE_FOLLOWTRACK) {
+						obt->recalc |= OB_RECALC_OB;
+						break;
+					}
+				}
+			}
+		}
+
 		/* update editors */
 		dag_editors_update(bmain, id);
 	}

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2011-07-01 16:39:13 UTC (rev 38023)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2011-07-01 17:12:08 UTC (rev 38024)
@@ -30,6 +30,8 @@
  *  \ingroup bke
  */
 
+#include <stddef.h>
+
 #include "MEM_guardedalloc.h"
 
 #include "DNA_movieclip_types.h"
@@ -663,3 +665,22 @@
 
 	return ok;
 }
+
+void BKE_track_unique_name(MovieTracking *tracking, MovieTrackingTrack *track)
+{
+	BLI_uniquename(&tracking->tracks, track, "Track", '.', offsetof(MovieTrackingTrack, name), sizeof(track->name));
+}
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list