Index: source/blender/editors/space_view3d/view3d_select.c =================================================================== --- source/blender/editors/space_view3d/view3d_select.c (revision 57948) +++ source/blender/editors/space_view3d/view3d_select.c (working copy) @@ -1237,7 +1237,7 @@ /* returns basact */ static Base *mouse_select_eval_buffer(ViewContext *vc, unsigned int *buffer, int hits, const int mval[2], - Base *startbase, bool has_bones) + Base *startbase, bool has_bones, bool toggle) { Scene *scene = vc->scene; View3D *v3d = vc->v3d; @@ -1248,13 +1248,17 @@ /* define if we use solid nearest select or not */ if (v3d->drawtype > OB_WIRE) { - do_nearest = true; - if (ABS(mval[0] - lastmval[0]) < 3 && ABS(mval[1] - lastmval[1]) < 3) { - if (!has_bones) /* hrms, if theres bones we always do nearest */ - do_nearest = false; + if ((len_manhattan_v2v2_int(mval, lastmval) < 3) && + (toggle == false) && /* if we toggle always do nearest (else we can't deselect overlapping objects) */ + (has_bones == false)) /* if theres bones we always do nearest */ + { + do_nearest = false; + } + else { + do_nearest = true; } } - lastmval[0] = mval[0]; lastmval[1] = mval[1]; + copy_v2_v2_int(lastmval, mval); if (do_nearest) { unsigned int min = 0xFFFFFFFF; @@ -1272,7 +1276,9 @@ } else { /* only exclude active object when it is selected... */ - if (BASACT && (BASACT->flag & SELECT) && hits > 1) notcol = BASACT->selcol; + if (BASACT && (BASACT->flag & SELECT) && (hits > 1) && (toggle == false)) { + notcol = BASACT->selcol; + } for (a = 0; a < hits; a++) { if (min > buffer[4 * a + 1] && notcol != (buffer[4 * a + 3] & 0xFFFF)) { @@ -1346,7 +1352,7 @@ if (hits > 0) { const bool has_bones = selectbuffer_has_bones(buffer, hits); - basact = mouse_select_eval_buffer(&vc, buffer, hits, mval, vc.scene->base.first, has_bones); + basact = mouse_select_eval_buffer(&vc, buffer, hits, mval, vc.scene->base.first, has_bones, false); } return basact; @@ -1439,7 +1445,7 @@ basact = object_mouse_select_menu(C, &vc, buffer, hits, mval, toggle); } else { - basact = mouse_select_eval_buffer(&vc, buffer, hits, mval, startbase, has_bones); + basact = mouse_select_eval_buffer(&vc, buffer, hits, mval, startbase, has_bones, toggle); } if (has_bones && basact) { @@ -1497,7 +1503,7 @@ if (!changed) { /* fallback to regular object selection if no new bundles were selected, * allows to select object parented to reconstruction object */ - basact = mouse_select_eval_buffer(&vc, buffer, hits, mval, startbase, 0); + basact = mouse_select_eval_buffer(&vc, buffer, hits, mval, startbase, 0, toggle); } } }