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
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/blender/editors/armature/editarmature.c74
-rw-r--r--source/blender/editors/curve/editcurve.c49
-rw-r--r--source/blender/editors/include/ED_armature.h4
-rw-r--r--source/blender/editors/include/ED_curve.h2
-rw-r--r--source/blender/editors/include/ED_mball.h2
-rw-r--r--source/blender/editors/include/ED_mesh.h4
-rw-r--r--source/blender/editors/include/ED_object.h2
-rw-r--r--source/blender/editors/include/ED_particle.h2
-rw-r--r--source/blender/editors/mesh/editface.c10
-rw-r--r--source/blender/editors/mesh/editmesh_select.c69
-rw-r--r--source/blender/editors/metaball/mball_edit.c23
-rw-r--r--source/blender/editors/object/object_lattice.c18
-rw-r--r--source/blender/editors/physics/particle_edit.c32
-rw-r--r--source/blender/editors/space_view3d/view3d_ops.c22
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c47
15 files changed, 274 insertions, 86 deletions
diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c
index 4ccdc610cae..8ea66934a31 100644
--- a/source/blender/editors/armature/editarmature.c
+++ b/source/blender/editors/armature/editarmature.c
@@ -1842,7 +1842,7 @@ static int ebone_select_flag(EditBone *ebone)
}
/* context: editmode armature in view3d */
-int mouse_armature(bContext *C, const int mval[2], int extend)
+int mouse_armature(bContext *C, const int mval[2], int extend, int deselect, int toggle)
{
Object *obedit = CTX_data_edit_object(C);
bArmature *arm = obedit->data;
@@ -1857,7 +1857,7 @@ int mouse_armature(bContext *C, const int mval[2], int extend)
nearBone = get_nearest_editbonepoint(&vc, mval, arm->edbo, 1, &selmask);
if (nearBone) {
- if (!extend)
+ if (!extend && !deselect && !toggle)
ED_armature_deselect_all(obedit, 0);
/* by definition the non-root connected bones have no root point drawn,
@@ -1867,6 +1867,18 @@ int mouse_armature(bContext *C, const int mval[2], int extend)
if (nearBone->parent && (nearBone->flag & BONE_CONNECTED)) {
/* click in a chain */
if (extend) {
+ /* select this bone */
+ nearBone->flag |= BONE_TIPSEL;
+ nearBone->parent->flag |= BONE_TIPSEL;
+ }
+ else if (deselect) {
+ /* deselect this bone */
+ nearBone->flag &= ~(BONE_TIPSEL | BONE_SELECTED);
+ /* only deselect parent tip if it is not selected */
+ if (!(nearBone->parent->flag & BONE_SELECTED))
+ nearBone->parent->flag &= ~BONE_TIPSEL;
+ }
+ else if (toggle) {
/* hold shift inverts this bone's selection */
if (nearBone->flag & BONE_SELECTED) {
/* deselect this bone */
@@ -1889,17 +1901,28 @@ int mouse_armature(bContext *C, const int mval[2], int extend)
}
else {
if (extend) {
+ nearBone->flag |= (BONE_TIPSEL | BONE_ROOTSEL);
+ }
+ else if (deselect) {
+ nearBone->flag &= ~(BONE_TIPSEL | BONE_ROOTSEL);
+ }
+ else if (toggle) {
/* hold shift inverts this bone's selection */
if (nearBone->flag & BONE_SELECTED)
nearBone->flag &= ~(BONE_TIPSEL | BONE_ROOTSEL);
else
nearBone->flag |= (BONE_TIPSEL | BONE_ROOTSEL);
}
- else nearBone->flag |= (BONE_TIPSEL | BONE_ROOTSEL);
+ else
+ nearBone->flag |= (BONE_TIPSEL | BONE_ROOTSEL);
}
}
else {
- if (extend && (nearBone->flag & selmask))
+ if (extend)
+ nearBone->flag |= selmask;
+ else if (deselect)
+ nearBone->flag &= ~selmask;
+ else if (toggle && (nearBone->flag & selmask))
nearBone->flag &= ~selmask;
else
nearBone->flag |= selmask;
@@ -4475,7 +4498,7 @@ static int bone_looper(Object *ob, Bone *bone, void *data,
/* called from editview.c, for mode-less pose selection */
/* assumes scene obact and basact is still on old situation */
-int ED_do_pose_selectbuffer(Scene *scene, Base *base, unsigned int *buffer, short hits, short extend)
+int ED_do_pose_selectbuffer(Scene *scene, Base *base, unsigned int *buffer, short hits, short extend, short deselect, short toggle)
{
Object *ob = base->object;
Bone *nearBone;
@@ -4494,7 +4517,7 @@ int ED_do_pose_selectbuffer(Scene *scene, Base *base, unsigned int *buffer, shor
* note, special exception for armature mode so we can do multi-select
* we could check for multi-select explicitly but think its fine to
* always give predictable behavior in weight paint mode - campbell */
- if (!extend || ((ob_act && (ob_act != ob) && (ob_act->mode & OB_MODE_WEIGHT_PAINT) == 0))) {
+ if ((!extend && !deselect && !toggle)|| ((ob_act && (ob_act != ob) && (ob_act->mode & OB_MODE_WEIGHT_PAINT) == 0))) {
ED_pose_deselectall(ob, 0);
nearBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
arm->act_bone = nearBone;
@@ -4503,25 +4526,34 @@ int ED_do_pose_selectbuffer(Scene *scene, Base *base, unsigned int *buffer, shor
//select_actionchannel_by_name(ob->action, nearBone->name, 1);
}
else {
- if (nearBone->flag & BONE_SELECTED) {
- /* if not active, we make it active */
- if (nearBone != arm->act_bone) {
- arm->act_bone = nearBone;
+ if (extend) {
+ nearBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ arm->act_bone = nearBone;
+ }
+ else if (deselect) {
+ nearBone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ }
+ else if (toggle) {
+ if (nearBone->flag & BONE_SELECTED) {
+ /* if not active, we make it active */
+ if (nearBone != arm->act_bone) {
+ arm->act_bone = nearBone;
+ }
+ else {
+ nearBone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+
+ // XXX old cruft! use notifiers instead
+ //select_actionchannel_by_name(ob->action, nearBone->name, 0);
+ }
}
else {
- nearBone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
-
+ nearBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ arm->act_bone = nearBone;
+
// XXX old cruft! use notifiers instead
- //select_actionchannel_by_name(ob->action, nearBone->name, 0);
+ //select_actionchannel_by_name(ob->action, nearBone->name, 1);
}
- }
- else {
- nearBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- arm->act_bone = nearBone;
-
- // XXX old cruft! use notifiers instead
- //select_actionchannel_by_name(ob->action, nearBone->name, 1);
- }
+ }
}
/* in weightpaint we select the associated vertex group too */
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index aa29100ccbe..431ce15a26d 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -4126,7 +4126,7 @@ void CURVE_OT_make_segment(wmOperatorType *ot)
/***************** pick select from 3d view **********************/
-int mouse_nurb(bContext *C, const int mval[2], int extend)
+int mouse_nurb(bContext *C, const int mval[2], int extend, int deselect, int toggle)
{
Object *obedit = CTX_data_edit_object(C);
Curve *cu = obedit->data;
@@ -4146,12 +4146,8 @@ int mouse_nurb(bContext *C, const int mval[2], int extend)
hand = findnearestNurbvert(&vc, 1, location, &nu, &bezt, &bp);
if (bezt || bp) {
- if (extend == 0) {
-
- setflagsNurb(editnurb, 0);
-
+ if (extend) {
if (bezt) {
-
if (hand == 1) {
select_beztriple(bezt, SELECT, 1, HIDDEN);
cu->lastsel = bezt;
@@ -4167,9 +4163,26 @@ int mouse_nurb(bContext *C, const int mval[2], int extend)
cu->lastsel = bp;
select_bpoint(bp, SELECT, 1, HIDDEN);
}
-
}
- else {
+ else if (deselect) {
+ if (bezt) {
+ if (hand == 1) {
+ select_beztriple(bezt, DESELECT, 1, HIDDEN);
+ if (bezt == cu->lastsel) cu->lastsel = NULL;
+ }
+ else if (hand == 0) {
+ bezt->f1 &= ~SELECT;
+ }
+ else {
+ bezt->f3 &= ~SELECT;
+ }
+ }
+ else {
+ select_bpoint(bp, DESELECT, 1, HIDDEN);
+ if (cu->lastsel == bp) cu->lastsel = NULL;
+ }
+ }
+ else if (toggle) {
if (bezt) {
if (hand == 1) {
if (bezt->f2 & SELECT) {
@@ -4198,7 +4211,27 @@ int mouse_nurb(bContext *C, const int mval[2], int extend)
cu->lastsel = bp;
}
}
+ }
+ else {
+ setflagsNurb(editnurb, 0);
+ if (bezt) {
+
+ if (hand == 1) {
+ select_beztriple(bezt, SELECT, 1, HIDDEN);
+ cu->lastsel = bezt;
+ }
+ else {
+ if (hand == 0) bezt->f1 |= SELECT;
+ else bezt->f3 |= SELECT;
+
+ cu->lastsel = NULL;
+ }
+ }
+ else {
+ cu->lastsel = bp;
+ select_bpoint(bp, SELECT, 1, HIDDEN);
+ }
}
if (nu != get_actNurb(obedit))
diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h
index daf959b1f10..eb02fc97596 100644
--- a/source/blender/editors/include/ED_armature.h
+++ b/source/blender/editors/include/ED_armature.h
@@ -113,8 +113,8 @@ void ED_armature_deselect_all(struct Object *obedit, int toggle);
void ED_armature_deselect_all_visible(struct Object *obedit);
int ED_do_pose_selectbuffer(struct Scene *scene, struct Base *base, unsigned int *buffer,
- short hits, short extend);
-int mouse_armature(struct bContext *C, const int mval[2], int extend);
+ short hits, short extend, short deselect, short toggle);
+int mouse_armature(struct bContext *C, const int mval[2], int extend, int deselect, int toggle);
int join_armature_exec(struct bContext *C, struct wmOperator *op);
struct Bone *get_indexed_bone(struct Object *ob, int index);
float ED_rollBoneToVector(EditBone *bone, const float new_up_axis[3], const short axis_only);
diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h
index b42a6e391ce..ac8d82e9060 100644
--- a/source/blender/editors/include/ED_curve.h
+++ b/source/blender/editors/include/ED_curve.h
@@ -65,7 +65,7 @@ void free_editNurb(struct Object *obedit);
void BKE_curve_editNurb_free(struct Curve *cu);
-int mouse_nurb(struct bContext *C, const int mval[2], int extend);
+int mouse_nurb(struct bContext *C, const int mval[2], int extend, int deselect, int toggle);
struct Nurb *add_nurbs_primitive(struct bContext *C, float mat[4][4], int type, int newob);
diff --git a/source/blender/editors/include/ED_mball.h b/source/blender/editors/include/ED_mball.h
index 89917f09284..b4b739e4d06 100644
--- a/source/blender/editors/include/ED_mball.h
+++ b/source/blender/editors/include/ED_mball.h
@@ -40,7 +40,7 @@ void ED_keymap_metaball(struct wmKeyConfig *keyconf);
struct MetaElem *add_metaball_primitive(struct bContext *C, float mat[4][4], int type, int newname);
-int mouse_mball(struct bContext *C, const int mval[2], int extend);
+int mouse_mball(struct bContext *C, const int mval[2], int extend, int deselect, int toggle);
void free_editMball(struct Object *obedit);
void make_editMball(struct Object *obedit);
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index 7e84962b154..b2e8ecd09c9 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -156,7 +156,7 @@ void EDBM_automerge(struct Scene *scene, struct Object *ob, int update);
/* editmesh_mods.c */
extern unsigned int bm_vertoffs, bm_solidoffs, bm_wireoffs;
-int mouse_mesh(struct bContext *C, const int mval[2], short extend);
+int mouse_mesh(struct bContext *C, const int mval[2], short extend, short deselect, short toggle);
struct BMVert *editbmesh_get_x_mirror_vert(struct Object *ob, struct BMEditMesh *em, struct BMVert *eve, const float co[3], int index);
int mesh_get_x_mirror_vert(struct Object *ob, int index);
@@ -184,7 +184,7 @@ void EMBM_project_snap_verts(struct bContext *C, struct ARegion *ar, struct Obje
/* editface.c */
void paintface_flush_flags(struct Object *ob);
-int paintface_mouse_select(struct bContext *C, struct Object *ob, const int mval[2], int extend);
+int paintface_mouse_select(struct bContext *C, struct Object *ob, const int mval[2], int extend, int deselect, int toggle);
int do_paintface_box_select(struct ViewContext *vc, struct rcti *rect, int select, int extend);
void paintface_deselect_all_visible(struct Object *ob, int action, short flush_flags);
void paintface_select_linked(struct bContext *C, struct Object *ob, int mval[2], int mode);
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 429dcb88c78..37ed8a6c7c8 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -152,7 +152,7 @@ void ED_object_constraint_update(struct Object *ob);
void ED_object_constraint_dependency_update(struct Main *bmain, struct Scene *scene, struct Object *ob);
/* object_lattice.c */
-int mouse_lattice(struct bContext *C, const int mval[2], int extend);
+int mouse_lattice(struct bContext *C, const int mval[2], int extend, int deselect, int toggle);
void undo_push_lattice(struct bContext *C, const char *name);
/* object_lattice.c */
diff --git a/source/blender/editors/include/ED_particle.h b/source/blender/editors/include/ED_particle.h
index 36e5ca5485f..0076b08da99 100644
--- a/source/blender/editors/include/ED_particle.h
+++ b/source/blender/editors/include/ED_particle.h
@@ -58,7 +58,7 @@ void PE_hide_keys_time(struct Scene *scene, struct PTCacheEdit *edit, float cfra
void PE_update_object(struct Scene *scene, struct Object *ob, int useflag);
/* selection tools */
-int PE_mouse_particles(struct bContext *C, const int mval[2], int extend);
+int PE_mouse_particles(struct bContext *C, const int mval[2], int extend, int deselect, int toggle);
int PE_border_select(struct bContext *C, struct rcti *rect, int select, int extend);
int PE_circle_select(struct bContext *C, int selecting, const int mval[2], float rad);
int PE_lasso_select(struct bContext *C, int mcords[][2], short moves, short extend, short select);
diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c
index 3da2b4711f3..b592449fff5 100644
--- a/source/blender/editors/mesh/editface.c
+++ b/source/blender/editors/mesh/editface.c
@@ -509,7 +509,7 @@ void seam_mark_clear_tface(Scene *scene, short mode)
}
#endif
-int paintface_mouse_select(struct bContext *C, Object *ob, const int mval[2], int extend)
+int paintface_mouse_select(struct bContext *C, Object *ob, const int mval[2], int extend, int deselect, int toggle)
{
Mesh *me;
MPoly *mpoly, *mpoly_sel;
@@ -530,7 +530,7 @@ int paintface_mouse_select(struct bContext *C, Object *ob, const int mval[2], in
/* clear flags */
mpoly = me->mpoly;
a = me->totpoly;
- if (!extend) {
+ if (!extend && !deselect && !toggle) {
while (a--) {
mpoly->flag &= ~ME_FACE_SEL;
mpoly++;
@@ -540,6 +540,12 @@ int paintface_mouse_select(struct bContext *C, Object *ob, const int mval[2], in
me->act_face = (int)index;
if (extend) {
+ mpoly_sel->flag |= ME_FACE_SEL;
+ }
+ else if (deselect) {
+ mpoly_sel->flag &= ~ME_FACE_SEL;
+ }
+ else if (toggle) {
if (mpoly_sel->flag & ME_FACE_SEL)
mpoly_sel->flag &= ~ME_FACE_SEL;
else
diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c
index 55f575bbdea..0a8fe142aaf 100644
--- a/source/blender/editors/mesh/editmesh_select.c
+++ b/source/blender/editors/mesh/editmesh_select.c
@@ -1454,7 +1454,7 @@ void MESH_OT_select_shortest_path(wmOperatorType *ot)
/* ************************************************** */
/* here actual select happens */
/* gets called via generic mouse select operator */
-int mouse_mesh(bContext *C, const int mval[2], short extend)
+int mouse_mesh(bContext *C, const int mval[2], short extend, short deselect, short toggle)
{
ViewContext vc;
BMVert *eve = NULL;
@@ -1468,40 +1468,87 @@ int mouse_mesh(bContext *C, const int mval[2], short extend)
if (unified_findnearest(&vc, &eve, &eed, &efa)) {
- if (extend == 0) EDBM_flag_disable_all(vc.em, BM_ELEM_SELECT);
+ // Deselect everything
+ if (extend == 0 && deselect == 0 && toggle == 0)
+ EDBM_flag_disable_all(vc.em, BM_ELEM_SELECT);
if (efa) {
- /* set the last selected face */
- BM_active_face_set(vc.em->bm, efa);
-
- if (!BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
+ if (extend) {
+ // set the last selected face
+ BM_active_face_set(vc.em->bm, efa);
+
+ // Work-around: deselect first, so we can guarantee it will
+ // be active even if it was already selected
+ BM_select_history_remove(vc.em->bm, efa);
+ BM_face_select_set(vc.em->bm, efa, FALSE);
BM_select_history_store(vc.em->bm, efa);
BM_face_select_set(vc.em->bm, efa, TRUE);
}
- else if (extend) {
+ else if (deselect) {
BM_select_history_remove(vc.em->bm, efa);
BM_face_select_set(vc.em->bm, efa, FALSE);
}
+ else {
+ // set the last selected face
+ BM_active_face_set(vc.em->bm, efa);
+
+ if (!BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
+ BM_select_history_store(vc.em->bm, efa);
+ BM_face_select_set(vc.em->bm, efa, TRUE);
+ }
+ else if (toggle) {
+ BM_select_history_remove(vc.em->bm, efa);
+ BM_face_select_set(vc.em->bm, efa, FALSE);
+ }
+ }
}
else if (eed) {
- if (!BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
+ if (extend) {
+ // Work-around: deselect first, so we can guarantee it will
+ // be active even if it was already selected
+ BM_select_history_remove(vc.em->bm, eed);
+ BM_edge_select_set(vc.em->bm, eed, FALSE);
BM_select_history_store(vc.em->bm, eed);
BM_edge_select_set(vc.em->bm, eed, TRUE);
}
- else if (extend) {
+ else if (deselect) {
BM_select_history_remove(vc.em->bm, eed);
BM_edge_select_set(vc.em->bm, eed, FALSE);
}
+ else {
+ if (!BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
+ BM_select_history_store(vc.em->bm, eed);
+ BM_edge_select_set(vc.em->bm, eed, TRUE);
+ }
+ else if (toggle) {
+ BM_select_history_remove(vc.em->bm, eed);
+ BM_edge_select_set(vc.em->bm, eed, FALSE);
+ }
+ }
}
else if (eve) {
- if (!BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
+ if (extend) {
+ // Work-around: deselect first, so we can guarantee it will
+ // be active even if it was already selected
+ BM_select_history_remove(vc.em->bm, eve);
+ BM_vert_select_set(vc.em->bm, eve, FALSE);
BM_select_history_store(vc.em->bm, eve);
BM_vert_select_set(vc.em->bm, eve, TRUE);
}
- else if (extend) {
+ else if (deselect) {
BM_select_history_remove(vc.em->bm, eve);
BM_vert_select_set(vc.em->bm, eve, FALSE);
}
+ else {
+ if (!BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
+ BM_select_history_store(vc.em->bm, eve);
+ BM_vert_select_set(vc.em->bm, eve, TRUE);
+ }
+ else if (toggle) {
+ BM_select_history_remove(vc.em->bm, eve);
+ BM_vert_select_set(vc.em->bm, eve, FALSE);
+ }
+ }
}
EDBM_selectmode_flush(vc.em);
diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c
index 701a3517535..7b7aaf5a3db 100644
--- a/source/blender/editors/metaball/mball_edit.c
+++ b/source/blender/editors/metaball/mball_edit.c
@@ -415,7 +415,7 @@ void MBALL_OT_reveal_metaelems(wmOperatorType *ot)
/* Select MetaElement with mouse click (user can select radius circle or
* stiffness circle) */
-int mouse_mball(bContext *C, const int mval[2], int extend)
+int mouse_mball(bContext *C, const int mval[2], int extend, int deselect, int toggle)
{
static MetaElem *startelem = NULL;
Object *obedit = CTX_data_edit_object(C);
@@ -467,7 +467,19 @@ int mouse_mball(bContext *C, const int mval[2], int extend)
/* When some metaelem was found, then it is necessary to select or
* deselect it. */
if (act) {
- if (extend == 0) {
+ if (extend) {
+ act->flag |= SELECT;
+ }
+ else if (deselect) {
+ act->flag &= ~SELECT;
+ }
+ else if (toggle) {
+ if (act->flag & SELECT)
+ act->flag &= ~SELECT;
+ else
+ act->flag |= SELECT;
+ }
+ else {
/* Deselect all existing metaelems */
ml = mb->editelems->first;
while (ml) {
@@ -477,12 +489,7 @@ int mouse_mball(bContext *C, const int mval[2], int extend)
/* Select only metaelem clicked on */
act->flag |= SELECT;
}
- else {
- if (act->flag & SELECT)
- act->flag &= ~SELECT;
- else
- act->flag |= SELECT;
- }
+
mb->lastelem = act;
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, mb);
diff --git a/source/blender/editors/object/object_lattice.c b/source/blender/editors/object/object_lattice.c
index 7b37ca8ab95..f6e8ccf4ec9 100644
--- a/source/blender/editors/object/object_lattice.c
+++ b/source/blender/editors/object/object_lattice.c
@@ -335,7 +335,7 @@ static BPoint *findnearestLattvert(ViewContext *vc, const int mval[2], int sel)
return data.bp;
}
-int mouse_lattice(bContext *C, const int mval[2], int extend)
+int mouse_lattice(bContext *C, const int mval[2], int extend, int deselect, int toggle)
{
ViewContext vc;
BPoint *bp = NULL;
@@ -344,12 +344,20 @@ int mouse_lattice(bContext *C, const int mval[2], int extend)
bp = findnearestLattvert(&vc, mval, 1);
if (bp) {
- if (extend == 0) {
- ED_setflagsLatt(vc.obedit, 0);
- bp->f1 |= SELECT;
+ if (extend) {
+ bp->f1 |= SELECT;
+ }
+ else if (deselect) {
+ bp->f1 &= ~SELECT;
+ }
+ else if (toggle) {
+ bp->f1 ^= SELECT; /* swap */
}
else
- bp->f1 ^= SELECT; /* swap */
+ {
+ ED_setflagsLatt(vc.obedit, 0);
+ bp->f1 |= SELECT;
+ }
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit->data);
diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c
index adb5cdede2a..d6cf46363d3 100644
--- a/source/blender/editors/physics/particle_edit.c
+++ b/source/blender/editors/physics/particle_edit.c
@@ -1294,6 +1294,26 @@ static void select_keys(PEData *data, int point_index, int UNUSED(key_index))
point->flag |= PEP_EDIT_RECALC;
}
+static void extend_key_select(PEData *data, int point_index, int key_index)
+{
+ PTCacheEdit *edit = data->edit;
+ PTCacheEditPoint *point = edit->points + point_index;
+ PTCacheEditKey *key = point->keys + key_index;
+
+ key->flag |= PEK_SELECT;
+ point->flag |= PEP_EDIT_RECALC;
+}
+
+static void deselect_key_select(PEData *data, int point_index, int key_index)
+{
+ PTCacheEdit *edit = data->edit;
+ PTCacheEditPoint *point = edit->points + point_index;
+ PTCacheEditKey *key = point->keys + key_index;
+
+ key->flag &= ~PEK_SELECT;
+ point->flag |= PEP_EDIT_RECALC;
+}
+
static void toggle_key_select(PEData *data, int point_index, int key_index)
{
PTCacheEdit *edit = data->edit;
@@ -1381,7 +1401,7 @@ void PARTICLE_OT_select_all(wmOperatorType *ot)
/************************ pick select operator ************************/
-int PE_mouse_particles(bContext *C, const int mval[2], int extend)
+int PE_mouse_particles(bContext *C, const int mval[2], int extend, int deselect, int toggle)
{
PEData data;
Scene *scene= CTX_data_scene(C);
@@ -1392,7 +1412,7 @@ int PE_mouse_particles(bContext *C, const int mval[2], int extend)
if (!PE_start_edit(edit))
return OPERATOR_CANCELLED;
- if (!extend) {
+ if (!extend && !deselect && !toggle) {
LOOP_VISIBLE_POINTS {
LOOP_SELECTED_KEYS {
key->flag &= ~PEK_SELECT;
@@ -1405,7 +1425,13 @@ int PE_mouse_particles(bContext *C, const int mval[2], int extend)
data.mval= mval;
data.rad= 75.0f;
- for_mouse_hit_keys(&data, toggle_key_select, 1); /* nearest only */
+ /* 1 = nearest only */
+ if (extend)
+ for_mouse_hit_keys(&data, extend_key_select, 1);
+ else if (deselect)
+ for_mouse_hit_keys(&data, deselect_key_select, 1);
+ else
+ for_mouse_hit_keys(&data, toggle_key_select, 1);
PE_update_selection(scene, ob, 1);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_SELECTED, data.ob);
diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c
index f760254e8d2..7b3e7358978 100644
--- a/source/blender/editors/space_view3d/view3d_ops.c
+++ b/source/blender/editors/space_view3d/view3d_ops.c
@@ -272,21 +272,29 @@ void view3d_keymap(wmKeyConfig *keyconf)
/* selection*/
kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
RNA_boolean_set(kmi->ptr, "extend", FALSE);
+ RNA_boolean_set(kmi->ptr, "deselect", FALSE);
+ RNA_boolean_set(kmi->ptr, "toggle", FALSE);
RNA_boolean_set(kmi->ptr, "center", FALSE);
RNA_boolean_set(kmi->ptr, "object", FALSE);
RNA_boolean_set(kmi->ptr, "enumerate", FALSE);
kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
- RNA_boolean_set(kmi->ptr, "extend", TRUE);
+ RNA_boolean_set(kmi->ptr, "extend", FALSE);
+ RNA_boolean_set(kmi->ptr, "deselect", FALSE);
+ RNA_boolean_set(kmi->ptr, "toggle", TRUE);
RNA_boolean_set(kmi->ptr, "center", FALSE);
RNA_boolean_set(kmi->ptr, "object", FALSE);
RNA_boolean_set(kmi->ptr, "enumerate", FALSE);
kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
RNA_boolean_set(kmi->ptr, "extend", FALSE);
+ RNA_boolean_set(kmi->ptr, "deselect", FALSE);
+ RNA_boolean_set(kmi->ptr, "toggle", FALSE);
RNA_boolean_set(kmi->ptr, "center", TRUE);
RNA_boolean_set(kmi->ptr, "object", TRUE); /* use Ctrl+Select for 2 purposes */
RNA_boolean_set(kmi->ptr, "enumerate", FALSE);
kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_ALT, 0);
RNA_boolean_set(kmi->ptr, "extend", FALSE);
+ RNA_boolean_set(kmi->ptr, "deselect", FALSE);
+ RNA_boolean_set(kmi->ptr, "toggle", FALSE);
RNA_boolean_set(kmi->ptr, "center", FALSE);
RNA_boolean_set(kmi->ptr, "object", FALSE);
RNA_boolean_set(kmi->ptr, "enumerate", TRUE);
@@ -294,21 +302,29 @@ void view3d_keymap(wmKeyConfig *keyconf)
/* selection key-combinations */
kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
RNA_boolean_set(kmi->ptr, "extend", TRUE);
+ RNA_boolean_set(kmi->ptr, "deselect", FALSE);
+ RNA_boolean_set(kmi->ptr, "toggle", TRUE);
RNA_boolean_set(kmi->ptr, "center", TRUE);
RNA_boolean_set(kmi->ptr, "object", FALSE);
RNA_boolean_set(kmi->ptr, "enumerate", FALSE);
kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL | KM_ALT, 0);
RNA_boolean_set(kmi->ptr, "extend", FALSE);
+ RNA_boolean_set(kmi->ptr, "deselect", FALSE);
+ RNA_boolean_set(kmi->ptr, "toggle", FALSE);
RNA_boolean_set(kmi->ptr, "center", TRUE);
RNA_boolean_set(kmi->ptr, "object", FALSE);
RNA_boolean_set(kmi->ptr, "enumerate", TRUE);
kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", TRUE);
+ RNA_boolean_set(kmi->ptr, "extend", FALSE);
+ RNA_boolean_set(kmi->ptr, "deselect", FALSE);
+ RNA_boolean_set(kmi->ptr, "toggle", TRUE);
RNA_boolean_set(kmi->ptr, "center", FALSE);
RNA_boolean_set(kmi->ptr, "object", FALSE);
RNA_boolean_set(kmi->ptr, "enumerate", TRUE);
kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT | KM_CTRL | KM_ALT, 0);
- RNA_boolean_set(kmi->ptr, "extend", TRUE);
+ RNA_boolean_set(kmi->ptr, "extend", FALSE);
+ RNA_boolean_set(kmi->ptr, "deselect", FALSE);
+ RNA_boolean_set(kmi->ptr, "toggle", TRUE);
RNA_boolean_set(kmi->ptr, "center", TRUE);
RNA_boolean_set(kmi->ptr, "object", FALSE);
RNA_boolean_set(kmi->ptr, "enumerate", TRUE);
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 0bbd03c10bb..c2d58349075 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -1311,7 +1311,7 @@ static void deselect_all_tracks(MovieTracking *tracking)
}
/* mval is region coords */
-static int mouse_select(bContext *C, const int mval[2], short extend, short obcenter, short enumerate)
+static int mouse_select(bContext *C, const int mval[2], short extend, short deselect, short toggle, short obcenter, short enumerate)
{
ViewContext vc;
ARegion *ar = CTX_wm_region(C);
@@ -1438,7 +1438,7 @@ static int mouse_select(bContext *C, const int mval[2], short extend, short obce
}
}
}
- else if (ED_do_pose_selectbuffer(scene, basact, buffer, hits, extend) ) { /* then bone is found */
+ else if (ED_do_pose_selectbuffer(scene, basact, buffer, hits, extend, deselect, toggle) ) { /* then bone is found */
/* we make the armature selected:
* not-selected active object in posemode won't work well for tools */
@@ -1477,20 +1477,23 @@ static int mouse_select(bContext *C, const int mval[2], short extend, short obce
oldbasact = BASACT;
- if (!extend) {
- deselectall_except(scene, basact);
+ if (extend) {
ED_base_object_select(basact, BA_SELECT);
}
- else if (0) {
- // XXX select_all_from_groups(basact);
+ else if(deselect) {
+ ED_base_object_select(basact, BA_DESELECT);
}
- else {
+ else if(toggle) {
if (basact->flag & SELECT) {
if (basact == oldbasact)
ED_base_object_select(basact, BA_DESELECT);
}
else ED_base_object_select(basact, BA_SELECT);
}
+ else {
+ deselectall_except(scene, basact);
+ ED_base_object_select(basact, BA_SELECT);
+ }
if (oldbasact != basact) {
ED_base_object_activate(C, basact); /* adds notifier */
@@ -2043,7 +2046,7 @@ static int vertsel_vert_pick(struct bContext *C, Mesh *me, const int mval[2], un
/* mouse selection in weight paint */
/* gets called via generic mouse select operator */
-static int mouse_weight_paint_vertex_select(bContext *C, const int mval[2], short extend, Object *obact)
+static int mouse_weight_paint_vertex_select(bContext *C, const int mval[2], short extend, short deselect, short toggle, Object *obact)
{
Mesh *me = obact->data; /* already checked for NULL */
unsigned int index = 0;
@@ -2052,6 +2055,12 @@ static int mouse_weight_paint_vertex_select(bContext *C, const int mval[2], shor
if (vertsel_vert_pick(C, me, mval, &index, 50)) {
mv = me->mvert + index;
if (extend) {
+ mv->flag |= SELECT;
+ }
+ else if (deselect) {
+ mv->flag &= ~SELECT;
+ }
+ else if (toggle) {
mv->flag ^= SELECT;
}
else {
@@ -2073,6 +2082,8 @@ static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
Object *obedit = CTX_data_edit_object(C);
Object *obact = CTX_data_active_object(C);
short extend = RNA_boolean_get(op->ptr, "extend");
+ short deselect = RNA_boolean_get(op->ptr, "deselect");
+ short toggle = RNA_boolean_get(op->ptr, "toggle");
short center = RNA_boolean_get(op->ptr, "center");
short enumerate = RNA_boolean_get(op->ptr, "enumerate");
short object = RNA_boolean_get(op->ptr, "object");
@@ -2092,27 +2103,27 @@ static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
if (obedit && object == FALSE) {
if (obedit->type == OB_MESH)
- retval = mouse_mesh(C, event->mval, extend);
+ retval = mouse_mesh(C, event->mval, extend, deselect, toggle);
else if (obedit->type == OB_ARMATURE)
- retval = mouse_armature(C, event->mval, extend);
+ retval = mouse_armature(C, event->mval, extend, deselect, toggle);
else if (obedit->type == OB_LATTICE)
- retval = mouse_lattice(C, event->mval, extend);
+ retval = mouse_lattice(C, event->mval, extend, deselect, toggle);
else if (ELEM(obedit->type, OB_CURVE, OB_SURF))
- retval = mouse_nurb(C, event->mval, extend);
+ retval = mouse_nurb(C, event->mval, extend, deselect, toggle);
else if (obedit->type == OB_MBALL)
- retval = mouse_mball(C, event->mval, extend);
+ retval = mouse_mball(C, event->mval, extend, deselect, toggle);
}
else if (obact && obact->mode & OB_MODE_SCULPT)
return OPERATOR_CANCELLED;
else if (obact && obact->mode & OB_MODE_PARTICLE_EDIT)
- return PE_mouse_particles(C, event->mval, extend);
+ return PE_mouse_particles(C, event->mval, extend, deselect, toggle);
else if (obact && paint_facesel_test(obact))
- retval = paintface_mouse_select(C, obact, event->mval, extend);
+ retval = paintface_mouse_select(C, obact, event->mval, extend, deselect, toggle);
else if (paint_vertsel_test(obact))
- retval = mouse_weight_paint_vertex_select(C, event->mval, extend, obact);
+ retval = mouse_weight_paint_vertex_select(C, event->mval, extend, deselect, toggle, obact);
else
- retval = mouse_select(C, event->mval, extend, center, enumerate);
+ retval = mouse_select(C, event->mval, extend, deselect, toggle, center, enumerate);
/* passthrough allows tweaks
* FINISHED to signal one operator worked
@@ -2139,6 +2150,8 @@ void VIEW3D_OT_select(wmOperatorType *ot)
/* properties */
RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend selection instead of deselecting everything first");
+ RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "Remove from selection");
+ RNA_def_boolean(ot->srna, "toggle", 0, "Toggle Selection", "Toggles selection");
RNA_def_boolean(ot->srna, "center", 0, "Center", "Use the object center when selecting, in editmode used to extend object selection");
RNA_def_boolean(ot->srna, "enumerate", 0, "Enumerate", "List objects under the mouse (object mode only)");
RNA_def_boolean(ot->srna, "object", 0, "Object", "Use object selection (editmode only)");