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
diff options
context:
space:
mode:
-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;
+ }
}
}
}