Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/transform/transform.c
| Show First 20 Lines • Show All 6,384 Lines • ▼ Show 20 Lines | static void calcEdgeSlide_mval_range(TransInfo *t, | ||||
| const int *sv_table, | const int *sv_table, | ||||
| const int loop_nr, | const int loop_nr, | ||||
| const float mval[2], | const float mval[2], | ||||
| const bool use_occlude_geometry, | const bool use_occlude_geometry, | ||||
| const bool use_calc_direction) | const bool use_calc_direction) | ||||
| { | { | ||||
| TransDataEdgeSlideVert *sv_array = sld->sv; | TransDataEdgeSlideVert *sv_array = sld->sv; | ||||
| BMEditMesh *em = BKE_editmesh_from_object(tc->obedit); | BMEditMesh *em = BKE_editmesh_from_object(tc->obedit); | ||||
| BMesh *bm = em->bm; | |||||
| ARegion *ar = t->ar; | ARegion *ar = t->ar; | ||||
| View3D *v3d = NULL; | View3D *v3d = NULL; | ||||
| RegionView3D *rv3d = NULL; | RegionView3D *rv3d = NULL; | ||||
| float projectMat[4][4]; | float projectMat[4][4]; | ||||
| BMBVHTree *bmbvh; | BMBVHTree *bmbvh; | ||||
| /* only for use_calc_direction */ | /* only for use_calc_direction */ | ||||
| float(*loop_dir)[3] = NULL, *loop_maxdist = NULL; | float(*loop_dir)[3] = NULL, *loop_maxdist = NULL; | ||||
| float mval_start[2], mval_end[2]; | float mval_start[2], mval_end[2]; | ||||
| float mval_dir[3], dist_best_sq; | float mval_dir[3], dist_best_sq; | ||||
| BMIter iter; | |||||
| BMEdge *e; | |||||
| if (t->spacetype == SPACE_VIEW3D) { | if (t->spacetype == SPACE_VIEW3D) { | ||||
| /* background mode support */ | /* background mode support */ | ||||
| v3d = t->sa ? t->sa->spacedata.first : NULL; | v3d = t->sa ? t->sa->spacedata.first : NULL; | ||||
| rv3d = t->ar ? t->ar->regiondata : NULL; | rv3d = t->ar ? t->ar->regiondata : NULL; | ||||
| } | } | ||||
| if (!rv3d) { | if (!rv3d) { | ||||
| Show All 17 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; | BMIter iter_other; | ||||
| BMEdge *e; | |||||
| BMVert *v = sv_array->v; | |||||
| UNUSED_VARS_NDEBUG(sv_table); /* silence warning */ | |||||
| BLI_assert(i == sv_table[BM_elem_index_get(v)]); | |||||
| /* search cross edges for visible edge to the mouse cursor, | /* search cross edges for visible edge to the mouse cursor, | ||||
| * then use the shared vertex to calculate screen vector*/ | * then use the shared vertex to calculate screen vector*/ | ||||
| for (i = 0; i < 2; i++) { | BM_ITER_ELEM (e, &iter_other, v, BM_EDGES_OF_VERT) { | ||||
| BMIter iter_other; | |||||
| BMEdge *e_other; | |||||
| BMVert *v = i ? e->v1 : e->v2; | |||||
| 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, 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 && | if (use_occlude_geometry && | ||||
| !BMBVH_EdgeVisible(bmbvh, e_other, t->depsgraph, ar, v3d, tc->obedit)) { | !BMBVH_EdgeVisible(bmbvh, e, t->depsgraph, ar, v3d, tc->obedit)) { | ||||
| 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 ((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,668 Lines • Show Last 20 Lines | |||||