[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