Revision: 38487
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38487
Author:   nazgul
Date:     2011-07-18 18:45:05 +0000 (Mon, 18 Jul 2011)
Log Message:
-----------
Camera tracking integration
===========================

Changed behavior of "Follow Track" constraint for tracks.

Now tracking coordinates are mapped to plane which is
parallel to camera view plane.

Modified Paths:
--------------
    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/movieclip.c
    branches/soc-2011-tomato/source/blender/makesrna/intern/rna_camera.c
    branches/soc-2011-tomato/source/blender/makesrna/intern/rna_scene.c

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/constraint.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/constraint.c      
2011-07-18 18:44:54 UTC (rev 38486)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/constraint.c      
2011-07-18 18:45:05 UTC (rev 38487)
@@ -47,6 +47,7 @@
 #include "BLI_utildefines.h"
 
 #include "DNA_armature_types.h"
+#include "DNA_camera_types.h"
 #include "DNA_constraint_types.h"
 #include "DNA_modifier_types.h"
 #include "DNA_object_types.h"
@@ -54,6 +55,7 @@
 #include "DNA_curve_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
+#include "DNA_lamp_types.h"
 #include "DNA_lattice_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_text_types.h"
@@ -3956,11 +3958,7 @@
        Scene *scene= cob->scene;
        bFollowTrackConstraint *data= con->data;
        MovieClip *clip= data->clip;
-       MovieClipUser user;
        MovieTrackingTrack *track;
-       MovieTrackingMarker *marker;
-       float tx, ty;
-       int width, height;
 
        if(data->flag&FOLLOWTRACK_DEFAULTCLIP)
                clip= scene->clip;
@@ -3987,15 +3985,96 @@
                        cob->matrix[3][2]+= pos[2];
                }
        } else {
-               user.framenr= scene->r.cfra;
-               BKE_movieclip_acquire_size(clip, &user, &width, &height);
+               Object *camob= cob->scene->camera;
 
-               marker= BKE_tracking_get_marker(track, user.framenr);
+               if(camob) {
+                       MovieClipUser user;
+                       MovieTrackingMarker *marker;
+                       float vec[3], disp[3], axis[3], mat[4][4];
+                       float aspect= (scene->r.xsch*scene->r.xasp) / 
(scene->r.ysch*scene->r.yasp);
+                       float sensor_x, lens, len, d, ortho_scale;
 
-               tx= marker->pos[0]*width;
-               ty= marker->pos[1]*height;
+                       where_is_object_mat(scene, camob, mat);
 
-               translate_m4(cob->matrix, tx, ty, 0);
+                       /* camera axis */
+                       vec[0]= 0.f;
+                       vec[1]= 0.f;
+                       vec[2]= 1.f;
+                       mul_v3_m4v3(axis, mat, vec);
+
+                       /* distance to projection plane */
+                       copy_v3_v3(vec, cob->matrix[3]);
+                       sub_v3_v3(vec, mat[3]);
+                       project_v3_v3v3(disp, vec, axis);
+
+                       len= len_v3(disp);
+
+                       if(len>FLT_EPSILON) {
+                               float rmat[4][4];
+                               int is_ortho= 0;
+
+                               /* calculate lens and sensor size depends on 
object type */
+                               if(camob->type==OB_CAMERA) {
+                                       Camera *camera= (Camera *)camob->data;
+
+                                       sensor_x= camera->sensor_x;
+                                       lens= camera->lens;
+                                       is_ortho= camera->type == CAM_ORTHO;
+                                       ortho_scale= camera->ortho_scale;
+                               } else if (camob->type==OB_LAMP) {
+                                       Lamp *la= camob->data;
+                                       float fac= 
cosf((float)M_PI*la->spotsize/360.0f);
+                                       float phi= acos(fac);
+
+                                       lens= 16.0f*fac/sinf(phi);
+                                       sensor_x= 32.f;
+                                       ortho_scale= 0.f;
+                               } else {
+                                       lens= 16.f;
+                                       sensor_x= 32.f;
+                                       ortho_scale= 0.f;
+                               }
+
+                               user.framenr= scene->r.cfra;
+                               marker= BKE_tracking_get_marker(track, 
user.framenr);
+
+                               if(is_ortho) {
+                                       vec[0]= ortho_scale * 
(marker->pos[0]-0.5f);
+                                       vec[1]= ortho_scale * 
(marker->pos[1]-0.5f);
+                                       vec[2]= -len;
+
+                                       if(aspect>1.f) vec[1]/= aspect;
+                                       else vec[0]*= aspect;
+
+                                       mul_v3_m4v3(disp, camob->obmat, vec);
+
+                                       copy_m4_m4(rmat, camob->obmat);
+                                       zero_v3(rmat[3]);
+                                       mul_m4_m4m4(cob->matrix, rmat, 
cob->matrix);
+
+                                       copy_v3_v3(cob->matrix[3], disp);
+                               }
+                               else {
+                                       d= (len*sensor_x) / (2.f*lens);
+
+                                       vec[0]= d*(2.f*marker->pos[0]-1.f);
+                                       vec[1]= d*(2.f*marker->pos[1]-1.f);
+                                       vec[2]= -len;
+
+                                       if(aspect>1.f) vec[1]/= aspect;
+                                       else vec[0]*= aspect;
+
+                                       mul_v3_m4v3(disp, camob->obmat, vec);
+
+                                       /* apply camera rotation so Z-axis 
would be co-linear */
+                                       copy_m4_m4(rmat, camob->obmat);
+                                       zero_v3(rmat[3]);
+                                       mul_m4_m4m4(cob->matrix, rmat, 
cob->matrix);
+
+                                       copy_v3_v3(cob->matrix[3], disp);
+                               }
+                       }
+               }
        }
 }
 

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/depsgraph.c       
2011-07-18 18:44:54 UTC (rev 38486)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/depsgraph.c       
2011-07-18 18:45:05 UTC (rev 38487)
@@ -648,8 +648,8 @@
                        if(cti->type==CONSTRAINT_TYPE_FOLLOWTRACK) {
                                bFollowTrackConstraint *data= 
(bFollowTrackConstraint *)con->data;
 
-                               if(data->reference==FOLLOWTRACK_BUNDLE) {
-                                       if((data->clip || 
data->flag&FOLLOWTRACK_DEFAULTCLIP) && data->track[0]) {
+                               if((data->clip || 
data->flag&FOLLOWTRACK_DEFAULTCLIP) && data->track[0]) {
+                                       if(scene->camera) {
                                                node2 = dag_get_node(dag, 
scene->camera);
                                                dag_add_relation(dag, node2, 
node, DAG_RL_DATA_OB|DAG_RL_OB_OB, cti->name);
                                        }

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/movieclip.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/movieclip.c       
2011-07-18 18:44:54 UTC (rev 38486)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/movieclip.c       
2011-07-18 18:45:05 UTC (rev 38487)
@@ -472,7 +472,7 @@
                                if(ibuf && ibuf->rect) {
                                        ImBuf *tmpibuf;
 
-                                       tmpibuf= 
BKE_tracking_acquire_pattern_imbuf(ibuf, track, marker, 1, &scopes->track_pos, 
NULL);
+                                       tmpibuf= 
BKE_tracking_acquire_pattern_imbuf(ibuf, track, marker, 1, scopes->track_pos, 
NULL);
 
                                        if(tmpibuf->rect_float)
                                                IMB_rect_from_float(tmpibuf);

Modified: branches/soc-2011-tomato/source/blender/makesrna/intern/rna_camera.c
===================================================================
--- branches/soc-2011-tomato/source/blender/makesrna/intern/rna_camera.c        
2011-07-18 18:44:54 UTC (rev 38486)
+++ branches/soc-2011-tomato/source/blender/makesrna/intern/rna_camera.c        
2011-07-18 18:45:05 UTC (rev 38487)
@@ -42,6 +42,7 @@
 #ifdef RNA_RUNTIME
 
 #include "BKE_object.h"
+#include "BKE_depsgraph.h"
 
 /* only for rad/deg conversion! can remove later */
 static float rna_Camera_angle_x_get(PointerRNA *ptr)
@@ -68,6 +69,13 @@
        cam->lens= vfov_to_focallength(value, cam->sensor_y);
 }
 
+static void rna_Camera_update(Main *UNUSED(bmain), Scene *UNUSED(scene), 
PointerRNA *ptr)
+{
+       Camera *camera= (Camera*)ptr->id.data;
+
+       DAG_id_tag_update(&camera->id, 0);
+}
+
 #else
 
 void RNA_def_camera(BlenderRNA *brna)
@@ -101,7 +109,7 @@
        prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_items(prop, prop_type_items);
        RNA_def_property_ui_text(prop, "Type", "Camera types");
-       RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+       RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
 
        prop= RNA_def_property(srna, "show_guide", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "dtx");
@@ -122,14 +130,14 @@
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_ui_text(prop, "Field of View", "Camera lens horizontal 
field of view in degrees");
        RNA_def_property_float_funcs(prop, "rna_Camera_angle_x_get", 
"rna_Camera_angle_x_set", NULL);
-       RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+       RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
 
        prop= RNA_def_property(srna, "angle_y", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_range(prop, M_PI * (0.367/180.0), M_PI * 
(172.847/180.0));
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_ui_text(prop, "Field of View", "Camera lens vertical 
field of view in degrees");
        RNA_def_property_float_funcs(prop, "rna_Camera_angle_y_get", 
"rna_Camera_angle_y_set", NULL);
-       RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+       RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
 
        prop= RNA_def_property(srna, "clip_start", PROP_FLOAT, PROP_DISTANCE);
        RNA_def_property_float_sdna(prop, NULL, "clipsta");
@@ -147,26 +155,26 @@
        RNA_def_property_float_sdna(prop, NULL, "lens");
        RNA_def_property_range(prop, 1.0f, 5000.0f);
        RNA_def_property_ui_text(prop, "Focal Length", "Perspective Camera lens 
value in millimeters");
-       RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+       RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
        
        prop= RNA_def_property(srna, "sensor_x", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "sensor_x");
        RNA_def_property_range(prop, 1.0f, FLT_MAX);
        RNA_def_property_ui_range(prop, 1.0f, 100.f, 1, 2);
        RNA_def_property_ui_text(prop, "Sensor X", "Horizontal size of the 
image sensor area in millimeters");
-       RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+       RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
 
        prop= RNA_def_property(srna, "sensor_y", PROP_FLOAT, PROP_NONE);
        RNA_def_property_range(prop, 1.0f, FLT_MAX);
        RNA_def_property_ui_range(prop, 1.0f, 100.f, 1, 2);
        RNA_def_property_ui_text(prop, "Sensor Y", "Vertical size of the image 
sensor area in millimeters");
-       RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+       RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
 
        prop= RNA_def_property(srna, "ortho_scale", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "ortho_scale");
        RNA_def_property_range(prop, 0.01f, 4000.0f);
        RNA_def_property_ui_text(prop, "Orthographic Scale", "Orthographic 
Camera scale (similar to zoom)");
-       RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+       RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
 
        prop= RNA_def_property(srna, "draw_size", PROP_FLOAT, PROP_DISTANCE);
        RNA_def_property_float_sdna(prop, NULL, "drawsize");

Modified: branches/soc-2011-tomato/source/blender/makesrna/intern/rna_scene.c
===================================================================
--- branches/soc-2011-tomato/source/blender/makesrna/intern/rna_scene.c 
2011-07-18 18:44:54 UTC (rev 38486)
+++ branches/soc-2011-tomato/source/blender/makesrna/intern/rna_scene.c 
2011-07-18 18:45:05 UTC (rev 38487)
@@ -1016,6 +1016,15 @@
        }
 }
 
+static void rna_SceneCamera_update(Main *UNUSED(bmain), Scene *UNUSED(scene), 
PointerRNA *ptr)
+{
+       Scene *scene= (Scene*)ptr->id.data;
+       Object *camera= scene->camera;
+
+       if(camera)
+               DAG_id_tag_update(&camera->id, 0);
+}
+
 #else
 
 static void rna_def_transform_orientation(BlenderRNA *brna)
@@ -2200,13 +2209,13 @@
        RNA_def_property_int_sdna(prop, NULL, "xsch");
        RNA_def_property_range(prop, 4, 10000);
        RNA_def_property_ui_text(prop, "Resolution X", "Number of horizontal 
pixels in the rendered image");
-       RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to