From 689ad9ade42fbb03084aaca7e478efddbe891e7f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 28 Oct 2017 16:07:56 +1100 Subject: Fix manipulator drawing before their refresh callback Caused glitch with Scale-Cage tool. --- .../blender/windowmanager/manipulators/WM_manipulator_types.h | 1 + .../windowmanager/manipulators/intern/wm_manipulator_group.c | 9 ++++++++- .../windowmanager/manipulators/intern/wm_manipulator_map.c | 11 ++++++----- 3 files changed, 15 insertions(+), 6 deletions(-) (limited to 'source/blender/windowmanager') diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_types.h b/source/blender/windowmanager/manipulators/WM_manipulator_types.h index 22f1eb68181..d4477b8e508 100644 --- a/source/blender/windowmanager/manipulators/WM_manipulator_types.h +++ b/source/blender/windowmanager/manipulators/WM_manipulator_types.h @@ -109,6 +109,7 @@ typedef enum eWM_ManipulatorGroupTypeFlag { typedef enum eWM_ManipulatorGroupInitFlag { /* mgroup has been initialized */ WM_MANIPULATORGROUP_INIT_SETUP = (1 << 0), + WM_MANIPULATORGROUP_INIT_REFRESH = (1 << 1), } eWM_ManipulatorGroupInitFlag; /** diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c index 24786695cba..e0b12289b9e 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c @@ -184,9 +184,16 @@ void wm_manipulatorgroup_ensure_initialized(wmManipulatorGroup *mgroup, const bC wm_manipulatorgrouptype_setup_keymap(wgt, wm->defaultconf); BLI_assert(wgt->keymap != NULL); } - mgroup->init_flag |= WM_MANIPULATORGROUP_INIT_SETUP; } + + /* refresh may be called multiple times, this just ensures its called at least once before we draw. */ + if (UNLIKELY((mgroup->init_flag & WM_MANIPULATORGROUP_INIT_REFRESH) == 0)) { + if (mgroup->type->refresh) { + mgroup->type->refresh(C, mgroup); + } + mgroup->init_flag |= WM_MANIPULATORGROUP_INIT_REFRESH; + } } bool wm_manipulatorgroup_is_visible(const wmManipulatorGroup *mgroup, const bContext *C) diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c index 0d2a8f7dcc5..1d8ee35cd32 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c @@ -327,13 +327,14 @@ static void manipulatormap_prepare_drawing( } /* needs to be initialized on first draw */ - 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[drawstep] & MANIPULATORMAP_IS_REFRESH_CALLBACK) && mgroup->type->refresh) { - mgroup->type->refresh(C, mgroup); - /* cleared below */ + if (mmap->update_flag[drawstep] & MANIPULATORMAP_IS_REFRESH_CALLBACK) { + /* force refresh again. */ + mgroup->init_flag &= ~WM_MANIPULATORGROUP_INIT_REFRESH; } + /* Calls `setup`, `setup_keymap` and `refresh` if they're defined. */ + wm_manipulatorgroup_ensure_initialized(mgroup, C); + /* prepare drawing */ if (mgroup->type->draw_prepare) { mgroup->type->draw_prepare(C, mgroup); -- cgit v1.2.3