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:
Diffstat (limited to 'source/blender/editors/mesh/editmesh_slide.c')
-rw-r--r--source/blender/editors/mesh/editmesh_slide.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/source/blender/editors/mesh/editmesh_slide.c b/source/blender/editors/mesh/editmesh_slide.c
index bd1d13f3528..e42b95c6013 100644
--- a/source/blender/editors/mesh/editmesh_slide.c
+++ b/source/blender/editors/mesh/editmesh_slide.c
@@ -381,22 +381,23 @@ static BMEdge *vtx_slide_nrst_in_frame(VertexSlideOp *vso, const float mval[2])
BMEdge *edge = NULL;
float v1_proj[3], v2_proj[3];
- float dist = 0;
float min_dist = FLT_MAX;
for (i = 0; i < vso->disk_edges; i++) {
edge = vso->edge_frame[i];
mul_v3_m4v3(v1_proj, vso->obj->obmat, edge->v1->co);
- ED_view3d_project_float_noclip(vso->active_region, v1_proj, v1_proj);
-
mul_v3_m4v3(v2_proj, vso->obj->obmat, edge->v2->co);
- ED_view3d_project_float_noclip(vso->active_region, v2_proj, v2_proj);
- dist = dist_to_line_segment_v2(mval, v1_proj, v2_proj);
- if (dist < min_dist) {
- min_dist = dist;
- cl_edge = edge;
+ /* we could use ED_view3d_project_float_object here, but for now dont since we dont have the context */
+ if ((ED_view3d_project_float_global(vso->active_region, v1_proj, v1_proj, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_SUCCESS) &&
+ (ED_view3d_project_float_global(vso->active_region, v2_proj, v2_proj, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_SUCCESS))
+ {
+ const float dist = dist_to_line_segment_v2(mval, v1_proj, v2_proj);
+ if (dist < min_dist) {
+ min_dist = dist;
+ cl_edge = edge;
+ }
}
}
}
@@ -448,17 +449,21 @@ static void vtx_slide_update(VertexSlideOp *vso, wmEvent *event)
/* Calculate interpolation value for preview */
float t_val;
- float mval_float[] = { (float)event->mval[0], (float)event->mval[1]};
+ float mval_float[2] = { (float)event->mval[0], (float)event->mval[1]};
float closest_2d[2];
other = BM_edge_other_vert(edge, vso->start_vtx);
/* Project points onto screen and do interpolation in 2D */
mul_v3_m4v3(start_vtx_proj, vso->obj->obmat, vso->start_vtx->co);
- ED_view3d_project_float_noclip(vso->active_region, start_vtx_proj, start_vtx_proj);
-
mul_v3_m4v3(edge_other_proj, vso->obj->obmat, other->co);
- ED_view3d_project_float_noclip(vso->active_region, edge_other_proj, edge_other_proj);
+
+ if ((ED_view3d_project_float_global(vso->active_region, edge_other_proj, edge_other_proj, V3D_PROJ_TEST_NOP) != V3D_PROJ_RET_SUCCESS) ||
+ (ED_view3d_project_float_global(vso->active_region, start_vtx_proj, start_vtx_proj, V3D_PROJ_TEST_NOP) != V3D_PROJ_RET_SUCCESS))
+ {
+ /* not much we can do here */
+ return;
+ }
closest_to_line_v2(closest_2d, mval_float, start_vtx_proj, edge_other_proj);
@@ -470,7 +475,7 @@ static void vtx_slide_update(VertexSlideOp *vso, wmEvent *event)
if (edge_len <= 0.0f)
edge_len = VTX_SLIDE_SNAP_THRSH;
- edge_len = (len_v3v3(edge->v1->co, edge->v2->co) * VTX_SLIDE_SNAP_THRSH) / edge_len;
+ edge_len = (BM_edge_calc_length(edge) * VTX_SLIDE_SNAP_THRSH) / edge_len;
vso->snap_threshold = edge_len;