Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_view3d/view3d_select.c
| Show First 20 Lines • Show All 115 Lines • ▼ Show 20 Lines | void ED_view3d_viewcontext_init(bContext *C, ViewContext *vc) | ||||
| vc->engine_type = CTX_data_engine_type(C); | vc->engine_type = CTX_data_engine_type(C); | ||||
| vc->v3d = CTX_wm_view3d(C); | vc->v3d = CTX_wm_view3d(C); | ||||
| vc->win = CTX_wm_window(C); | vc->win = CTX_wm_window(C); | ||||
| vc->rv3d = CTX_wm_region_view3d(C); | vc->rv3d = CTX_wm_region_view3d(C); | ||||
| vc->obact = CTX_data_active_object(C); | vc->obact = CTX_data_active_object(C); | ||||
| vc->obedit = CTX_data_edit_object(C); | vc->obedit = CTX_data_edit_object(C); | ||||
| } | } | ||||
| void ED_view3d_viewcontext_init_object(ViewContext *vc, Object *obact) | |||||
| { | |||||
| vc->obact = obact; | |||||
| if (vc->obedit) { | |||||
| BLI_assert(BKE_object_is_in_editmode(obact)); | |||||
| vc->obedit = obact; | |||||
| /* previous selections are now invalid. */ | |||||
| vc->v3d->flag |= V3D_INVALID_BACKBUF; | |||||
| if (vc->em) { | |||||
| vc->em = BKE_editmesh_from_object(vc->obedit); | |||||
| } | |||||
| } | |||||
| } | |||||
| /* ********************** view3d_select: selection manipulations ********************* */ | /* ********************** view3d_select: selection manipulations ********************* */ | ||||
| /* local prototypes */ | /* local prototypes */ | ||||
| static void edbm_backbuf_check_and_select_verts(BMEditMesh *em, const bool select) | static void edbm_backbuf_check_and_select_verts(BMEditMesh *em, const bool select) | ||||
| { | { | ||||
| BMVert *eve; | BMVert *eve; | ||||
| BMIter iter; | BMIter iter; | ||||
| ▲ Show 20 Lines • Show All 706 Lines • ▼ Show 20 Lines | else if (ob && (eval_ctx.object_mode & OB_MODE_PARTICLE_EDIT)) { | ||||
| PE_lasso_select(C, mcords, moves, extend, select); | PE_lasso_select(C, mcords, moves, extend, select); | ||||
| } | } | ||||
| else { | else { | ||||
| do_lasso_select_objects(&eval_ctx, vc, mcords, moves, extend, select); | do_lasso_select_objects(&eval_ctx, vc, mcords, moves, extend, select); | ||||
| WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, vc->scene); | WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, vc->scene); | ||||
| } | } | ||||
| } | } | ||||
| else { /* Edit Mode */ | else { /* Edit Mode */ | ||||
| /* don't indent to avoid diff noise! */ | |||||
| FOREACH_OBJECT_IN_MODE_BEGIN (eval_ctx.view_layer, eval_ctx.object_mode, ob_iter) { | |||||
| ED_view3d_viewcontext_init_object(vc, ob_iter); | |||||
| /* --- */ | |||||
| switch (vc->obedit->type) { | switch (vc->obedit->type) { | ||||
| case OB_MESH: | case OB_MESH: | ||||
| do_lasso_select_mesh(&eval_ctx, vc, mcords, moves, extend, select); | do_lasso_select_mesh(&eval_ctx, vc, mcords, moves, extend, select); | ||||
| break; | break; | ||||
| case OB_CURVE: | case OB_CURVE: | ||||
| case OB_SURF: | case OB_SURF: | ||||
| do_lasso_select_curve(vc, mcords, moves, extend, select); | do_lasso_select_curve(vc, mcords, moves, extend, select); | ||||
| break; | break; | ||||
| case OB_LATTICE: | case OB_LATTICE: | ||||
| do_lasso_select_lattice(vc, mcords, moves, extend, select); | do_lasso_select_lattice(vc, mcords, moves, extend, select); | ||||
| break; | break; | ||||
| case OB_ARMATURE: | case OB_ARMATURE: | ||||
| do_lasso_select_armature(vc, mcords, moves, extend, select); | do_lasso_select_armature(vc, mcords, moves, extend, select); | ||||
| break; | break; | ||||
| case OB_MBALL: | case OB_MBALL: | ||||
| do_lasso_select_meta(vc, mcords, moves, extend, select); | do_lasso_select_meta(vc, mcords, moves, extend, select); | ||||
| break; | break; | ||||
| default: | default: | ||||
| assert(!"lasso select on incorrect object type"); | assert(!"lasso select on incorrect object type"); | ||||
| break; | break; | ||||
| } | } | ||||
| WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc->obedit->data); | WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc->obedit->data); | ||||
| } FOREACH_OBJECT_IN_MODE_END; | |||||
| } | } | ||||
| } | } | ||||
| /* lasso operator gives properties, but since old code works | /* lasso operator gives properties, but since old code works | ||||
| * with short array we convert */ | * with short array we convert */ | ||||
| static int view3d_lasso_select_exec(bContext *C, wmOperator *op) | static int view3d_lasso_select_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 1,255 Lines • ▼ Show 20 Lines | static int view3d_borderselect_exec(bContext *C, wmOperator *op) | ||||
| CTX_data_eval_ctx(C, &eval_ctx); | CTX_data_eval_ctx(C, &eval_ctx); | ||||
| ED_view3d_viewcontext_init(C, &vc); | ED_view3d_viewcontext_init(C, &vc); | ||||
| select = !RNA_boolean_get(op->ptr, "deselect"); | select = !RNA_boolean_get(op->ptr, "deselect"); | ||||
| extend = RNA_boolean_get(op->ptr, "extend"); | extend = RNA_boolean_get(op->ptr, "extend"); | ||||
| WM_operator_properties_border_to_rcti(op, &rect); | WM_operator_properties_border_to_rcti(op, &rect); | ||||
| if (vc.obedit) { | if (vc.obedit) { | ||||
| /* don't indent to avoid diff noise! */ | |||||
| FOREACH_OBJECT_IN_MODE_BEGIN (eval_ctx.view_layer, eval_ctx.object_mode, ob_iter) { | |||||
| ED_view3d_viewcontext_init_object(&vc, ob_iter); | |||||
| /* --- */ | |||||
| switch (vc.obedit->type) { | switch (vc.obedit->type) { | ||||
| case OB_MESH: | case OB_MESH: | ||||
| vc.em = BKE_editmesh_from_object(vc.obedit); | vc.em = BKE_editmesh_from_object(vc.obedit); | ||||
| ret = do_mesh_box_select(&eval_ctx, &vc, &rect, select, extend); | ret |= do_mesh_box_select(&eval_ctx, &vc, &rect, select, extend); | ||||
| // if (EM_texFaceCheck()) | // if (EM_texFaceCheck()) | ||||
| if (ret & OPERATOR_FINISHED) { | if (ret & OPERATOR_FINISHED) { | ||||
| WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit->data); | WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit->data); | ||||
| } | } | ||||
| break; | break; | ||||
| case OB_CURVE: | case OB_CURVE: | ||||
| case OB_SURF: | case OB_SURF: | ||||
| ret = do_nurbs_box_select(&vc, &rect, select, extend); | ret |= do_nurbs_box_select(&vc, &rect, select, extend); | ||||
| if (ret & OPERATOR_FINISHED) { | if (ret & OPERATOR_FINISHED) { | ||||
| WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit->data); | WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit->data); | ||||
| } | } | ||||
| break; | break; | ||||
| case OB_MBALL: | case OB_MBALL: | ||||
| ret = do_meta_box_select(&eval_ctx, &vc, &rect, select, extend); | ret |= do_meta_box_select(&eval_ctx, &vc, &rect, select, extend); | ||||
| if (ret & OPERATOR_FINISHED) { | if (ret & OPERATOR_FINISHED) { | ||||
| WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit->data); | WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit->data); | ||||
| } | } | ||||
| break; | break; | ||||
| case OB_ARMATURE: | case OB_ARMATURE: | ||||
| ret = do_armature_box_select(&eval_ctx, &vc, &rect, select, extend); | ret |= do_armature_box_select(&eval_ctx, &vc, &rect, select, extend); | ||||
| if (ret & OPERATOR_FINISHED) { | if (ret & OPERATOR_FINISHED) { | ||||
| WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, vc.obedit); | WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, vc.obedit); | ||||
| } | } | ||||
| break; | break; | ||||
| case OB_LATTICE: | case OB_LATTICE: | ||||
| ret = do_lattice_box_select(&vc, &rect, select, extend); | ret |= do_lattice_box_select(&vc, &rect, select, extend); | ||||
| if (ret & OPERATOR_FINISHED) { | if (ret & OPERATOR_FINISHED) { | ||||
| WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit->data); | WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit->data); | ||||
| } | } | ||||
| break; | break; | ||||
| default: | default: | ||||
| assert(!"border select on incorrect object type"); | assert(!"border select on incorrect object type"); | ||||
| break; | break; | ||||
| } | }} FOREACH_OBJECT_IN_MODE_END; | ||||
| } | } | ||||
| else { /* no editmode, unified for bones and objects */ | else { /* no editmode, unified for bones and objects */ | ||||
| if (vc.obact && eval_ctx.object_mode & OB_MODE_SCULPT) { | if (vc.obact && eval_ctx.object_mode & OB_MODE_SCULPT) { | ||||
| ret = ED_sculpt_mask_box_select(C, &vc, &rect, select, extend); | ret |= ED_sculpt_mask_box_select(C, &vc, &rect, select, extend); | ||||
| } | } | ||||
| else if (vc.obact && BKE_paint_select_face_test(vc.obact, eval_ctx.object_mode)) { | else if (vc.obact && BKE_paint_select_face_test(vc.obact, eval_ctx.object_mode)) { | ||||
| ret = do_paintface_box_select(&eval_ctx, &vc, &rect, select, extend); | ret |= do_paintface_box_select(&eval_ctx, &vc, &rect, select, extend); | ||||
| } | } | ||||
| else if (vc.obact && BKE_paint_select_vert_test(vc.obact, eval_ctx.object_mode)) { | else if (vc.obact && BKE_paint_select_vert_test(vc.obact, eval_ctx.object_mode)) { | ||||
| ret = do_paintvert_box_select(&eval_ctx, &vc, &rect, select, extend); | ret |= do_paintvert_box_select(&eval_ctx, &vc, &rect, select, extend); | ||||
| } | } | ||||
| else if (vc.obact && eval_ctx.object_mode & OB_MODE_PARTICLE_EDIT) { | else if (vc.obact && eval_ctx.object_mode & OB_MODE_PARTICLE_EDIT) { | ||||
| ret = PE_border_select(C, &rect, select, extend); | ret |= PE_border_select(C, &rect, select, extend); | ||||
| } | } | ||||
| else { /* object mode with none active */ | else { /* object mode with none active */ | ||||
| ret = do_object_pose_box_select(C, &vc, &rect, select, extend); | ret |= do_object_pose_box_select(C, &vc, &rect, select, extend); | ||||
| } | |||||
| } | |||||
| if (ret & OPERATOR_FINISHED) { | |||||
| ret = OPERATOR_FINISHED; | |||||
| } | } | ||||
| else { | |||||
| ret = OPERATOR_CANCELLED; | |||||
| } | } | ||||
| return ret; | return ret; | ||||
| } | } | ||||
| /* *****************Selection Operators******************* */ | /* *****************Selection Operators******************* */ | ||||
| ▲ Show 20 Lines • Show All 635 Lines • ▼ Show 20 Lines | static bool object_circle_select(ViewContext *vc, const bool select, const int mval[2], float rad) | ||||
| return changed; | return changed; | ||||
| } | } | ||||
| /* not a real operator, only for circle test */ | /* not a real operator, only for circle test */ | ||||
| static int view3d_circle_select_exec(bContext *C, wmOperator *op) | static int view3d_circle_select_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| ViewContext vc; | ViewContext vc; | ||||
| ED_view3d_viewcontext_init(C, &vc); | |||||
| Object *obact = vc.obact; | |||||
| Object *obedit = vc.obedit; | |||||
| EvaluationContext eval_ctx; | EvaluationContext eval_ctx; | ||||
| CTX_data_eval_ctx(C, &eval_ctx); | CTX_data_eval_ctx(C, &eval_ctx); | ||||
| const int radius = RNA_int_get(op->ptr, "radius"); | const int radius = RNA_int_get(op->ptr, "radius"); | ||||
| const bool select = !RNA_boolean_get(op->ptr, "deselect"); | const bool select = !RNA_boolean_get(op->ptr, "deselect"); | ||||
| const int mval[2] = {RNA_int_get(op->ptr, "x"), | const int mval[2] = {RNA_int_get(op->ptr, "x"), | ||||
| RNA_int_get(op->ptr, "y")}; | RNA_int_get(op->ptr, "y")}; | ||||
| ED_view3d_viewcontext_init(C, &vc); | |||||
| Object *obact = vc.obact; | |||||
| Object *obedit = vc.obedit; | |||||
| if (obedit || BKE_paint_select_elem_test(obact, eval_ctx.object_mode) || | if (obedit || BKE_paint_select_elem_test(obact, eval_ctx.object_mode) || | ||||
| (obact && (eval_ctx.object_mode & (OB_MODE_PARTICLE_EDIT | OB_MODE_POSE))) ) | (obact && (eval_ctx.object_mode & (OB_MODE_PARTICLE_EDIT | OB_MODE_POSE))) ) | ||||
| { | { | ||||
| view3d_operator_needs_opengl(C); | view3d_operator_needs_opengl(C); | ||||
| /* don't indent to avoid diff noise! */ | |||||
| FOREACH_OBJECT_IN_MODE_BEGIN (eval_ctx.view_layer, eval_ctx.object_mode, ob_iter) { | |||||
| ED_view3d_viewcontext_init_object(&vc, ob_iter); | |||||
| /* --- */ | |||||
| obact = vc.obact; | |||||
| obedit = vc.obedit; | |||||
| if (CTX_data_edit_object(C)) { | if (CTX_data_edit_object(C)) { | ||||
| obedit_circle_select(&eval_ctx, &vc, select, mval, (float)radius); | obedit_circle_select(&eval_ctx, &vc, select, mval, (float)radius); | ||||
| WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obact->data); | WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obact->data); | ||||
| } | } | ||||
| else if (BKE_paint_select_face_test(obact, eval_ctx.object_mode)) { | else if (BKE_paint_select_face_test(obact, eval_ctx.object_mode)) { | ||||
| paint_facesel_circle_select(&eval_ctx, &vc, select, mval, (float)radius); | paint_facesel_circle_select(&eval_ctx, &vc, select, mval, (float)radius); | ||||
| WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obact->data); | WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obact->data); | ||||
| } | } | ||||
| else if (BKE_paint_select_vert_test(obact, eval_ctx.object_mode)) { | else if (BKE_paint_select_vert_test(obact, eval_ctx.object_mode)) { | ||||
| paint_vertsel_circle_select(&eval_ctx, &vc, select, mval, (float)radius); | paint_vertsel_circle_select(&eval_ctx, &vc, select, mval, (float)radius); | ||||
| WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obact->data); | WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obact->data); | ||||
| } | } | ||||
| else if (eval_ctx.object_mode & OB_MODE_POSE) | else if (eval_ctx.object_mode & OB_MODE_POSE) | ||||
| pose_circle_select(&vc, select, mval, (float)radius); | pose_circle_select(&vc, select, mval, (float)radius); | ||||
| else | else | ||||
| return PE_circle_select(C, select, mval, (float)radius); | return PE_circle_select(C, select, mval, (float)radius); | ||||
| } FOREACH_OBJECT_IN_MODE_END; | |||||
| } | } | ||||
| else if (obact && eval_ctx.object_mode & OB_MODE_SCULPT) { | else if (obact && eval_ctx.object_mode & OB_MODE_SCULPT) { | ||||
| return OPERATOR_CANCELLED; | return OPERATOR_CANCELLED; | ||||
| } | } | ||||
| else { | else { | ||||
| if (object_circle_select(&vc, select, mval, (float)radius)) { | if (object_circle_select(&vc, select, mval, (float)radius)) { | ||||
| WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, vc.scene); | WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, vc.scene); | ||||
| } | } | ||||
| Show All 23 Lines | |||||