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_select.c')
-rw-r--r--source/blender/editors/mesh/editmesh_select.c88
1 files changed, 46 insertions, 42 deletions
diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c
index a3a61c30aeb..84ca945bf48 100644
--- a/source/blender/editors/mesh/editmesh_select.c
+++ b/source/blender/editors/mesh/editmesh_select.c
@@ -357,12 +357,12 @@ bool EDBM_backbuf_circle_init(ViewContext *vc, short xs, short ys, short rads)
* \{ */
#define FIND_NEAR_THRESHOLD_MIN 3
+#define FIND_NEAR_BIAS 5
struct NearestVertUserData {
float mval_fl[2];
int pass;
- char hflag_select;
- bool is_strict;
+ bool use_select_bias;
float dist;
int index_last;
int index_nearest;
@@ -384,13 +384,9 @@ static void findnearestvert__doClosest(void *userData, BMVert *eve, const float
if (data->dist > FIND_NEAR_THRESHOLD_MIN) {
float dist_test = len_manhattan_v2v2(data->mval_fl, screen_co);
- if (BM_elem_flag_test(eve, BM_ELEM_SELECT) == data->hflag_select) {
- if (data->is_strict == true) {
- return;
- }
- else {
- dist_test += 5;
- }
+
+ if (data->use_select_bias && BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
+ dist_test += FIND_NEAR_BIAS;
}
if (dist_test < data->dist) {
@@ -401,13 +397,6 @@ static void findnearestvert__doClosest(void *userData, BMVert *eve, const float
}
}
-
-static bool findnearestvert__backbufIndextest(void *handle, unsigned int index)
-{
- BMEditMesh *em = (BMEditMesh *)handle;
- BMVert *eve = BM_vert_at_index_find(em->bm, index - 1);
- return !(eve && BM_elem_flag_test(eve, BM_ELEM_SELECT));
-}
/**
* Nearest vertex under the cursor.
*
@@ -419,7 +408,7 @@ static bool findnearestvert__backbufIndextest(void *handle, unsigned int index)
*/
BMVert *EDBM_vert_find_nearest_ex(
ViewContext *vc, float *r_dist,
- const bool use_select_bias, const bool is_strict)
+ const bool use_select_bias)
{
BMesh *bm = vc->em->bm;
@@ -429,17 +418,9 @@ BMVert *EDBM_vert_find_nearest_ex(
unsigned int index;
BMVert *eve;
- if (is_strict) {
- index = ED_view3d_backbuf_sample_rect(
- vc, vc->mval, dist_px, bm_wireoffs, 0xFFFFFF, &distance,
- is_strict, vc->em, findnearestvert__backbufIndextest);
- }
- else {
- index = ED_view3d_backbuf_sample_rect(
- vc, vc->mval, dist_px, bm_wireoffs, 0xFFFFFF, &distance,
- 0, NULL, NULL);
- }
-
+ index = ED_view3d_backbuf_sample_rect(
+ vc, vc->mval, dist_px, bm_wireoffs, 0xFFFFFF, &distance);
+
eve = index ? BM_vert_at_index_find_or_table(bm, index - 1) : NULL;
if (eve && distance < *r_dist) {
@@ -464,9 +445,9 @@ BMVert *EDBM_vert_find_nearest_ex(
data.index_last = prev_select_index;
data.mval_fl[0] = vc->mval[0];
data.mval_fl[1] = vc->mval[1];
- data.hflag_select = use_select_bias ? BM_ELEM_SELECT : 0;
+ data.use_select_bias = use_select_bias;
data.dist = *r_dist;
- data.is_strict = is_strict;
+
data.vert_nearest = NULL;
data.index_nearest = 0;
@@ -491,13 +472,15 @@ BMVert *EDBM_vert_find_nearest_ex(
BMVert *EDBM_vert_find_nearest(ViewContext *vc, float *r_dist)
{
- return EDBM_vert_find_nearest_ex(vc, r_dist, false, false);
+ return EDBM_vert_find_nearest_ex(vc, r_dist, false);
}
struct NearestEdgeUserData {
ViewContext vc;
float mval_fl[2];
+ bool use_select_bias;
+ char hflag_select;
float dist;
BMEdge *edge_nearest;
};
@@ -506,20 +489,32 @@ struct NearestEdgeUserData {
static void findnearestedge__doClosest(void *userData, BMEdge *eed, const float screen_co_a[2], const float screen_co_b[2], int UNUSED(index))
{
struct NearestEdgeUserData *data = userData;
- int distance;
+ float fac = line_point_factor_v2(data->mval_fl, screen_co_a, screen_co_b);
+ float distance;
+ float screen_co[2];
- distance = dist_to_line_segment_v2(data->mval_fl, screen_co_a, screen_co_b);
-
- if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
- distance += 5;
+ if (fac <= 0.0f) {
+ fac = 0.0f;
+ copy_v2_v2(screen_co, screen_co_a);
+ }
+ else if (fac >= 1.0f) {
+ fac = 1.0f;
+ copy_v2_v2(screen_co, screen_co_b);
+ }
+ else {
+ interp_v3_v3v3(screen_co, screen_co_a, screen_co_b, fac);
+ }
+
+ distance = len_manhattan_v2v2(data->mval_fl, screen_co);
+
+ if (data->use_select_bias && BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
+ distance += FIND_NEAR_BIAS;
}
if (distance < data->dist) {
if (data->vc.rv3d->rflag & RV3D_CLIPPING) {
- float fac = line_point_factor_v2(data->mval_fl, screen_co_a, screen_co_b);
float vec[3];
- CLAMP(fac, 0, 1);
interp_v3_v3v3(vec, eed->v1->co, eed->v2->co, fac);
if (ED_view3d_clipping_test(data->vc.rv3d, vec, true) == 0) {
data->dist = distance;
@@ -533,7 +528,9 @@ static void findnearestedge__doClosest(void *userData, BMEdge *eed, const float
}
}
-BMEdge *EDBM_edge_find_nearest(ViewContext *vc, float *r_dist)
+BMEdge *EDBM_edge_find_nearest_ex(
+ ViewContext *vc, float *r_dist,
+ const bool use_select_bias)
{
BMesh *bm = vc->em->bm;
@@ -545,7 +542,7 @@ BMEdge *EDBM_edge_find_nearest(ViewContext *vc, float *r_dist)
ED_view3d_backbuf_validate(vc);
- index = ED_view3d_backbuf_sample_rect(vc, vc->mval, dist_px, bm_solidoffs, bm_wireoffs, &distance, 0, NULL, NULL);
+ index = ED_view3d_backbuf_sample_rect(vc, vc->mval, dist_px, bm_solidoffs, bm_wireoffs, &distance);
eed = index ? BM_edge_at_index_find_or_table(bm, index - 1) : NULL;
if (eed && distance < *r_dist) {
@@ -562,6 +559,7 @@ BMEdge *EDBM_edge_find_nearest(ViewContext *vc, float *r_dist)
data.vc = *vc;
data.mval_fl[0] = vc->mval[0];
data.mval_fl[1] = vc->mval[1];
+ data.use_select_bias = use_select_bias;
data.dist = *r_dist;
data.edge_nearest = NULL;
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d);
@@ -573,6 +571,12 @@ BMEdge *EDBM_edge_find_nearest(ViewContext *vc, float *r_dist)
}
}
+BMEdge *EDBM_edge_find_nearest(
+ ViewContext *vc, float *r_dist)
+{
+ return EDBM_edge_find_nearest_ex(vc, r_dist, false);
+}
+
struct NearestFaceUserData_ZBuf {
float mval_fl[2];
float dist;
@@ -729,7 +733,7 @@ static int unified_findnearest(ViewContext *vc, BMVert **r_eve, BMEdge **r_eed,
ED_view3d_backbuf_validate(vc);
if (em->selectmode & SCE_SELECT_VERTEX) {
- eve = EDBM_vert_find_nearest_ex(vc, &dist, true, false);
+ eve = EDBM_vert_find_nearest_ex(vc, &dist, true);
dist_vert = dist;
}
@@ -740,7 +744,7 @@ static int unified_findnearest(ViewContext *vc, BMVert **r_eve, BMEdge **r_eed,
/* distance bias from verts (not faces) */
dist = min_ff(dist, dist_vert - dist_edge_bias);
if ((dist > 0.0f) && (em->selectmode & SCE_SELECT_EDGE)) {
- eed = EDBM_edge_find_nearest(vc, &dist);
+ eed = EDBM_edge_find_nearest_ex(vc, &dist, true);
}
/* return only one of 3 pointers, for frontbuffer redraws */