[Bf-blender-cvs] [12d2bdd] custom-manipulators temp_manipulators_core: Move some manipulator flags to manipulator-group-type level

Julian Eisel noreply at git.blender.org
Tue Oct 4 02:17:14 CEST 2016


Commit: 12d2bdd372d859e112981c0c07380e6a03f3c855
Author: Julian Eisel
Date:   Mon Oct 3 23:24:19 2016 +0200
Branches: custom-manipulators temp_manipulators_core
https://developer.blender.org/rB12d2bdd372d859e112981c0c07380e6a03f3c855

Move some manipulator flags to manipulator-group-type level

Had to do some changes to allow this, basically the wmManipulator.mgroup pointer to get the manipulator-group from the manipulator is back which is a bit ugly. Think that's fine though, only a minor annoyance.

===================================================================

M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/manipulators/WM_manipulator_types.h
M	source/blender/windowmanager/manipulators/intern/manipulator_library/manipulator_library_utils.c
M	source/blender/windowmanager/manipulators/intern/wm_manipulator.c
M	source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
M	source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
M	source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
M	source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h

===================================================================

diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 8da107f..3a199df 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -2119,7 +2119,7 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
 				/* handle user configurable manipulator-map keymap */
 				else if (manipulator) {
 					/* get user customized keymap from default one */
-					const wmManipulatorGroup *highlightgroup = wm_manipulator_group_find(mmap, manipulator);
+					const wmManipulatorGroup *highlightgroup = wm_manipulator_get_parent_group(manipulator);
 					const wmKeyMap *keymap = WM_keymap_active(wm, highlightgroup->type->keymap);
 					wmKeyMapItem *kmi;
 
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_types.h b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
index ab9220a..11c8350 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_types.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
@@ -58,16 +58,13 @@ typedef struct wmManipulatorWrapper {
 	struct wmManipulator *manipulator;
 } wmManipulatorWrapper;
 
-/* wmManipulator->flag */
-/* TODO some of these could become group-type flags */
-enum eManipulatorFlag {
+/* wmManipulator.flag
+ * Flags for individual manipulators. */
+enum {
 	WM_MANIPULATOR_DRAW_HOVER  = (1 << 0), /* draw *only* while hovering */
 	WM_MANIPULATOR_DRAW_ACTIVE = (1 << 1), /* draw while dragging */
 	WM_MANIPULATOR_DRAW_VALUE  = (1 << 2), /* draw a indicator for the current value while dragging */
-	WM_MANIPULATOR_SCALE_3D    = (1 << 3),
-	WM_MANIPULATOR_SCENE_DEPTH = (1 << 4), /* manipulator can be depth culled with scene objects */
-	WM_MANIPULATOR_HIDDEN      = (1 << 5),
-	WM_MANIPULATOR_SELECTABLE  = (1 << 6),
+	WM_MANIPULATOR_HIDDEN      = (1 << 3),
 };
 
 
@@ -90,9 +87,6 @@ typedef struct wmManipulatorGroupType {
 	/* refresh data for drawing, called before each redraw */
 	wmManipulatorGroupDrawPrepareFunc draw_prepare;
 
-	/* manipulator-group will be treated as 2d if this isn't set to true */
-	bool is_3d;
-
 	/* keymap init callback for this manipulator-group */
 	struct wmKeyMap *(*keymap_init)(const struct wmManipulatorGroupType *, struct wmKeyConfig *);
 	/* keymap created with callback from above */
@@ -104,7 +98,7 @@ typedef struct wmManipulatorGroupType {
 	/* RNA integration */
 	ExtensionRNA ext;
 
-	char flag;
+	int flag;
 
 	/* if type is spawned from operator this is set here */
 	void *op;
@@ -114,6 +108,23 @@ typedef struct wmManipulatorGroupType {
 	char mapidname[64];
 } wmManipulatorGroupType;
 
+/**
+ * wmManipulatorGroupType.flag
+ * Flags that influence the behavior of all manipulators in the group.
+ */
+enum {
+	/* Mark manipulator-group as being 3D */
+	WM_MANIPULATORGROUPTYPE_IS_3D       = (1 << 0),
+	/* Scale manipulators as 3D object that respects zoom (otherwise zoom independent draw size) */
+	WM_MANIPULATORGROUPTYPE_SCALE_3D    = (1 << 1),
+	/* Manipulators can be depth culled with scene objects (covered by other geometry - TODO) */
+	WM_MANIPULATORGROUPTYPE_SCENE_DEPTH = (1 << 2),
+	/* Manipulators can be selected */
+	WM_MANIPULATORGROUPTYPE_SELECTABLE  = (1 << 3),
+	/* manipulator group is attached to operator, and is only accessible as long as this runs */
+	WM_MANIPULATORGROUPTYPE_OP          = (1 << 4),
+};
+
 
 /* -------------------------------------------------------------------- */
 /* wmManipulatorMap */
diff --git a/source/blender/windowmanager/manipulators/intern/manipulator_library/manipulator_library_utils.c b/source/blender/windowmanager/manipulators/intern/manipulator_library/manipulator_library_utils.c
index 0617e9e..c883182 100644
--- a/source/blender/windowmanager/manipulators/intern/manipulator_library/manipulator_library_utils.c
+++ b/source/blender/windowmanager/manipulators/intern/manipulator_library/manipulator_library_utils.c
@@ -35,6 +35,8 @@
 
 #include "BLI_math.h"
 
+#include "DNA_manipulator_types.h"
+
 #include "RNA_access.h"
 
 #include "WM_api.h"
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
index 347726e..7ce42f1 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
@@ -150,16 +150,12 @@ static void manipulator_unique_idname_set(wmManipulatorGroup *mgroup, wmManipula
 }
 
 /**
- * Register \a manipulator.
- *
- * \param name  name used to create a unique idname for \a manipulator in \a mgroup
+ * Initialize default values and allocate needed memory for members.
  */
-bool wm_manipulator_register(wmManipulatorGroup *mgroup, wmManipulator *manipulator, const char *name)
+static void manipulator_init(wmManipulator *manipulator)
 {
 	const float col_default[4] = {1.0f, 1.0f, 1.0f, 1.0f};
 
-	manipulator_unique_idname_set(mgroup, manipulator, name);
-
 	manipulator->user_scale = 1.0f;
 	manipulator->line_width = 1.0f;
 
@@ -174,9 +170,18 @@ bool wm_manipulator_register(wmManipulatorGroup *mgroup, wmManipulator *manipula
 
 	manipulator->props = MEM_callocN(sizeof(PropertyRNA *) * manipulator->max_prop, "manipulator->props");
 	manipulator->ptr = MEM_callocN(sizeof(PointerRNA) * manipulator->max_prop, "manipulator->ptr");
+}
 
-	BLI_addtail(&mgroup->manipulators, manipulator);
-	return true;
+/**
+ * Register \a manipulator.
+ *
+ * \param name: name used to create a unique idname for \a manipulator in \a mgroup
+ */
+void wm_manipulator_register(wmManipulatorGroup *mgroup, wmManipulator *manipulator, const char *name)
+{
+	manipulator_init(manipulator);
+	manipulator_unique_idname_set(mgroup, manipulator, name);
+	wm_manipulatorgroup_manipulator_register(mgroup, manipulator);
 }
 
 /**
@@ -206,17 +211,9 @@ void WM_manipulator_delete(ListBase *manipulatorlist, wmManipulatorMap *mmap, wm
 	MEM_freeN(manipulator);
 }
 
-wmManipulatorGroup *wm_manipulator_group_find(const wmManipulatorMap *mmap, wmManipulator *manipulator)
+wmManipulatorGroup *wm_manipulator_get_parent_group(const wmManipulator *manipulator)
 {
-	for (wmManipulatorGroup *mgroup = mmap->manipulator_groups.first; mgroup; mgroup = mgroup->next) {
-		for (wmManipulator *man_iter = mgroup->manipulators.first; man_iter; man_iter = man_iter->next) {
-			if (man_iter == manipulator) {
-				return mgroup;
-			}
-		}
-	}
-
-	return NULL;
+	return manipulator->mgroup;
 }
 
 
@@ -271,7 +268,7 @@ PointerRNA *WM_manipulator_set_operator(wmManipulator *manipulator, const char *
  */
 void WM_manipulator_set_func_select(wmManipulator *manipulator, wmManipulatorSelectFunc select)
 {
-	manipulator->flag |= WM_MANIPULATOR_SELECTABLE;
+	BLI_assert(manipulator->mgroup->type->flag & WM_MANIPULATORGROUPTYPE_SELECTABLE);
 	manipulator->select = select;
 }
 
@@ -397,7 +394,7 @@ void wm_manipulator_calculate_scale(wmManipulator *manipulator, const bContext *
 	const RegionView3D *rv3d = CTX_wm_region_view3d(C);
 	float scale = 1.0f;
 
-	if (manipulator->flag & WM_MANIPULATOR_SCALE_3D) {
+	if (manipulator->mgroup->type->flag & WM_MANIPULATORGROUPTYPE_SCALE_3D) {
 		if (rv3d && (U.manipulator_flag & V3D_3D_MANIPULATORS) == 0) {
 			if (manipulator->get_final_position) {
 				float position[3];
@@ -448,7 +445,9 @@ bool wm_manipulator_is_visible(wmManipulator *manipulator)
 		/* don't draw while active (while dragging) */
 		return false;
 	}
-	if ((manipulator->flag & WM_MANIPULATOR_DRAW_HOVER) && !(manipulator->state & WM_MANIPULATOR_HIGHLIGHT)) {
+	if ((manipulator->flag & WM_MANIPULATOR_DRAW_HOVER) &&
+	    !(manipulator->state & WM_MANIPULATOR_HIGHLIGHT))
+	{
 		/* only draw on mouse hover */
 		return false;
 	}
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
index dd284e9..386c8bb 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
@@ -39,6 +39,8 @@ typedef struct wmManipulator {
 	struct wmManipulator *next, *prev;
 
 	char idname[MAX_NAME + 4]; /* + 4 for unique '.001', '.002', etc suffix */
+	/* pointer back to group this manipulator is in (just for quick access) */
+	struct wmManipulatorGroup *mgroup;
 
 	/* could become wmManipulatorType */
 	/* draw manipulator */
@@ -123,7 +125,7 @@ enum {
 	WM_MANIPULATOR_TWEAK_PRECISE = (1 << 0),
 };
 
-bool wm_manipulator_register(struct wmManipulatorGroup *mgroup, struct wmManipulator *manipulator, const char *name);
+void wm_manipulator_register(struct wmManipulatorGroup *mgroup, struct wmManipulator *manipulator, const char *name);
 
 bool wm_manipulator_deselect(struct wmManipulatorMap *mmap, struct wmManipulator *manipulator);
 bool wm_manipulator_select(bContext *C, struct wmManipulatorMap *mmap, struct wmManipulator *manipulator);
@@ -152,6 +154,7 @@ enum {
 
 struct wmManipulatorGroup *wm_manipulatorgroup_new_from_type(struct wmManipulatorGroupType *mgrouptype);
 void wm_manipulatorgroup_free(bContext *C, struct wmManipulatorMap *mmap, struct wmManipulatorGroup *mgroup);
+void wm_manipulatorgroup_manipulator_register(struct wmManipulatorGroup *mgroup, wmManipulator *manipulator);
 wmManipulator *wm_manipulatorgroup_find_intersected_mainpulator(
         const struct wmManipulatorGroup *mgroup, struct bContext *C, const struct wmEvent *event,
         unsigned char *part);
@@ -159,6 +162,7 @@ void wm_manipulatorgroup_intersectable_manipulators_to_list(
         const struct wmManipulatorGroup *mgroup, struct ListBase *listbase);
 void wm_manipulatorgroup_ensure_initialized(struct wmManipulatorGroup *mgroup, const struct bContext *C);
 bool wm_manipulatorgroup_is_visible(const struct wmManipulatorGroup *mgroup, const struct bContext *C);
+bool wm_manipulatorgroup_is_visible_in_drawstep(const struct wmManipulatorGroup *mgroup, const int drawstep);
 
 void wm_manipulatorgrouptype_keymap_init(struct wmManipulatorGroupType *mgrouptype, struct wmKeyConfig *keyconf);
 
diff --git a/source/blender/windowmanager/manipulators

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list