Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/transform/transform.c
- This file is larger than 256 KB, so syntax highlighting is disabled by default.
| Show First 20 Lines • Show All 6,950 Lines • ▼ Show 20 Lines | static void calcEdgeSlide_mval_range(TransInfo *t, | ||||
| dist_best_sq = -1.0f; | dist_best_sq = -1.0f; | ||||
| if (use_calc_direction) { | if (use_calc_direction) { | ||||
| loop_dir = MEM_callocN(sizeof(float[3]) * loop_nr, "sv loop_dir"); | loop_dir = MEM_callocN(sizeof(float[3]) * loop_nr, "sv loop_dir"); | ||||
| loop_maxdist = MEM_mallocN(sizeof(float) * loop_nr, "sv loop_maxdist"); | loop_maxdist = MEM_mallocN(sizeof(float) * loop_nr, "sv loop_maxdist"); | ||||
| copy_vn_fl(loop_maxdist, loop_nr, -1.0f); | copy_vn_fl(loop_maxdist, loop_nr, -1.0f); | ||||
| } | } | ||||
| BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { | sv_array = sld->sv; | ||||
| if (BM_elem_flag_test(e, BM_ELEM_SELECT)) { | for (int i = 0; i < sld->totsv; i++, sv_array++) { | ||||
| int i; | |||||
| /* search cross edges for visible edge to the mouse cursor, | |||||
| * then use the shared vertex to calculate screen vector*/ | |||||
| for (i = 0; i < 2; i++) { | |||||
| BMIter iter_other; | BMIter iter_other; | ||||
| BMEdge *e_other; | BMEdge *e_other; | ||||
| BMVert *v = sv_array->v; | |||||
| BMVert *v = i ? e->v1 : e->v2; | /* search cross edges for visible edge to the mouse cursor, | ||||
| * then use the shared vertex to calculate screen vector*/ | |||||
| BM_ITER_ELEM (e_other, &iter_other, v, BM_EDGES_OF_VERT) { | BM_ITER_ELEM (e_other, &iter_other, v, BM_EDGES_OF_VERT) { | ||||
| /* screen-space coords */ | /* screen-space coords */ | ||||
| float sco_a[3], sco_b[3]; | float sco_a[3], sco_b[3]; | ||||
| float dist_sq; | float dist_sq; | ||||
| int j, l_nr; | int l_nr; | ||||
| if (BM_elem_flag_test(e_other, BM_ELEM_SELECT)) { | if (BM_elem_flag_test(e_other, BM_ELEM_SELECT)) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| /* This test is only relevant if object is not wire-drawn! See [#32068]. */ | /* This test is only relevant if object is not wire-drawn! See [#32068]. */ | ||||
| if (use_occlude_geometry && | bool is_visible = !use_occlude_geometry || | ||||
| !BMBVH_EdgeVisible(bmbvh, e_other, t->depsgraph, ar, v3d, tc->obedit)) { | BMBVH_EdgeVisible(bmbvh, e_other, t->depsgraph, ar, v3d, tc->obedit); | ||||
| if (!is_visible && !use_calc_direction) { | |||||
| continue; | continue; | ||||
| } | } | ||||
| BLI_assert(sv_table[BM_elem_index_get(v)] != -1); | if (sv_array->v_side[1]) { | ||||
| j = sv_table[BM_elem_index_get(v)]; | ED_view3d_project_float_v3_m4(ar, sv_array->v_side[1]->co, sco_b, projectMat); | ||||
| if (sv_array[j].v_side[1]) { | |||||
| ED_view3d_project_float_v3_m4(ar, sv_array[j].v_side[1]->co, sco_b, projectMat); | |||||
| } | } | ||||
| else { | else { | ||||
| add_v3_v3v3(sco_b, v->co, sv_array[j].dir_side[1]); | add_v3_v3v3(sco_b, v->co, sv_array->dir_side[1]); | ||||
| ED_view3d_project_float_v3_m4(ar, sco_b, sco_b, projectMat); | ED_view3d_project_float_v3_m4(ar, sco_b, sco_b, projectMat); | ||||
| } | } | ||||
| if (sv_array[j].v_side[0]) { | if (sv_array->v_side[0]) { | ||||
| ED_view3d_project_float_v3_m4(ar, sv_array[j].v_side[0]->co, sco_a, projectMat); | ED_view3d_project_float_v3_m4(ar, sv_array->v_side[0]->co, sco_a, projectMat); | ||||
| } | } | ||||
| else { | else { | ||||
| add_v3_v3v3(sco_a, v->co, sv_array[j].dir_side[0]); | add_v3_v3v3(sco_a, v->co, sv_array->dir_side[0]); | ||||
| ED_view3d_project_float_v3_m4(ar, sco_a, sco_a, projectMat); | ED_view3d_project_float_v3_m4(ar, sco_a, sco_a, projectMat); | ||||
| } | } | ||||
| /* global direction */ | /* global direction */ | ||||
| dist_sq = dist_squared_to_line_segment_v2(mval, sco_b, sco_a); | dist_sq = dist_squared_to_line_segment_v2(mval, sco_b, sco_a); | ||||
| if (is_visible) { | |||||
| if ((dist_best_sq == -1.0f) || | if ((dist_best_sq == -1.0f) || | ||||
| /* intentionally use 2d size on 3d vector */ | /* intentionally use 2d size on 3d vector */ | ||||
| (dist_sq < dist_best_sq && (len_squared_v2v2(sco_b, sco_a) > 0.1f))) { | (dist_sq < dist_best_sq && (len_squared_v2v2(sco_b, sco_a) > 0.1f))) { | ||||
| dist_best_sq = dist_sq; | dist_best_sq = dist_sq; | ||||
| sub_v3_v3v3(mval_dir, sco_b, sco_a); | sub_v3_v3v3(mval_dir, sco_b, sco_a); | ||||
| } | } | ||||
| } | |||||
| if (use_calc_direction) { | if (use_calc_direction) { | ||||
| /* per loop direction */ | /* per loop direction */ | ||||
| l_nr = sv_array[j].loop_nr; | l_nr = sv_array->loop_nr; | ||||
| if (loop_maxdist[l_nr] == -1.0f || dist_sq < loop_maxdist[l_nr]) { | if (loop_maxdist[l_nr] == -1.0f || dist_sq < loop_maxdist[l_nr]) { | ||||
| loop_maxdist[l_nr] = dist_sq; | loop_maxdist[l_nr] = dist_sq; | ||||
| sub_v3_v3v3(loop_dir[l_nr], sco_b, sco_a); | sub_v3_v3v3(loop_dir[l_nr], sco_b, sco_a); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| } | |||||
| if (use_calc_direction) { | if (use_calc_direction) { | ||||
| int i; | int i; | ||||
| sv_array = sld->sv; | sv_array = sld->sv; | ||||
| for (i = 0; i < sld->totsv; i++, sv_array++) { | for (i = 0; i < sld->totsv; i++, sv_array++) { | ||||
| /* switch a/b if loop direction is different from global direction */ | /* switch a/b if loop direction is different from global direction */ | ||||
| int l_nr = sv_array->loop_nr; | int l_nr = sv_array->loop_nr; | ||||
| if (dot_v3v3(loop_dir[l_nr], mval_dir) < 0.0f) { | if (dot_v3v3(loop_dir[l_nr], mval_dir) < 0.0f) { | ||||
| ▲ Show 20 Lines • Show All 2,750 Lines • Show Last 20 Lines | |||||