Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorGermano Cavalcante <germano.costa@ig.com.br>2017-01-31 05:49:09 +0300
committerGermano Cavalcante <germano.costa@ig.com.br>2017-01-31 05:49:09 +0300
commitd07e2416dbdfa89fd698aab2fda4804dd6368f1d (patch)
tree36810140d193095694ef7a4767aa63af11ca9ff1 /source
parentb841d60bf8ac865d456c466892503561fd6ca97c (diff)
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
Diffstat (limited to 'source')
-rw-r--r--source/blender/editors/transform/transform_snap_object.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c
index 83b04cb7f72..bed451a32d8 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;
+ }
}
}
}