Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_view3d/view3d_select.c
| Show First 20 Lines • Show All 151 Lines • ▼ Show 20 Lines | |||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| /** \name Internal Object Utilities | /** \name Internal Object Utilities | ||||
| * \{ */ | * \{ */ | ||||
| static bool object_deselect_all_visible(ViewLayer *view_layer, View3D *v3d) | static bool object_deselect_all_visible(ViewLayer *view_layer, View3D *v3d) | ||||
| { | { | ||||
| bool changed = false; | bool changed = false; | ||||
| for (Base *base = view_layer->object_bases.first; base; base = base->next) { | LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) { | ||||
| if (base->flag & BASE_SELECTED) { | if (base->flag & BASE_SELECTED) { | ||||
| if (BASE_SELECTABLE(v3d, base)) { | if (BASE_SELECTABLE(v3d, base)) { | ||||
| ED_object_base_select(base, BA_DESELECT); | ED_object_base_select(base, BA_DESELECT); | ||||
| changed = true; | changed = true; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return changed; | return changed; | ||||
| } | } | ||||
| /* deselect all except b */ | /* deselect all except b */ | ||||
| static bool object_deselect_all_except(ViewLayer *view_layer, Base *b) | static bool object_deselect_all_except(ViewLayer *view_layer, Base *b) | ||||
| { | { | ||||
| bool changed = false; | bool changed = false; | ||||
| for (Base *base = view_layer->object_bases.first; base; base = base->next) { | LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) { | ||||
| if (base->flag & BASE_SELECTED) { | if (base->flag & BASE_SELECTED) { | ||||
| if (b != base) { | if (b != base) { | ||||
| ED_object_base_select(base, BA_DESELECT); | ED_object_base_select(base, BA_DESELECT); | ||||
| changed = true; | changed = true; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return changed; | return changed; | ||||
| ▲ Show 20 Lines • Show All 428 Lines • ▼ Show 20 Lines | |||||
| */ | */ | ||||
| static Base **do_pose_tag_select_op_prepare(ViewContext *vc, uint *r_bases_len) | static Base **do_pose_tag_select_op_prepare(ViewContext *vc, uint *r_bases_len) | ||||
| { | { | ||||
| Base **bases = NULL; | Base **bases = NULL; | ||||
| BLI_array_declare(bases); | BLI_array_declare(bases); | ||||
| FOREACH_BASE_IN_MODE_BEGIN (vc->view_layer, vc->v3d, OB_ARMATURE, OB_MODE_POSE, base_iter) { | FOREACH_BASE_IN_MODE_BEGIN (vc->view_layer, vc->v3d, OB_ARMATURE, OB_MODE_POSE, base_iter) { | ||||
| Object *ob_iter = base_iter->object; | Object *ob_iter = base_iter->object; | ||||
| bArmature *arm = ob_iter->data; | bArmature *arm = ob_iter->data; | ||||
| for (bPoseChannel *pchan = ob_iter->pose->chanbase.first; pchan; pchan = pchan->next) { | LISTBASE_FOREACH (bPoseChannel *, pchan, &ob_iter->pose->chanbase) { | ||||
| Bone *bone = pchan->bone; | Bone *bone = pchan->bone; | ||||
| bone->flag &= ~BONE_DONE; | bone->flag &= ~BONE_DONE; | ||||
| } | } | ||||
| arm->id.tag |= LIB_TAG_DOIT; | arm->id.tag |= LIB_TAG_DOIT; | ||||
| ob_iter->id.tag &= ~LIB_TAG_DOIT; | ob_iter->id.tag &= ~LIB_TAG_DOIT; | ||||
| BLI_array_append(bases, base_iter); | BLI_array_append(bases, base_iter); | ||||
| } | } | ||||
| FOREACH_BASE_IN_MODE_END; | FOREACH_BASE_IN_MODE_END; | ||||
| Show All 25 Lines | for (int i = 0; i < bases_len; i++) { | ||||
| if (arm->id.tag & LIB_TAG_DOIT) { | if (arm->id.tag & LIB_TAG_DOIT) { | ||||
| arm->id.tag &= ~LIB_TAG_DOIT; | arm->id.tag &= ~LIB_TAG_DOIT; | ||||
| } | } | ||||
| else { | else { | ||||
| continue; | continue; | ||||
| } | } | ||||
| bool changed = true; | bool changed = true; | ||||
| for (bPoseChannel *pchan = ob_iter->pose->chanbase.first; pchan; pchan = pchan->next) { | LISTBASE_FOREACH (bPoseChannel *, pchan, &ob_iter->pose->chanbase) { | ||||
| Bone *bone = pchan->bone; | Bone *bone = pchan->bone; | ||||
| if ((bone->flag & BONE_UNSELECTABLE) == 0) { | if ((bone->flag & BONE_UNSELECTABLE) == 0) { | ||||
| const bool is_select = bone->flag & BONE_SELECTED; | const bool is_select = bone->flag & BONE_SELECTED; | ||||
| const bool is_inside = bone->flag & BONE_DONE; | const bool is_inside = bone->flag & BONE_DONE; | ||||
| const int sel_op_result = ED_select_op_action_deselected(sel_op, is_select, is_inside); | const int sel_op_result = ED_select_op_action_deselected(sel_op, is_select, is_inside); | ||||
| if (sel_op_result != -1) { | if (sel_op_result != -1) { | ||||
| SET_FLAG_FROM_TEST(bone->flag, sel_op_result, BONE_SELECTED); | SET_FLAG_FROM_TEST(bone->flag, sel_op_result, BONE_SELECTED); | ||||
| if (sel_op_result == 0) { | if (sel_op_result == 0) { | ||||
| ▲ Show 20 Lines • Show All 2,400 Lines • ▼ Show 20 Lines | static bool do_object_box_select(bContext *C, ViewContext *vc, rcti *rect, const eSelectOp sel_op) | ||||
| /* selection buffer now has bones potentially too, so we add MAXPICKBUF */ | /* selection buffer now has bones potentially too, so we add MAXPICKBUF */ | ||||
| uint *vbuffer = MEM_mallocN(4 * (totobj + MAXPICKELEMS) * sizeof(uint[4]), "selection buffer"); | uint *vbuffer = MEM_mallocN(4 * (totobj + MAXPICKELEMS) * sizeof(uint[4]), "selection buffer"); | ||||
| const eV3DSelectObjectFilter select_filter = ED_view3d_select_filter_from_mode(vc->scene, | const eV3DSelectObjectFilter select_filter = ED_view3d_select_filter_from_mode(vc->scene, | ||||
| vc->obact); | vc->obact); | ||||
| const int hits = view3d_opengl_select( | const int hits = view3d_opengl_select( | ||||
| vc, vbuffer, 4 * (totobj + MAXPICKELEMS), rect, VIEW3D_SELECT_ALL, select_filter); | vc, vbuffer, 4 * (totobj + MAXPICKELEMS), rect, VIEW3D_SELECT_ALL, select_filter); | ||||
| for (Base *base = vc->view_layer->object_bases.first; base; base = base->next) { | LISTBASE_FOREACH (Base *, base, &vc->view_layer->object_bases) { | ||||
| base->object->id.tag &= ~LIB_TAG_DOIT; | base->object->id.tag &= ~LIB_TAG_DOIT; | ||||
| } | } | ||||
| Base **bases = NULL; | Base **bases = NULL; | ||||
| BLI_array_declare(bases); | BLI_array_declare(bases); | ||||
| bool changed = false; | bool changed = false; | ||||
| if (SEL_OP_USE_PRE_DESELECT(sel_op)) { | if (SEL_OP_USE_PRE_DESELECT(sel_op)) { | ||||
| changed |= object_deselect_all_visible(vc->view_layer, vc->v3d); | changed |= object_deselect_all_visible(vc->view_layer, vc->v3d); | ||||
| } | } | ||||
| if ((hits == -1) && !SEL_OP_USE_OUTSIDE(sel_op)) { | if ((hits == -1) && !SEL_OP_USE_OUTSIDE(sel_op)) { | ||||
| goto finally; | goto finally; | ||||
| } | } | ||||
| for (Base *base = vc->view_layer->object_bases.first; base; base = base->next) { | LISTBASE_FOREACH (Base *, base, &vc->view_layer->object_bases) { | ||||
| if (BASE_SELECTABLE(v3d, base)) { | if (BASE_SELECTABLE(v3d, base)) { | ||||
| if ((base->object->runtime.select_id & 0x0000FFFF) != 0) { | if ((base->object->runtime.select_id & 0x0000FFFF) != 0) { | ||||
| BLI_array_append(bases, base); | BLI_array_append(bases, base); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* The draw order doesn't always match the order we populate the engine, see: T51695. */ | /* The draw order doesn't always match the order we populate the engine, see: T51695. */ | ||||
| ▲ Show 20 Lines • Show All 1,021 Lines • Show Last 20 Lines | |||||