diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-01-24 09:31:11 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-01-24 10:23:49 +0300 |
commit | b9dbd5e85e55936be3add46f471f4de681714ff9 (patch) | |
tree | 00ef22bfcccdd151b2dda1bc10f910445d9ca7bf /source/blender/windowmanager/manipulators | |
parent | 0ff968eaf56830d19366e060b149dc32185bc063 (diff) |
Manipulators: disable 3D widgets w/ animation
Workaround for T53078.
Diffstat (limited to 'source/blender/windowmanager/manipulators')
3 files changed, 51 insertions, 13 deletions
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_api.h b/source/blender/windowmanager/manipulators/WM_manipulator_api.h index 7a31f4e6f1f..097af2dadcc 100644 --- a/source/blender/windowmanager/manipulators/WM_manipulator_api.h +++ b/source/blender/windowmanager/manipulators/WM_manipulator_api.h @@ -335,6 +335,6 @@ void WM_manipulator_group_type_unlink_delayed_ptr( void WM_manipulator_group_type_unlink_delayed(const char *idname); /* Utilities */ -void WM_manipulator_group_type_is_any_selected(const char *idname); +bool WM_manipulator_context_check_drawstep(const struct bContext *C, eWM_ManipulatorMapDrawStep step); #endif /* __WM_MANIPULATOR_API_H__ */ diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c index dff8d8b4e6c..3a78dd32f94 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c @@ -735,3 +735,28 @@ void WM_manipulator_properties_free(PointerRNA *ptr) } /** \} */ + +/** \name General Utilities + * + * \{ */ + +bool WM_manipulator_context_check_drawstep(const struct bContext *C, eWM_ManipulatorMapDrawStep step) +{ + switch (step) { + case WM_MANIPULATORMAP_DRAWSTEP_2D: + { + break; + } + case WM_MANIPULATORMAP_DRAWSTEP_3D: + { + wmWindowManager *wm = CTX_wm_manager(C); + if (ED_screen_animation_playing(wm)) { + return false; + } + break; + } + } + return true; +} + +/** \} */ diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c index d051c93d892..8479f0b444d 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c @@ -445,6 +445,10 @@ void WM_manipulatormap_draw( wmManipulatorMap *mmap, const bContext *C, const eWM_ManipulatorMapDrawStep drawstep) { + if (!WM_manipulator_context_check_drawstep(C, drawstep)) { + return; + } + ListBase draw_manipulators = {NULL}; manipulatormap_prepare_drawing(mmap, C, &draw_manipulators, drawstep); @@ -550,6 +554,7 @@ static wmManipulator *manipulator_find_intersected_3d( }; *r_part = 0; + /* set up view matrices */ view3d_operator_needs_opengl(C); @@ -588,6 +593,11 @@ wmManipulator *wm_manipulatormap_highlight_find( { wmManipulator *mpr = NULL; ListBase visible_3d_manipulators = {NULL}; + bool do_step[WM_MANIPULATORMAP_DRAWSTEP_MAX]; + + for (int i = 0; i < ARRAY_SIZE(do_step); i++) { + do_step[i] = WM_manipulator_context_check_drawstep(C, i); + } for (wmManipulatorGroup *mgroup = mmap->groups.first; mgroup; mgroup = mgroup->next) { @@ -599,25 +609,28 @@ wmManipulator *wm_manipulatormap_highlight_find( } if (wm_manipulatorgroup_is_visible(mgroup, C)) { + eWM_ManipulatorMapDrawStep step; if (mgroup->type->flag & WM_MANIPULATORGROUPTYPE_3D) { - if ((mmap->update_flag[WM_MANIPULATORMAP_DRAWSTEP_3D] & MANIPULATORMAP_IS_REFRESH_CALLBACK) && - mgroup->type->refresh) - { - mgroup->type->refresh(C, mgroup); - /* cleared below */ - } - wm_manipulatorgroup_intersectable_manipulators_to_list(mgroup, &visible_3d_manipulators); + step = WM_MANIPULATORMAP_DRAWSTEP_3D; } else { - if ((mmap->update_flag[WM_MANIPULATORMAP_DRAWSTEP_2D] & MANIPULATORMAP_IS_REFRESH_CALLBACK) && - mgroup->type->refresh) + step = WM_MANIPULATORMAP_DRAWSTEP_2D; + } + + if (do_step[step]) { + if ((mmap->update_flag[step] & MANIPULATORMAP_IS_REFRESH_CALLBACK) && + (mgroup->type->refresh != NULL)) { mgroup->type->refresh(C, mgroup); /* cleared below */ } - - if ((mpr = wm_manipulatorgroup_find_intersected_mainpulator(mgroup, C, event, r_part))) { - break; + if (step == WM_MANIPULATORMAP_DRAWSTEP_3D) { + wm_manipulatorgroup_intersectable_manipulators_to_list(mgroup, &visible_3d_manipulators); + } + else if (step == WM_MANIPULATORMAP_DRAWSTEP_2D) { + if ((mpr = wm_manipulatorgroup_find_intersected_mainpulator(mgroup, C, event, r_part))) { + break; + } } } } |