From 85ce444455efade2772d2c5625a5b78de1d00dba Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 9 Dec 2013 15:40:41 +1100 Subject: [PATCH] Lattice Editmode: Select Mirror patch originally by Philipp Oeser with some edits. --- release/scripts/startup/bl_ui/space_view3d.py | 1 + source/blender/editors/object/object_intern.h | 1 + .../blender/editors/object/object_lattice.c | 73 +++++++++++++++++++ source/blender/editors/object/object_ops.c | 1 + source/blender/makesrna/RNA_enum_types.h | 1 + source/blender/makesrna/intern/rna_object.c | 8 ++ 6 files changed, 85 insertions(+) diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index dd3710fe8e8..8174ef3261a 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -746,6 +746,7 @@ class VIEW3D_MT_select_edit_lattice(Menu): layout.separator() + layout.operator("lattice.select_mirror") layout.operator("lattice.select_random") layout.operator("lattice.select_all").action = 'TOGGLE' layout.operator("lattice.select_all", text="Inverse").action = 'INVERT' diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index ce509e2ffe7..536f3f05ab2 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -142,6 +142,7 @@ void LATTICE_OT_select_more(struct wmOperatorType *ot); void LATTICE_OT_select_less(struct wmOperatorType *ot); void LATTICE_OT_select_ungrouped(struct wmOperatorType *ot); void LATTICE_OT_select_random(struct wmOperatorType *ot); +void LATTICE_OT_select_mirror(struct wmOperatorType *ot); void LATTICE_OT_make_regular(struct wmOperatorType *ot); void LATTICE_OT_flip(struct wmOperatorType *ot); diff --git a/source/blender/editors/object/object_lattice.c b/source/blender/editors/object/object_lattice.c index 6379d23800a..fdc9a604c07 100644 --- a/source/blender/editors/object/object_lattice.c +++ b/source/blender/editors/object/object_lattice.c @@ -49,6 +49,7 @@ #include "RNA_access.h" #include "RNA_define.h" +#include "RNA_enum_types.h" #include "BKE_context.h" #include "BKE_depsgraph.h" @@ -226,6 +227,78 @@ void LATTICE_OT_select_random(wmOperatorType *ot) RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend the selection"); } + +/* -------------------------------------------------------------------- */ +/* Select Mirror Operator */ + +static int lattice_select_mirror_exec(bContext *C, wmOperator *op) +{ + Object *obedit = CTX_data_edit_object(C); + Lattice *lt = ((Lattice *)obedit->data)->editlatt->latt; + const bool extend = RNA_boolean_get(op->ptr, "extend"); + const int axis = RNA_enum_get(op->ptr, "axis"); + bool flip_uvw[3] = {false}; + int tot, i; + BPoint *bp; + BLI_bitmap *selpoints; + + tot = lt->pntsu * lt->pntsv * lt->pntsw; + + flip_uvw[axis] = true; + + if (!extend) { + lt->actbp = LT_ACTBP_NONE; + } + + /* store "original" selection */ + selpoints = BLI_BITMAP_NEW(tot, __func__); + BKE_lattice_bitmap_from_flag(lt, selpoints, SELECT, false, false); + + /* actual (de)selection */ + for (i = 0; i < tot; i++) { + const int i_flip = BKE_lattice_index_flip(lt, i, flip_uvw[0], flip_uvw[1], flip_uvw[2]); + bp = <->def[i]; + if (!bp->hide) { + if (BLI_BITMAP_GET(selpoints, i_flip)) { + bp->f1 |= SELECT; + } + else { + if (!extend) { + bp->f1 &= ~SELECT; + } + } + } + } + + + MEM_freeN(selpoints); + + WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data); + + return OPERATOR_FINISHED; +} + +void LATTICE_OT_select_mirror(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Select Mirror"; + ot->description = "Select mirrored lattice points"; + ot->idname = "LATTICE_OT_select_mirror"; + + /* api callbacks */ + ot->exec = lattice_select_mirror_exec; + ot->poll = ED_operator_editlattice; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + /* props */ + RNA_def_enum(ot->srna, "axis", object_axis_unsigned_items, 0, "Axis", ""); + + RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend the selection"); +} + + /************************** Select More/Less Operator *************************/ static bool lattice_test_bitmap_uvw(Lattice *lt, BLI_bitmap *selpoints, int u, int v, int w, const bool selected) diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 74ac487b687..efebbe8ddd7 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -224,6 +224,7 @@ void ED_operatortypes_object(void) WM_operatortype_append(LATTICE_OT_select_less); WM_operatortype_append(LATTICE_OT_select_ungrouped); WM_operatortype_append(LATTICE_OT_select_random); + WM_operatortype_append(LATTICE_OT_select_mirror); WM_operatortype_append(LATTICE_OT_make_regular); WM_operatortype_append(LATTICE_OT_flip); diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h index 2fb1af74173..34f5d1f3064 100644 --- a/source/blender/makesrna/RNA_enum_types.h +++ b/source/blender/makesrna/RNA_enum_types.h @@ -114,6 +114,7 @@ extern EnumPropertyItem rigidbody_object_shape_items[]; extern EnumPropertyItem rigidbody_constraint_type_items[]; extern EnumPropertyItem object_axis_items[]; +extern EnumPropertyItem object_axis_unsigned_items[]; extern EnumPropertyItem controller_type_items[]; diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index eb0f30216f2..184e067299e 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -165,6 +165,14 @@ EnumPropertyItem object_axis_items[] = { {0, NULL, 0, NULL, NULL} }; +/* for general use (not just object) */ +EnumPropertyItem object_axis_unsigned_items[] = { + {0, "X", 0, "X", ""}, + {1, "Y", 0, "Y", ""}, + {2, "Z", 0, "Z", ""}, + {0, NULL, 0, NULL, NULL} +}; + #ifdef RNA_RUNTIME #include "BLI_math.h"