Small fix for Follow Track constraint
authorSergey Sharybin <sergey.vfx@gmail.com>
Wed, 19 Sep 2012 17:19:30 +0000 (17:19 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 19 Sep 2012 17:19:30 +0000 (17:19 +0000)
Use object_get_derived_final() function instead of accessing to object's
derived final directly.

The same happens for shrinkwrap constraint and it should deal better in
cases when depth object is in edit mode. In other cases should be no
functional changes.

source/blender/blenkernel/intern/constraint.c

index 2db4c466443c00ea99344404bcba7d7df3514911..e3f7ae1b1c70f6f6d6fbf11761a0ba3dc01816af 100644 (file)
@@ -4054,32 +4054,36 @@ static void followtrack_evaluate(bConstraint *con, bConstraintOb *cob, ListBase
                                copy_v3_v3(cob->matrix[3], disp);
                        }
 
-                       if (data->depth_ob && data->depth_ob->derivedFinal) {
+                       if (data->depth_ob) {
                                Object *depth_ob = data->depth_ob;
-                               BVHTreeFromMesh treeData = NULL_BVHTreeFromMesh;
-                               BVHTreeRayHit hit;
-                               float ray_start[3], ray_end[3], ray_nor[3], imat[4][4];
-                               int result;
+                               DerivedMesh *target = object_get_derived_final(depth_ob);
+                               if (target) {
+                                       BVHTreeFromMesh treeData = NULL_BVHTreeFromMesh;
+                                       BVHTreeRayHit hit;
+                                       float ray_start[3], ray_end[3], ray_nor[3], imat[4][4];
+                                       int result;
 
-                               invert_m4_m4(imat, depth_ob->obmat);
+                                       invert_m4_m4(imat, depth_ob->obmat);
 
-                               mul_v3_m4v3(ray_start, imat, camob->obmat[3]);
-                               mul_v3_m4v3(ray_end, imat, cob->matrix[3]);
+                                       mul_v3_m4v3(ray_start, imat, camob->obmat[3]);
+                                       mul_v3_m4v3(ray_end, imat, cob->matrix[3]);
 
-                               sub_v3_v3v3(ray_nor, ray_end, ray_start);
+                                       sub_v3_v3v3(ray_nor, ray_end, ray_start);
 
-                               bvhtree_from_mesh_faces(&treeData, depth_ob->derivedFinal, 0.0f, 4, 6);
+                                       bvhtree_from_mesh_faces(&treeData, target, 0.0f, 4, 6);
 
-                               hit.dist = FLT_MAX;
-                               hit.index = -1;
+                                       hit.dist = FLT_MAX;
+                                       hit.index = -1;
 
-                               result = BLI_bvhtree_ray_cast(treeData.tree, ray_start, ray_nor, 0.0f, &hit, treeData.raycast_callback, &treeData);
+                                       result = BLI_bvhtree_ray_cast(treeData.tree, ray_start, ray_nor, 0.0f, &hit, treeData.raycast_callback, &treeData);
 
-                               if (result != -1) {
-                                       mul_v3_m4v3(cob->matrix[3], depth_ob->obmat, hit.co);
-                               }
+                                       if (result != -1) {
+                                               mul_v3_m4v3(cob->matrix[3], depth_ob->obmat, hit.co);
+                                       }
 
-                               free_bvhtree_from_mesh(&treeData);
+                                       free_bvhtree_from_mesh(&treeData);
+                                       target->release(target);
+                               }
                        }
                }
        }