[Bf-blender-cvs] [c673982b228] hair_guides: Select/Deselect all operator for groom vertices.
Lukas Tönne
noreply at git.blender.org
Mon Dec 25 12:23:09 CET 2017
Commit: c673982b228ca8a96e72fff32c6ce81a227eebb4
Author: Lukas Tönne
Date: Mon Dec 25 10:29:02 2017 +0000
Branches: hair_guides
https://developer.blender.org/rBc673982b228ca8a96e72fff32c6ce81a227eebb4
Select/Deselect all operator for groom vertices.
===================================================================
M source/blender/blenloader/intern/readfile.c
M source/blender/editors/groom/CMakeLists.txt
A source/blender/editors/groom/editgroom_select.c
M source/blender/editors/groom/groom_intern.h
M source/blender/editors/groom/groom_ops.c
M source/blender/editors/include/ED_groom.h
M source/blender/editors/space_view3d/space_view3d.c
M source/blender/windowmanager/intern/wm_keymap.c
===================================================================
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 2a3920eb936..d259a4ebfda 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -8402,8 +8402,8 @@ static void direct_link_groom(FileData *fd, Groom *groom)
}
groom->bb = NULL;
-
groom->editgroom = NULL;
+ groom->batch_cache = NULL;
}
/* ************** GENERAL & MAIN ******************** */
diff --git a/source/blender/editors/groom/CMakeLists.txt b/source/blender/editors/groom/CMakeLists.txt
index ef5e6d66580..aa0d3dc3d7e 100644
--- a/source/blender/editors/groom/CMakeLists.txt
+++ b/source/blender/editors/groom/CMakeLists.txt
@@ -37,6 +37,7 @@ set(SRC
groom_ops.c
editgroom.c
editgroom_region.c
+ editgroom_select.c
groom_intern.h
)
diff --git a/source/blender/editors/groom/editgroom_select.c b/source/blender/editors/groom/editgroom_select.c
new file mode 100644
index 00000000000..f51d4644054
--- /dev/null
+++ b/source/blender/editors/groom/editgroom_select.c
@@ -0,0 +1,225 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Lukas Toenne
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/groom/editgroom_select.c
+ * \ingroup edgroom
+ */
+
+#include "DNA_groom_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_math.h"
+
+#include "BKE_context.h"
+#include "BKE_groom.h"
+#include "BKE_report.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_screen.h"
+#include "ED_types.h"
+#include "ED_view3d.h"
+#include "ED_groom.h"
+
+#include "groom_intern.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+bool ED_groom_select_check_regions(const EditGroom *edit)
+{
+ for (GroomBundle* bundle = edit->bundles.first; bundle; bundle = bundle->next)
+ {
+ if (bundle->flag & GM_BUNDLE_SELECT)
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool ED_groom_select_check_curves(const EditGroom *edit)
+{
+ for (GroomBundle* bundle = edit->bundles.first; bundle; bundle = bundle->next)
+ {
+ for (GroomBundleSection *section = bundle->sections.first; section; section = section->next)
+ {
+ if (section->flag & GM_SECTION_SELECT) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+bool ED_groom_select_check_sections(const EditGroom *edit)
+{
+ // TODO
+
+ return false;
+}
+
+void ED_groom_select_regions(EditGroom *edit, EditGroomSelectCb select_cb, void *userdata)
+{
+ for (GroomBundle* bundle = edit->bundles.first; bundle; bundle = bundle->next)
+ {
+ const bool select = select_cb(userdata, bundle->flag & GM_BUNDLE_SELECT);
+ if (select)
+ {
+ bundle->flag |= GM_BUNDLE_SELECT;
+ }
+ else
+ {
+ bundle->flag &= ~GM_BUNDLE_SELECT;
+ }
+ }
+}
+
+void ED_groom_select_curves(EditGroom *edit, EditGroomSelectCb select_cb, void *userdata)
+{
+ for (GroomBundle* bundle = edit->bundles.first; bundle; bundle = bundle->next)
+ {
+ for (GroomBundleSection *section = bundle->sections.first; section; section = section->next)
+ {
+ const bool select = select_cb(userdata, section->flag & GM_SECTION_SELECT);
+ if (select)
+ {
+ section->flag |= GM_SECTION_SELECT;
+ }
+ else
+ {
+ section->flag &= ~GM_SECTION_SELECT;
+ }
+ }
+ }
+}
+
+void ED_groom_select_sections(EditGroom *edit, EditGroomSelectCb select_cb, void *userdata)
+{
+ // TODO
+}
+
+static bool groom_select_all_cb(void *UNUSED(userdata), bool UNUSED(is_selected))
+{
+ return true;
+}
+
+static bool groom_deselect_all_cb(void *UNUSED(userdata), bool UNUSED(is_selected))
+{
+ return false;
+}
+
+static bool groom_select_swap_cb(void *UNUSED(userdata), bool is_selected)
+{
+ return !is_selected;
+}
+
+static bool groom_has_selected(EditGroom *edit, GroomEditMode mode)
+{
+ switch (mode)
+ {
+ case GM_EDIT_MODE_REGIONS:
+ return ED_groom_select_check_regions(edit);
+ case GM_EDIT_MODE_CURVES:
+ return ED_groom_select_check_curves(edit);
+ case GM_EDIT_MODE_SECTIONS:
+ return ED_groom_select_check_sections(edit);
+ }
+ return false;
+}
+
+static int de_select_all_exec(bContext *C, wmOperator *op)
+{
+ GroomEditMode mode = CTX_data_tool_settings(C)->groom_edit_settings.mode;
+ Object *obedit = CTX_data_edit_object(C);
+ Groom *groom = obedit->data;
+ int action = RNA_enum_get(op->ptr, "action");
+
+ EditGroomSelectCb cb;
+ switch (action) {
+ case SEL_SELECT:
+ cb = groom_select_all_cb;
+ break;
+ case SEL_DESELECT:
+ cb = groom_deselect_all_cb;
+ break;
+ case SEL_INVERT:
+ cb = groom_select_swap_cb;
+ break;
+ case SEL_TOGGLE:
+ {
+ if (groom_has_selected(groom->editgroom, mode)) {
+ cb = groom_deselect_all_cb;
+ }
+ else
+ {
+ cb = groom_select_all_cb;
+ }
+ }
+ }
+
+ switch (mode)
+ {
+ case GM_EDIT_MODE_REGIONS:
+ ED_groom_select_regions(groom->editgroom, cb, NULL);
+ break;
+ case GM_EDIT_MODE_CURVES:
+ ED_groom_select_curves(groom->editgroom, cb, NULL);
+ break;
+ case GM_EDIT_MODE_SECTIONS:
+ ED_groom_select_sections(groom->editgroom, cb, NULL);
+ break;
+ }
+
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+
+ return OPERATOR_FINISHED;
+}
+
+void GROOM_OT_select_all(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "(De)select All";
+ ot->idname = "GROOM_OT_select_all";
+ ot->description = "(De)select all control points";
+
+ /* api callbacks */
+ ot->exec = de_select_all_exec;
+ ot->poll = ED_operator_editgroom;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* properties */
+ WM_operator_properties_select_all(ot);
+}
diff --git a/source/blender/editors/groom/groom_intern.h b/source/blender/editors/groom/groom_intern.h
index 193973c9b1d..fc7723732f7 100644
--- a/source/blender/editors/groom/groom_intern.h
+++ b/source/blender/editors/groom/groom_intern.h
@@ -38,4 +38,7 @@ struct wmOperatorType;
/* editgroom_region.c */
void GROOM_OT_region_add(struct wmOperatorType *ot);
+/* editgroom_select.c */
+void GROOM_OT_select_all(struct wmOperatorType *ot);
+
#endif /* __GROOM_INTERN_H__ */
diff --git a/source/blender/editors/groom/groom_ops.c b/source/blender/editors/groom/groom_ops.c
index fbc0281285f..70f8c179c4f 100644
--- a/source/blender/editors/groom/groom_ops.c
+++ b/source/blender/editors/groom/groom_ops.c
@@ -53,6 +53,8 @@
void ED_operatortypes_groom(void)
{
WM_operatortype_append(GROOM_OT_region_add);
+
+ WM_operatortype_append(GROOM_OT_select_all);
}
void ED_operatormacros_groom(void)
@@ -67,11 +69,15 @@ void ED_keymap_groom(wmKeyConfig *keyconf)
{
wmKeyMap *keymap;
wmKeyMapItem *kmi;
- UNUSED_VARS(kmi);
keymap = WM_keymap_find(keyconf, "Groom", 0, 0);
keymap->poll = ED_operator_editgroom;
-
+
+ kmi = WM_keymap_add_item(keymap, "GROOM_OT_select_all", AKEY, KM_PRESS, 0, 0);
+ RNA_enum_set(kmi->ptr, "action", SEL_TOGGLE);
+ kmi = WM_keymap_add_item(keymap, "GROOM_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
+ RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
+
ED_keymap_proportional_cycle(keyconf, keymap);
ED_keymap_proportional_editmode(keyconf, keymap, true);
}
diff --git a/source/blender/editors/include/ED_groom.h b/source/blender/editors/include/ED_groom.h
index 500cde61728..fecbf88298a 100644
--- a/source/blender/editors/include/ED_groom.h
+++ b/source/blender/editors/include/ED_groom.h
@@ -51,4 +51,14 @@ void ED_groom_editgroom_load(struct Object *obedit);
void ED_groom_editgroom_make(struct Object *obedit);
void ED_groom_editgroom_free(struct Object *obedit);
+/* editgroom_select.c */
+bool ED_groom_select_check_regions(const struct EditGroom *edit);
+bool ED_groom_select_check_curves(const struct EditGroom *edit);
+bool ED_groom_select_check_sections(const struct EditGroom *edit);
+
+typedef bool (*EditGroomSelectCb)(void *userdata, bool is_selected);
+void ED_groom_select_regions(struct EditGroom *edit, EditGroomSelectCb select_cb, void *userdata);
+void ED_groom_select_curves(struct EditGroom *edit, EditGroomSelectCb select_cb, void *userdata);
+void ED_groom_select_sections(struct EditGroom *edit, EditGroomSelectCb select_cb, void *userdata);
+
#endif /* __ED_GROOM_H__ */
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 3430351b756..64b607aa9f7 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -535,6 +535,9 @@ static void view3d_main_region_init(wmWindowManager *wm, ARegion *ar)
keymap = WM_keymap_find(wm->defaultconf, "Particle", 0, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
+ keymap = WM_keymap_find(wm->defaultconf, "Groom", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
/* editfont keymap swallows all... */
keymap = WM_keymap_find(wm->defaultconf, "Font", 0, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index 910b7eadf4c..58e2110334b 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -1767,6 +1767,9 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname)
else if (STRPREFIX(opname, "PARTICLE_OT")) {
km = WM_keymap_find_all(C, "Particle", 0, 0);
}
+ else if (STRPREF
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list