Commit: d07e2416dbdfa89fd698aab2fda4804dd6368f1d
Author: Germano Cavalcante
Date:   Mon Jan 30 23:49:09 2017 -0300
Branches: master
https://developer.blender.org/rBd07e2416dbdfa89fd698aab2fda4804dd6368f1d

Fix bug not reported: Ruler/Protractor: Snap to vertices and edges was not 
considering the depth variation

Taking advantage of the area, the depth is decreased 0.01 BU to each loop to 
give priority to elements in order: Vertice > Edge > Face. This increases the 
threshold and improves the snap to multiple elements

===================================================================

M       source/blender/editors/transform/transform_snap_object.c

===================================================================

diff --git a/source/blender/editors/transform/transform_snap_object.c 
b/source/blender/editors/transform/transform_snap_object.c
index 83b04cb7f7..bed451a32d 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@ -1114,10 +1114,13 @@ static bool snapDerivedMesh(
 
                float lpmat[4][4];
                float ray_org_local[3];
+               float depth_range_local[2];
                if (ELEM(snapdata->snap_to, SCE_SNAP_MODE_VERTEX, 
SCE_SNAP_MODE_EDGE)) {
                        mul_m4_m4m4(lpmat, snapdata->pmat, obmat);
                        copy_v3_v3(ray_org_local, snapdata->ray_origin);
                        mul_m4_v3(imat, ray_org_local);
+                       depth_range_local[0] = snapdata->depth_range[0] * 
local_scale;
+                       depth_range_local[1] = local_depth + 
depth_range_local[0];
                }
 
                if (do_bb) {
@@ -1326,7 +1329,7 @@ static bool snapDerivedMesh(
 
                        dist_squared_to_projected_aabb_precalc(
                                &neasrest2d.data_precalc, lpmat, 
snapdata->win_half,
-                               snapdata->depth_range, snapdata->mval, 
ray_org_local, ray_normal_local);
+                               depth_range_local, snapdata->mval, 
ray_org_local, ray_normal_local);
 
                        BVHTree_WalkLeafCallback cb_walk_leaf =
                                (snapdata->snap_to == SCE_SNAP_MODE_VERTEX) ?
@@ -1400,6 +1403,13 @@ static bool snapEditMesh(
 
                mul_mat3_m4_v3(imat, ray_normal_local);
 
+               /* local scale in normal direction */
+               float local_scale = normalize_v3(ray_normal_local);
+               float local_depth = *ray_depth;
+               if (local_depth != BVH_RAYCAST_DIST_MAX) {
+                       local_depth *= local_scale;
+               }
+
                SnapObjectData_EditMesh *sod = NULL;
 
                BVHTreeFromEditMesh *treedata = NULL, treedata_stack;
@@ -1502,13 +1512,6 @@ static bool snapEditMesh(
                        copy_v3_v3(ray_start_local, snapdata->ray_start);
                        mul_m4_v3(imat, ray_start_local);
 
-                       /* local scale in normal direction */
-                       float local_scale = normalize_v3(ray_normal_local);
-                       float local_depth = *ray_depth;
-                       if (local_depth != BVH_RAYCAST_DIST_MAX) {
-                               local_depth *= local_scale;
-                       }
-
                        /* Only use closer ray_start in case of ortho view! In 
perspective one, ray_start
                         * may already been *inside* boundbox, leading to snap 
failures (see T38409).
                         * Note also ar might be null (see T38435), in this 
case we assume ray_start is ok!
@@ -1615,8 +1618,10 @@ static bool snapEditMesh(
                            .userdata = &treedata_type,
                            .index = -1};
 
-                       float lpmat[4][4];
+                       float lpmat[4][4], depth_range_local[2];
                        mul_m4_m4m4(lpmat, snapdata->pmat, obmat);
+                       depth_range_local[0] = snapdata->depth_range[0] * 
local_scale;
+                       depth_range_local[1] = local_depth + 
depth_range_local[0];
                        dist_squared_to_projected_aabb_precalc(
                                &neasrest2d.data_precalc, lpmat, 
snapdata->win_half,
                                snapdata->depth_range, snapdata->mval, 
ray_org_local, ray_normal_local);
@@ -2077,9 +2082,6 @@ static bool 
transform_snap_context_project_view3d_mixed_impl(
 
        for (int i = 0; i < 3; i++) {
                if ((snap_to_flag & (1 << i)) && (is_hit == false || 
use_depth)) {
-                       if (use_depth == false) {
-                               ray_depth = BVH_RAYCAST_DIST_MAX;
-                       }
 
                        if (ED_transform_snap_object_project_view3d(
                                sctx,
@@ -2088,6 +2090,14 @@ static bool 
transform_snap_context_project_view3d_mixed_impl(
                                r_co, r_no))
                        {
                                is_hit = true;
+                               if (use_depth == false) {
+                                       ray_depth = BVH_RAYCAST_DIST_MAX;
+                               }
+                               else {
+                                       /* 0.01 is a random but small value to 
prioritizing
+                                        * the first elements of the loop */
+                                       ray_depth -= 0.01f;
+                               }
                        }
                }
        }

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to