forked from bartvdbraak/blender
fix for bug in loop select, picking the active vert/edge/face was using global space checks on object space coordinates. this removes last use of ED_view3d_project_float_noclip().
This commit is contained in:
parent
5770e44f43
commit
07b52efa20
@ -150,7 +150,6 @@ eV3DProjStatus ED_view3d_project_float_ex(struct ARegion *ar, float perspmat[4][
|
||||
eV3DProjStatus ED_view3d_project_float_global(struct ARegion *ar, const float co[3], float r_co[2], eV3DProjTest flag);
|
||||
eV3DProjStatus ED_view3d_project_float_object(struct ARegion *ar, const float co[3], float r_co[2], eV3DProjTest flag);
|
||||
|
||||
void ED_view3d_project_float_noclip(struct ARegion *ar, const float co[3], float r_co[2]);
|
||||
void ED_view3d_project_float_v2_m4(const struct ARegion *a, const float co[3], float r_co[2], float mat[4][4]);
|
||||
void ED_view3d_project_float_v3_m4(struct ARegion *a, const float co[3], float r_co[3], float mat[4][4]);
|
||||
|
||||
|
@ -1050,21 +1050,27 @@ static void mouse_mesh_loop(bContext *C, int mval[2], short extend, short ring)
|
||||
/* sets as active, useful for other tools */
|
||||
if (select) {
|
||||
if (em->selectmode & SCE_SELECT_VERTEX) {
|
||||
/* Find nearest vert from mouse. */
|
||||
/* Find nearest vert from mouse
|
||||
* (initialize to large values incase only one vertex can be projected) */
|
||||
float v1_co[2], v2_co[2];
|
||||
float length_1 = FLT_MAX;
|
||||
float length_2 = FLT_MAX;
|
||||
|
||||
/* We can't be sure this has already been set... */
|
||||
ED_view3d_init_mats_rv3d(vc.obedit, vc.rv3d);
|
||||
ED_view3d_project_float_noclip(vc.ar, eed->v1->co, v1_co);
|
||||
ED_view3d_project_float_noclip(vc.ar, eed->v2->co, v2_co);
|
||||
|
||||
if (ED_view3d_project_float_object(vc.ar, eed->v1->co, v1_co, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_SUCCESS) {
|
||||
length_1 = len_squared_v2v2(mvalf, v1_co);
|
||||
}
|
||||
|
||||
if (ED_view3d_project_float_object(vc.ar, eed->v2->co, v2_co, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_SUCCESS) {
|
||||
length_2 = len_squared_v2v2(mvalf, v2_co);
|
||||
}
|
||||
#if 0
|
||||
printf("mouse to v1: %f\nmouse to v2: %f\n", len_squared_v2v2(mvalf, v1_co),
|
||||
len_squared_v2v2(mvalf, v2_co));
|
||||
#endif
|
||||
if (len_squared_v2v2(mvalf, v1_co) < len_squared_v2v2(mvalf, v2_co))
|
||||
BM_select_history_store(em->bm, eed->v1);
|
||||
else
|
||||
BM_select_history_store(em->bm, eed->v2);
|
||||
BM_select_history_store(em->bm, (length_1 < length_2) ? eed->v1 : eed->v2);
|
||||
}
|
||||
else if (em->selectmode & SCE_SELECT_EDGE) {
|
||||
BM_select_history_store(em->bm, eed);
|
||||
@ -1084,12 +1090,13 @@ static void mouse_mesh_loop(bContext *C, int mval[2], short extend, short ring)
|
||||
float co[2], tdist;
|
||||
|
||||
BM_face_calc_center_mean(f, cent);
|
||||
ED_view3d_project_float_noclip(vc.ar, cent, co);
|
||||
tdist = len_squared_v2v2(mvalf, co);
|
||||
if (tdist < best_dist) {
|
||||
/* printf("Best face: %p (%f)\n", f, tdist);*/
|
||||
best_dist = tdist;
|
||||
efa = f;
|
||||
if (ED_view3d_project_float_object(vc.ar, cent, co, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_SUCCESS) {
|
||||
tdist = len_squared_v2v2(mvalf, co);
|
||||
if (tdist < best_dist) {
|
||||
/* printf("Best face: %p (%f)\n", f, tdist);*/
|
||||
best_dist = tdist;
|
||||
efa = f;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1047,26 +1047,6 @@ eV3DProjStatus ED_view3d_project_float_object(ARegion *ar, const float co[3], fl
|
||||
return ED_view3d_project_float_ex(ar, rv3d->persmatob, TRUE, co, r_co, flag);
|
||||
}
|
||||
|
||||
void ED_view3d_project_float_noclip(ARegion *ar, const float co[3], float r_co[2])
|
||||
{
|
||||
RegionView3D *rv3d = ar->regiondata;
|
||||
float vec4[4];
|
||||
|
||||
copy_v3_v3(vec4, co);
|
||||
vec4[3] = 1.0;
|
||||
|
||||
mul_m4_v4(rv3d->persmat, vec4);
|
||||
|
||||
if (fabs(vec4[3]) > BL_NEAR_CLIP) {
|
||||
r_co[0] = (float)(ar->winx / 2.0f) + (ar->winx / 2.0f) * vec4[0] / vec4[3];
|
||||
r_co[1] = (float)(ar->winy / 2.0f) + (ar->winy / 2.0f) * vec4[1] / vec4[3];
|
||||
}
|
||||
else {
|
||||
r_co[0] = ar->winx / 2.0f;
|
||||
r_co[1] = ar->winy / 2.0f;
|
||||
}
|
||||
}
|
||||
|
||||
/* copies logic of get_view3d_viewplane(), keep in sync */
|
||||
int ED_view3d_clip_range_get(View3D *v3d, RegionView3D *rv3d, float *clipsta, float *clipend)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user