[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