Internal refactoring of tracking module, should be no functional changes
[blender.git] / source / blender / editors / space_view3d / view3d_select.c
index f106fcc268e20c6c66a269d9978b15029e498663..f9ebd4e39c1656fa0341634ca4aa4ed195ab08ff 100644 (file)
@@ -64,6 +64,7 @@
 #include "BKE_context.h"
 #include "BKE_paint.h"
 #include "BKE_armature.h"
+#include "BKE_depsgraph.h"
 #include "BKE_tessmesh.h"
 #include "BKE_movieclip.h"
 #include "BKE_object.h"
@@ -333,7 +334,7 @@ static void do_lasso_select_pose(ViewContext *vc, Object *ob, int mcords[][2], s
        int sco1[2], sco2[2];
        bArmature *arm = ob->data;
        
-       if (ob->type != OB_ARMATURE || ob->pose == NULL) return;
+       if ((ob->type != OB_ARMATURE) || (ob->pose == NULL)) return;
 
        for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
                if (PBONE_VISIBLE(arm, pchan->bone) && (pchan->bone->flag & BONE_UNSELECTABLE) == 0) {
@@ -348,6 +349,11 @@ static void do_lasso_select_pose(ViewContext *vc, Object *ob, int mcords[][2], s
                        }
                }
        }
+       
+       if (arm->flag & ARM_HAS_VIZ_DEPS) {
+               /* mask modifier ('armature' mode), etc. */
+               DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+       }
 }
 
 static void object_deselect_all_visible(Scene *scene, View3D *v3d)
@@ -405,7 +411,7 @@ static void do_lasso_select_mesh__doSelectEdge(void *userData, BMEdge *eed, int
                            BLI_lasso_is_point_inside(data->mcords, data->moves, x1, y1, IS_CLIPPED))
                        {
                                BM_edge_select_set(data->vc->em->bm, eed, data->select);
-                               data->done = 1;
+                               data->done = TRUE;
                        }
                }
                else {
@@ -443,7 +449,7 @@ static void do_lasso_select_mesh(ViewContext *vc, int mcords[][2], short moves,
        data.mcords = mcords;
        data.moves = moves;
        data.select = select;
-       data.done = 0;
+       data.done = FALSE;
        data.pass = 0;
 
        if (extend == 0 && select)
@@ -500,7 +506,7 @@ static void do_lasso_select_curve__doSelect(void *userData, Nurb *UNUSED(nu), BP
                }
                else {
                        if (cu->drawflag & CU_HIDE_HANDLES) {
-                               /* can only be beztindex==0 here since handles are hidden */
+                               /* can only be (beztindex == 0) here since handles are hidden */
                                bezt->f1 = bezt->f2 = bezt->f3 = data->select ? (bezt->f2 | SELECT) : (bezt->f2 & ~SELECT);
                        }
                        else {
@@ -827,22 +833,10 @@ static void view3d_lasso_select(bContext *C, ViewContext *vc, int mcords[][2], s
 static int view3d_lasso_select_exec(bContext *C, wmOperator *op)
 {
        ViewContext vc;
-       int i = 0;
-       int mcords[1024][2];
-
-       RNA_BEGIN (op->ptr, itemptr, "path")
-       {
-               float loc[2];
-               
-               RNA_float_get_array(&itemptr, "loc", loc);
-               mcords[i][0] = (int)loc[0];
-               mcords[i][1] = (int)loc[1];
-               i++;
-               if (i >= 1024) break;
-       }
-       RNA_END;
+       int mcords_tot;
+       int (*mcords)[2] = WM_gesture_lasso_path_to_array(C, op, &mcords_tot);
        
-       if (i > 1) {
+       if (mcords) {
                short extend, select;
                view3d_operator_needs_opengl(C);
                
@@ -851,8 +845,10 @@ static int view3d_lasso_select_exec(bContext *C, wmOperator *op)
                
                extend = RNA_boolean_get(op->ptr, "extend");
                select = !RNA_boolean_get(op->ptr, "deselect");
-               view3d_lasso_select(C, &vc, mcords, i, extend, select);
+               view3d_lasso_select(C, &vc, mcords, mcords_tot, extend, select);
                
+               MEM_freeN(mcords);
+
                return OPERATOR_FINISHED;
        }
        return OPERATOR_PASS_THROUGH;
@@ -1190,19 +1186,19 @@ static Base *mouse_select_eval_buffer(ViewContext *vc, unsigned int *buffer, int
        View3D *v3d = vc->v3d;
        Base *base, *basact = NULL;
        static int lastmval[2] = {-100, -100};
-       int a, donearest = 0;
+       int a, do_nearest = FALSE;
        
        /* define if we use solid nearest select or not */
        if (v3d->drawtype > OB_WIRE) {
-               donearest = 1;
+               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 */
-                               donearest = 0;
+                               do_nearest = FALSE;
                }
        }
        lastmval[0] = mval[0]; lastmval[1] = mval[1];
        
-       if (donearest) {
+       if (do_nearest) {
                unsigned int min = 0xFFFFFFFF;
                int selcol = 0, notcol = 0;
                
@@ -1307,11 +1303,11 @@ static void deselect_all_tracks(MovieTracking *tracking)
 
        object = tracking->objects.first;
        while (object) {
-               ListBase *tracksbase = BKE_tracking_object_tracks(tracking, object);
+               ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, object);
                MovieTrackingTrack *track = tracksbase->first;
 
                while (track) {
-                       BKE_tracking_deselect_track(track, TRACK_AREA_ALL);
+                       BKE_tracking_track_deselect(track, TRACK_AREA_ALL);
 
                        track = track->next;
                }
@@ -1321,7 +1317,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);
@@ -1407,23 +1403,23 @@ static int mouse_select(bContext *C, const int mval[2], short extend, short obce
                                                        /* index of bundle is 1<<16-based. if there's no "bone" index
                                                         * in hight word, this buffer value belongs to camera,. not to bundle */
                                                        if (buffer[4 * i + 3] & 0xFFFF0000) {
-                                                               MovieClip *clip = object_get_movieclip(scene, basact->object, 0);
+                                                               MovieClip *clip = BKE_object_movieclip_get(scene, basact->object, 0);
                                                                MovieTracking *tracking = &clip->tracking;
                                                                ListBase *tracksbase;
                                                                MovieTrackingTrack *track;
 
-                                                               track = BKE_tracking_indexed_track(&clip->tracking, hitresult >> 16, &tracksbase);
+                                                               track = BKE_tracking_track_get_indexed(&clip->tracking, hitresult >> 16, &tracksbase);
 
                                                                if (TRACK_SELECTED(track) && extend) {
                                                                        changed = 0;
-                                                                       BKE_tracking_deselect_track(track, TRACK_AREA_ALL);
+                                                                       BKE_tracking_track_deselect(track, TRACK_AREA_ALL);
                                                                }
                                                                else {
                                                                        int oldsel = TRACK_SELECTED(track) ? 1 : 0;
                                                                        if (!extend)
                                                                                deselect_all_tracks(tracking);
 
-                                                                       BKE_tracking_select_track(tracksbase, track, TRACK_AREA_ALL, extend);
+                                                                       BKE_tracking_track_select(tracksbase, track, TRACK_AREA_ALL, extend);
 
                                                                        if (oldsel != (TRACK_SELECTED(track) ? 1 : 0))
                                                                                changed = 1;
@@ -1448,7 +1444,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 */
@@ -1487,19 +1483,25 @@ 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)
+                                       if (basact == oldbasact) {
                                                ED_base_object_select(basact, BA_DESELECT);
+                                       }
+                               }
+                               else {
+                                       ED_base_object_select(basact, BA_SELECT);
                                }
-                               else ED_base_object_select(basact, BA_SELECT);
+                       }
+                       else {
+                               deselectall_except(scene, basact);
+                               ED_base_object_select(basact, BA_SELECT);
                        }
 
                        if (oldbasact != basact) {
@@ -1556,7 +1558,7 @@ static void do_nurbs_box_select__doSelect(void *userData, Nurb *UNUSED(nu), BPoi
                }
                else {
                        if (cu->drawflag & CU_HIDE_HANDLES) {
-                               /* can only be beztindex==0 here since handles are hidden */
+                               /* can only be (beztindex == 0) here since handles are hidden */
                                bezt->f1 = bezt->f2 = bezt->f3 = data->select ? (bezt->f2 | SELECT) : (bezt->f2 & ~SELECT);
                        }
                        else {
@@ -1633,7 +1635,7 @@ static void do_mesh_box_select__doSelectEdge(void *userData, BMEdge *eed, int x0
                if (data->pass == 0) {
                        if (edge_fully_inside_rect(data->rect, x0, y0, x1, y1)) {
                                BM_edge_select_set(data->vc->em->bm, eed, data->select);
-                               data->done = 1;
+                               data->done = TRUE;
                        }
                }
                else {
@@ -1661,7 +1663,7 @@ static int do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int exten
        data.rect = rect;
        data.select = select;
        data.pass = 0;
-       data.done = 0;
+       data.done = FALSE;
 
        if (extend == 0 && select)
                EDBM_flag_disable_all(vc->em, BM_ELEM_SELECT);
@@ -1868,7 +1870,6 @@ static int do_object_pose_box_select(bContext *C, ViewContext *vc, rcti *rect, i
                for (base = vc->scene->base.first; base && hits; base = base->next) {
                        if (BASE_SELECTABLE(vc->v3d, base)) {
                                while (base->selcol == (*col & 0xFFFF)) {   /* we got an object */
-                                       
                                        if (*col & 0xFFFF0000) {                    /* we got a bone */
                                                bone = get_indexed_bone(base->object, *col & ~(BONESEL_ANY));
                                                if (bone) {
@@ -1876,16 +1877,13 @@ static int do_object_pose_box_select(bContext *C, ViewContext *vc, rcti *rect, i
                                                                if ((bone->flag & BONE_UNSELECTABLE) == 0) {
                                                                        bone->flag |= BONE_SELECTED;
                                                                        bone_selected = 1;
-// XXX                                                                 select_actionchannel_by_name(base->object->action, bone->name, 1);
                                                                }
                                                        }
                                                        else {
                                                                bArmature *arm = base->object->data;
                                                                bone->flag &= ~BONE_SELECTED;
-// XXX                                                                 select_actionchannel_by_name(base->object->action, bone->name, 0);
                                                                if (arm->act_bone == bone)
                                                                        arm->act_bone = NULL;
-                                                               
                                                        }
                                                }
                                        }
@@ -1895,7 +1893,7 @@ static int do_object_pose_box_select(bContext *C, ViewContext *vc, rcti *rect, i
                                                else
                                                        ED_base_object_select(base, BA_DESELECT);
                                        }
-
+                                       
                                        col += 4; /* next color */
                                        hits--;
                                        if (hits == 0) break;
@@ -1903,12 +1901,22 @@ static int do_object_pose_box_select(bContext *C, ViewContext *vc, rcti *rect, i
                        }
                        
                        if (bone_selected) {
-                               WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, base->object);
+                               Object *ob = base->object;
+                               
+                               if (ob && (ob->type == OB_ARMATURE)) {
+                                       bArmature *arm = ob->data;
+                                       
+                                       WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+                                       
+                                       if (arm && (arm->flag & ARM_HAS_VIZ_DEPS)) {
+                                               /* mask modifier ('armature' mode), etc. */
+                                               DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+                                       }
+                               }
                        }
                }
-
+               
                WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, vc->scene);
-
        }
        MEM_freeN(vbuffer);
 
@@ -2053,15 +2061,21 @@ 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 */
+       Mesh *me = obact->data; /* already checked for NULL */
        unsigned int index = 0;
        MVert *mv;
 
        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 {
@@ -2083,6 +2097,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");
@@ -2102,27 +2118,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
@@ -2148,7 +2164,8 @@ void VIEW3D_OT_select(wmOperatorType *ot)
        ot->flag = OPTYPE_UNDO;
        
        /* properties */
-       RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend selection instead of deselecting everything first");
+       WM_operator_properties_mouse_select(ot);
+
        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)");
@@ -2291,7 +2308,7 @@ static void nurbscurve_circle_doSelect(void *userData, Nurb *UNUSED(nu), BPoint
                }
                else {
                        if (cu->drawflag & CU_HIDE_HANDLES) {
-                               /* can only be beztindex==0 here since handles are hidden */
+                               /* can only be (beztindex == 0) here since handles are hidden */
                                bezt->f1 = bezt->f2 = bezt->f3 = data->select ? (bezt->f2 | SELECT) : (bezt->f2 & ~SELECT);
                        }
                        else {