[Bf-blender-cvs] [2712e4b] custom-manipulators temp_manipulators_core: Refactor manipulator draw routine
Julian Eisel
noreply at git.blender.org
Mon Oct 3 19:27:29 CEST 2016
Commit: 2712e4b4f4a7c84a001f2eb976f408134df10e3a
Author: Julian Eisel
Date: Mon Oct 3 18:19:25 2016 +0200
Branches: custom-manipulators temp_manipulators_core
https://developer.blender.org/rB2712e4b4f4a7c84a001f2eb976f408134df10e3a
Refactor manipulator draw routine
Updating and drawing works closer together now, makes it easier to define what to draw (3D vs 2D vs depth-culled manipulators) and to avoid unnecessary updates. Totally untested :)
===================================================================
M source/blender/windowmanager/manipulators/WM_manipulator_api.h
M source/blender/windowmanager/manipulators/WM_manipulator_types.h
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_manipulatormap.c
===================================================================
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_api.h b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
index 4769b6c..099ad7f 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_api.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
@@ -97,19 +97,13 @@ struct wmManipulatorMapType *WM_manipulatormaptype_find(
const struct wmManipulatorMapType_Params *mmap_params);
struct wmManipulatorMapType *WM_manipulatormaptype_ensure(
const struct wmManipulatorMapType_Params *mmap_params);
+
struct wmManipulatorMap *WM_manipulatormap_new_from_type(
const struct wmManipulatorMapType_Params *mmap_params);
-
void WM_manipulatormap_tag_refresh(struct wmManipulatorMap *mmap);
-void WM_manipulatormap_update(const struct bContext *C, struct wmManipulatorMap *mmap);
-void WM_manipulatormap_draw(
- const struct bContext *C, const struct wmManipulatorMap *mmap,
- const bool in_scene, const bool free_drawmanipulators);
-
-void WM_manipulatormaps_add_handlers(struct ARegion *ar, struct wmManipulatorMap *mmap);
-
+void WM_manipulatormap_draw(struct wmManipulatorMap *mmap, const struct bContext *C, const int drawstep);
+void WM_manipulatormap_add_handlers(struct ARegion *ar, struct wmManipulatorMap *mmap);
bool WM_manipulatormap_select_all(struct bContext *C, struct wmManipulatorMap *mmap, const int action);
-
bool WM_manipulatormap_cursor_set(const struct wmManipulatorMap *mmap, struct wmWindow *win);
#endif /* __WM_MANIPULATOR_API_H__ */
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_types.h b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
index c4cdaea..13ae223 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_types.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
@@ -49,6 +49,34 @@ typedef void (*wmManipulatorGroupDrawPrepareFunc)(const struct bContext *, struc
/* -------------------------------------------------------------------- */
+/* wmManipulator */
+
+/**
+ * Simple utility wrapper for storing a single manipulator as wmManipulatorGroup.customdata (which gets freed).
+ */
+typedef struct wmManipulatorWrapper {
+ struct wmManipulator *manipulator;
+} wmManipulatorWrapper;
+
+/* wmManipulator->flag */
+enum eManipulatorFlag {
+ /* states (TODO separate bitfield) */
+ WM_MANIPULATOR_HIGHLIGHT = (1 << 0),
+ WM_MANIPULATOR_ACTIVE = (1 << 1),
+ WM_MANIPULATOR_SELECTED = (1 << 2),
+ /* settings */
+ WM_MANIPULATOR_DRAW_HOVER = (1 << 3),
+ WM_MANIPULATOR_DRAW_ACTIVE = (1 << 4), /* draw while dragging */
+ WM_MANIPULATOR_DRAW_VALUE = (1 << 5), /* draw a indicator for the current value while dragging */
+ WM_MANIPULATOR_SCALE_3D = (1 << 6),
+ WM_MANIPULATOR_SCENE_DEPTH = (1 << 7), /* manipulator is depth culled with scene objects (TODO could be group flag) */
+ WM_MANIPULATOR_HIDDEN = (1 << 8),
+ WM_MANIPULATOR_SELECTABLE = (1 << 9),
+};
+
+
+/* -------------------------------------------------------------------- */
+/* wmManipulatorGroup */
/* factory class for a manipulator-group type, gets called every time a new area is spawned */
typedef struct wmManipulatorGroupType {
@@ -90,6 +118,10 @@ typedef struct wmManipulatorGroupType {
char mapidname[64];
} wmManipulatorGroupType;
+
+/* -------------------------------------------------------------------- */
+/* wmManipulatorMap */
+
struct wmManipulatorMapType_Params {
const char *idname;
const int spaceid;
@@ -97,29 +129,16 @@ struct wmManipulatorMapType_Params {
};
/**
- * Simple utility wrapper for storing a single manipulator as wmManipulatorGroup.customdata (which gets freed).
+ * Pass a value of this enum to #WM_manipulatormap_update to tell it what to draw.
*/
-typedef struct wmManipulatorWrapper {
- struct wmManipulator *manipulator;
-} wmManipulatorWrapper;
-
-
-/* -------------------------------------------------------------------- */
-
-/* wmManipulator->flag */
-enum eManipulatorFlag {
- /* states */
- WM_MANIPULATOR_HIGHLIGHT = (1 << 0),
- WM_MANIPULATOR_ACTIVE = (1 << 1),
- WM_MANIPULATOR_SELECTED = (1 << 2),
- /* settings */
- WM_MANIPULATOR_DRAW_HOVER = (1 << 3),
- WM_MANIPULATOR_DRAW_ACTIVE = (1 << 4), /* draw while dragging */
- WM_MANIPULATOR_DRAW_VALUE = (1 << 5), /* draw a indicator for the current value while dragging */
- WM_MANIPULATOR_SCALE_3D = (1 << 6),
- WM_MANIPULATOR_SCENE_DEPTH = (1 << 7), /* manipulator is depth culled with scene objects*/
- WM_MANIPULATOR_HIDDEN = (1 << 8),
- WM_MANIPULATOR_SELECTABLE = (1 << 9),
+enum {
+ /* Draw 2D manipulator-groups (ManipulatorGroupType.is_3d == false) */
+ WM_MANIPULATORMAP_DRAWSTEP_2D = 0,
+ /* Draw 3D manipulator-groups (ManipulatorGroupType.is_3d == true) */
+ WM_MANIPULATORMAP_DRAWSTEP_3D,
+ /* Draw only depth culled manipulators (WM_MANIPULATOR_SCENE_DEPTH flag).
+ * Note that these are expected to be 3D manipulators too. */
+ WM_MANIPULATORMAP_DRAWSTEP_IN_SCENE,
};
#endif /* __WM_MANIPULATOR_TYPES_H__ */
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
index 392d56d..0d5c46b 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
@@ -417,7 +417,7 @@ void wm_manipulator_calculate_scale(wmManipulator *manipulator, const bContext *
manipulator->scale = scale * manipulator->user_scale;
}
-void wm_manipulator_update_prop_data(wmManipulator *manipulator)
+static void manipulator_update_prop_data(wmManipulator *manipulator)
{
/* manipulator property might have been changed, so update manipulator */
if (manipulator->props && manipulator->prop_data_update) {
@@ -429,3 +429,30 @@ void wm_manipulator_update_prop_data(wmManipulator *manipulator)
}
}
+void wm_manipulator_update(wmManipulator *manipulator, const bContext *C, const bool refresh_map)
+{
+ if (refresh_map) {
+ manipulator_update_prop_data(manipulator);
+ }
+ wm_manipulator_calculate_scale(manipulator, C);
+}
+
+bool wm_manipulator_is_visible(wmManipulator *manipulator)
+{
+ if (manipulator->flag & WM_MANIPULATOR_HIDDEN) {
+ return false;
+ }
+ if ((manipulator->flag & WM_MANIPULATOR_ACTIVE) &&
+ !(manipulator->flag & (WM_MANIPULATOR_DRAW_ACTIVE | WM_MANIPULATOR_DRAW_VALUE)))
+ {
+ /* don't draw while active (while dragging) */
+ return false;
+ }
+ if ((manipulator->flag & WM_MANIPULATOR_DRAW_HOVER) && !(manipulator->flag & WM_MANIPULATOR_HIGHLIGHT)) {
+ /* only draw on mouse hover */
+ return false;
+ }
+
+ return true;
+}
+
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
index b830301..4791282 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
@@ -121,7 +121,8 @@ bool wm_manipulator_deselect(struct wmManipulatorMap *mmap, struct wmManipulator
bool wm_manipulator_select(bContext *C, struct wmManipulatorMap *mmap, struct wmManipulator *manipulator);
void wm_manipulator_calculate_scale(struct wmManipulator *manipulator, const bContext *C);
-void wm_manipulator_update_prop_data(struct wmManipulator *manipulator);
+void wm_manipulator_update(struct wmManipulator *manipulator, const bContext *C, const bool refresh_map);
+bool wm_manipulator_is_visible(struct wmManipulator *manipulator);
void fix_linking_manipulator_arrow(void);
void fix_linking_manipulator_arrow2d(void);
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
index 1aa71ce..4be9cba 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
@@ -61,12 +61,6 @@
static ListBase manipulatormaptypes = {NULL, NULL};
/**
- * List of all visible manipulators to avoid unnecessary loops and wmManipulatorGroupType->poll checks.
- * Collected in WM_manipulators_update.
- */
-static ListBase draw_manipulators = {NULL, NULL};
-
-/**
* Manipulator-map update tagging.
*/
enum eManipulatorMapUpdateFlags {
@@ -166,27 +160,67 @@ void WM_manipulatormap_tag_refresh(wmManipulatorMap *mmap)
}
}
+static void manipulatormap_tag_updated(wmManipulatorMap *mmap)
+{
+ mmap->update_flag = 0;
+}
+
+static bool manipulator_prepare_drawing(
+ wmManipulatorMap *mmap, wmManipulator *manipulator, const bContext *C,
+ ListBase *draw_manipulators, const int drawstep)
+{
+ const bool is_in_scene = (drawstep == WM_MANIPULATORMAP_DRAWSTEP_IN_SCENE);
+
+ if (!wm_manipulator_is_visible(manipulator)) {
+ /* skip */
+ }
+ /* account for drawstep on manipulator level */
+ else if ((is_in_scene && (manipulator->flag & WM_MANIPULATOR_SCENE_DEPTH) == 0) ||
+ (!is_in_scene && (manipulator->flag & WM_MANIPULATOR_SCENE_DEPTH)))
+ {
+ /* skip */
+ }
+ else {
+ wm_manipulator_update(manipulator, C, (mmap->update_flag & MANIPULATORMAP_REFRESH) != 0);
+ BLI_addhead(draw_manipulators, BLI_genericNodeN(manipulator));
+ return true;
+ }
+
+ return false;
+}
+
/**
- * Update manipulators of \a mmap to prepare for drawing.
- *
- * XXX should either update 2D or 3D manipulators (and send these to drawing).
+ * Update manipulators of \a mmap to prepare for drawing. Adds all manipulators that
+ * should be drawn to list \a draw_manipulators, note that added items need freeing.
*/
-void WM_manipulatormap_update(const bContext *C, wmManipulatorMap *mmap)
+static void manipulatormap_prepare_drawing(
+ wmManipulatorMap *mmap, const bContext *C, ListBase *draw_manipulators, const int drawstep)
{
if (!mmap || BLI_listbase_is_empty(&mmap->manipulator_groups))
return;
+ wmManipulator *active_manipulator = mmap->mmap_context.active_manipulator;
/* only active manipulator needs updating */
- if (mmap->mmap_context.active_manipulator) {
- wm_manipulator_calculate_scale(mmap->mmap_context.active_manipulator, C);
- goto done;
+ if (act
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list