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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to