[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