[Bf-blender-cvs] [2e595da] temp_manipulators_core: Refactor manipulator-group flags

Julian Eisel noreply at git.blender.org
Sun Oct 2 22:13:45 CEST 2016


Commit: 2e595daee3fa40737f5813349a4d7e6ad27d825f
Author: Julian Eisel
Date:   Sun Oct 2 22:11:14 2016 +0200
Branches: temp_manipulators_core
https://developer.blender.org/rB2e595daee3fa40737f5813349a4d7e6ad27d825f

Refactor manipulator-group flags

Flags are internal now, not exposed to non-manipulator window manager code.

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

M	source/blender/makesdna/DNA_manipulator_types.h
M	source/blender/windowmanager/manipulators/WM_manipulator_types.h
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/makesdna/DNA_manipulator_types.h b/source/blender/makesdna/DNA_manipulator_types.h
index 9a3289b..2414573 100644
--- a/source/blender/makesdna/DNA_manipulator_types.h
+++ b/source/blender/makesdna/DNA_manipulator_types.h
@@ -43,7 +43,7 @@ typedef struct wmManipulatorGroup {
 
 	void *customdata;
 	void (*customdata_free)(void *); /* for freeing customdata from above */
-	int flag;
+	int flag; /* private */
 	int pad;
 } wmManipulatorGroup;
 
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_types.h b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
index 2a3be7d..c4cdaea 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_types.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
@@ -66,6 +66,9 @@ 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 */
@@ -77,8 +80,7 @@ typedef struct wmManipulatorGroupType {
 	/* RNA integration */
 	ExtensionRNA ext;
 
-	/* manipulatorTypeflags (includes copy of wmManipulatorMapType.flag - used for comparisons) */
-	int flag;
+	char flag;
 
 	/* if type is spawned from operator this is set here */
 	void *op;
@@ -92,7 +94,6 @@ struct wmManipulatorMapType_Params {
 	const char *idname;
 	const int spaceid;
 	const int regionid;
-	const int flag;
 };
 
 /**
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
index fd44b43..52a5cb3 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
@@ -143,6 +143,8 @@ 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_ensure_initialized(struct wmManipulatorGroup *mgroup, const struct bContext *C);
+bool wm_manipulatorgroup_is_visible(const struct wmManipulatorGroup *mgroup, const struct bContext *C);
 
 void wm_manipulatorgrouptype_keymap_init(struct wmManipulatorGroupType *mgrouptype, struct wmKeyConfig *keyconf);
 
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
index f7a8895..3f635f8 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
@@ -58,6 +58,18 @@
 #include "wm_manipulator_intern.h"
 
 
+/* wmManipulatorGroupType.flag_intern */
+enum {
+	/* manipulator group is attached to operator, and is only accessible as long as this runs */
+	WM_MANIPULATORGROUPTYPE_OP      = (1 << 0),
+};
+
+/* wmManipulatorGroup.flag */
+enum {
+	WM_MANIPULATORGROUP_INITIALIZED = (1 << 2), /* mgroup has been initialized */
+};
+
+
 /* -------------------------------------------------------------------- */
 /** \name wmManipulatorGroup
  *
@@ -128,6 +140,22 @@ void wm_manipulatorgroup_attach_to_modal_handler(
 	WM_event_add_mousemove(C);
 }
 
+void wm_manipulatorgroup_ensure_initialized(wmManipulatorGroup *mgroup, const bContext *C)
+{
+	/* prepare for first draw */
+	if (UNLIKELY((mgroup->flag & WM_MANIPULATORGROUP_INITIALIZED) == 0)) {
+		mgroup->type->init(C, mgroup);
+		mgroup->flag |= WM_MANIPULATORGROUP_INITIALIZED;
+	}
+}
+
+bool wm_manipulatorgroup_is_visible(const wmManipulatorGroup *mgroup, const bContext *C)
+{
+	/* Check for poll function, if manipulator-group belongs to an operator, also check if the operator is running. */
+	return ((mgroup->type->flag & WM_MANIPULATORGROUPTYPE_OP) == 0 || mgroup->type->op) &&
+	       (!mgroup->type->poll || mgroup->type->poll(C, mgroup->type));
+}
+
 /** \name Manipulator operators
  *
  * Basic operators for manipulator interaction with user configurable keymaps.
@@ -495,7 +523,7 @@ void WM_manipulatorgrouptype_unregister(bContext *C, Main *bmain, wmManipulatorG
 
 	wmManipulatorMapType *mmaptype = WM_manipulatormaptype_find(&(const struct wmManipulatorMapType_Params) {
 	        mgrouptype->mapidname, mgrouptype->spaceid,
-	        mgrouptype->regionid, mgrouptype->flag});
+	        mgrouptype->regionid});
 
 	BLI_remlink(&mmaptype->manipulator_grouptypes, mgrouptype);
 	mgrouptype->prev = mgrouptype->next = NULL;
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
index b55ddcf..9a4c568 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
@@ -183,19 +183,11 @@ void WM_manipulatormap_update(const bContext *C, wmManipulatorMap *mmap)
 	}
 
 	for (wmManipulatorGroup *mgroup = mmap->manipulator_groups.first; mgroup; mgroup = mgroup->next) {
-		if (mgroup->type->flag & WM_MANIPULATORGROUPTYPE_OP && !mgroup->type->op) {
-			/* only while operator runs */
-			continue;
-		}
-		if (mgroup->type->poll && !mgroup->type->poll(C, mgroup->type)) {
+		if (!wm_manipulatorgroup_is_visible(mgroup, C)) {
 			continue;
 		}
 
-		/* prepare for first draw */
-		if (UNLIKELY((mgroup->flag & WM_MANIPULATORGROUP_INITIALIZED) == 0)) {
-			mgroup->type->init(C, mgroup);
-			mgroup->flag |= WM_MANIPULATORGROUP_INITIALIZED;
-		}
+		wm_manipulatorgroup_ensure_initialized(mgroup, C);
 		/* update data if needed */
 		/* XXX weak: Manipulator-group may skip refreshing if it's invisible (map gets untagged nevertheless) */
 		if (mmap->update_flag & MANIPULATORMAP_REFRESH && mgroup->type->refresh) {
@@ -390,12 +382,12 @@ static void manipulators_prepare_visible_3D(wmManipulatorMap *mmap, ListBase *vi
 	wmManipulator *manipulator;
 
 	for (wmManipulatorGroup *mgroup = mmap->manipulator_groups.first; mgroup; mgroup = mgroup->next) {
-		if (mgroup->type->flag & WM_MANIPULATORGROUPTYPE_3D) {
-			if (!mgroup->type->poll || mgroup->type->poll(C, mgroup->type)) {
-				for (manipulator = mgroup->manipulators.first; manipulator; manipulator = manipulator->next) {
-					if (manipulator->render_3d_intersection && (manipulator->flag & WM_MANIPULATOR_HIDDEN) == 0) {
-						BLI_addhead(visible_manipulators, BLI_genericNodeN(manipulator));
-					}
+		if (mgroup->type->is_3d &&
+		    (!mgroup->type->poll || mgroup->type->poll(C, mgroup->type)))
+		{
+			for (manipulator = mgroup->manipulators.first; manipulator; manipulator = manipulator->next) {
+				if (manipulator->render_3d_intersection && (manipulator->flag & WM_MANIPULATOR_HIDDEN) == 0) {
+					BLI_addhead(visible_manipulators, BLI_genericNodeN(manipulator));
 				}
 			}
 		}
@@ -627,13 +619,13 @@ wmManipulator *wm_manipulatormap_find_highlighted_manipulator(
 	wmManipulator *manipulator;
 
 	for (wmManipulatorGroup *mgroup = mmap->manipulator_groups.first; mgroup; mgroup = mgroup->next) {
-		if ((mgroup->type->flag & WM_MANIPULATORGROUPTYPE_3D) == 0) {
-			if (!mgroup->type->poll || mgroup->type->poll(C, mgroup->type)) {
-				for (manipulator = mgroup->manipulators.first; manipulator; manipulator = manipulator->next) {
-					if (manipulator->intersect) {
-						if ((*part = manipulator->intersect(C, event, manipulator)))
-							return manipulator;
-					}
+		if (!mgroup->type->is_3d &&
+		    (!mgroup->type->poll || mgroup->type->poll(C, mgroup->type)))
+		{
+			for (manipulator = mgroup->manipulators.first; manipulator; manipulator = manipulator->next) {
+				if (manipulator->intersect) {
+					if ((*part = manipulator->intersect(C, event, manipulator)))
+						return manipulator;
 				}
 			}
 		}
diff --git a/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h b/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h
index d02b75c..fbdca91 100644
--- a/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h
+++ b/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h
@@ -62,16 +62,6 @@ void  wm_manipulatorgroup_attach_to_modal_handler(
         struct bContext *C, struct wmEventHandler *handler,
         struct wmManipulatorGroupType *mgrouptype, struct wmOperator *op);
 
-/* wmManipulatorGroupType->flag */
-enum {
-	WM_MANIPULATORGROUPTYPE_3D      = (1 << 0),
-	/* manipulator group is attached to operator, and is only accessible as long as this runs */
-	WM_MANIPULATORGROUPTYPE_OP      = (1 << 1),
-	/* TODO mixed group and group-type flags, should be separate enums */
-	WM_MANIPULATORGROUP_INITIALIZED = (1 << 2), /* mgroup has been initialized */
-};
-
-
 /* -------------------------------------------------------------------- */
 /* wmManipulatorMap */




More information about the Bf-blender-cvs mailing list