From 436d1b4e901a980be743e2ed94872d98b59f27d2 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 24 Aug 2017 14:32:56 +0200 Subject: [PATCH 1/6] Cycles: FIx issue with -0 being considered a non-finite value --- intern/cycles/util/util_math.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intern/cycles/util/util_math.h b/intern/cycles/util/util_math.h index 0d27ee06fa7..348e652eadd 100644 --- a/intern/cycles/util/util_math.h +++ b/intern/cycles/util/util_math.h @@ -224,7 +224,7 @@ ccl_device_inline bool isfinite_safe(float f) { /* By IEEE 754 rule, 2*Inf equals Inf */ unsigned int x = __float_as_uint(f); - return (f == f) && (x == 0 || (f != 2.0f*f)) && !((x << 1) > 0xff000000u); + return (f == f) && (x == 0 || x == (1 << 31) || (f != 2.0f*f)) && !((x << 1) > 0xff000000u); } ccl_device_inline float ensure_finite(float v) From a679457263b529e4536460c9cfb4a1c11e93e8ae Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 24 Aug 2017 14:35:48 +0200 Subject: [PATCH 2/6] Fix T51907: New Depsgraph - Camera constraint is not evaluated properly This is more a workaround for until we've got proper visibility flush, which will likely happen in blender2.8 branch. --- .../blender/depsgraph/intern/builder/deg_builder_nodes.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 46ef4841639..89d09d3cec1 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -320,8 +320,11 @@ void DepsgraphNodeBuilder::build_object(Scene *scene, Base *base, Object *ob) if (base != NULL) { id_node->layers |= base->lay; } - if (ob == scene->camera) { - /* Camera should always be updated, it used directly by viewport. */ + if (ob->type == OB_CAMERA) { + /* Camera should always be updated, it used directly by viewport. + * + * TODO(sergey): Make it only for active scene camera. + */ id_node->layers |= (unsigned int)(-1); } /* Skip rest of components if the ID node was already there. */ From 9662803833264668322b5ce10f28c852340d6445 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 24 Aug 2017 23:19:27 +1000 Subject: [PATCH 3/6] Fix error using wrong theme settings w/ depth draw Clicks events before first draw would assert, unlikely to cause user visible errors but would assert in UI_ThemeGetColorPtr. --- source/blender/editors/space_view3d/view3d_draw.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 6f8120a747b..56508ea989a 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -2471,6 +2471,7 @@ static void view3d_draw_depth_loop(Scene *scene, ARegion *ar, View3D *v3d) void ED_view3d_draw_depth(Scene *scene, ARegion *ar, View3D *v3d, bool alphaoverride) { + struct bThemeState theme_state; RegionView3D *rv3d = ar->regiondata; short zbuf = v3d->zbuf; short flag = v3d->flag; @@ -2483,6 +2484,10 @@ void ED_view3d_draw_depth(Scene *scene, ARegion *ar, View3D *v3d, bool alphaover U.glalphaclip = alphaoverride ? 0.5f : glalphaclip; /* not that nice but means we wont zoom into billboards */ U.obcenter_dia = 0; + /* Tools may request depth outside of regular drawing code. */ + UI_Theme_Store(&theme_state); + UI_SetTheme(SPACE_VIEW3D, RGN_TYPE_WINDOW); + /* Setup view matrix. */ ED_view3d_draw_setup_view(NULL, scene, ar, v3d, rv3d->viewmat, rv3d->winmat, NULL); @@ -2510,6 +2515,8 @@ void ED_view3d_draw_depth(Scene *scene, ARegion *ar, View3D *v3d, bool alphaover U.glalphaclip = glalphaclip; v3d->flag = flag; U.obcenter_dia = obcenter_dia; + + UI_Theme_Restore(&theme_state); } void ED_view3d_draw_select_loop( From 738d942d291e670c0d0e8df93efd74f40189432a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 25 Aug 2017 02:09:23 +1000 Subject: [PATCH 4/6] Correct error in recent use of PyC_Long_* Regression in 46cf33bf0 --- source/blender/python/bmesh/bmesh_py_types.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c index faaa2aecb4c..bd2d818c3a3 100644 --- a/source/blender/python/bmesh/bmesh_py_types.c +++ b/source/blender/python/bmesh/bmesh_py_types.c @@ -134,7 +134,7 @@ static int bpy_bm_elem_hflag_set(BPy_BMElem *self, PyObject *value, void *flag) else { BM_elem_flag_set(self->ele, hflag, param); } - return -1; + return 0; } PyDoc_STRVAR(bpy_bm_elem_index_doc, From 2d5935a9c095fc8abae844571e72923027c40725 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Fri, 25 Aug 2017 11:11:19 +0200 Subject: [PATCH 5/6] This copyright text (copied to binary distros) had a confusing statement about scripts being "Artwork" which is your sole property and free to license. I've removed the reference to scripts in this text. This was from 2002! With our Python scripts becoming part of how Blender runs, such scripts now are officially required to be compliant with GNU GPL. For more information; check the FAQ or consult foundation@blender.org https://www.blender.org/support/faq/ --- release/text/copyright.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/text/copyright.txt b/release/text/copyright.txt index 207d6f54ea8..d0490b9ca91 100644 --- a/release/text/copyright.txt +++ b/release/text/copyright.txt @@ -21,7 +21,7 @@ Subject to the provisions of the GNU GPL license, BF grants You a non-exclusive right to use the Software at any computer You own or use. Artwork you create with the Software - whether it is images, movies, - scripts, exported 3d files or the .blend files themselves - is your sole + exported 3d files or the .blend files themselves - is your sole property, and can be licensed or sold under any conditions you prefer. 2. Permitted copying and electronic distribution of Software From 16377abda8adb6444e888d1144d9225fa6415e65 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 25 Aug 2017 20:26:52 +1000 Subject: [PATCH 6/6] WM: initialize WM and deps before handling events This avoids obscure bugs where operators could run from events that happen before the UI and depsgraph have been initialized. See: D2809 for details. --- source/blender/windowmanager/intern/wm.c | 4 + .../windowmanager/intern/wm_event_system.c | 79 +++++++++++-------- .../blender/windowmanager/wm_event_system.h | 3 +- 3 files changed, 51 insertions(+), 35 deletions(-) diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c index 1738dabde2d..a09cc4aeb31 100644 --- a/source/blender/windowmanager/intern/wm.c +++ b/source/blender/windowmanager/intern/wm.c @@ -495,6 +495,10 @@ void wm_close_and_free_all(bContext *C, ListBase *wmlist) void WM_main(bContext *C) { + /* Single refresh before handling events. + * This ensures we don't run operators before the depsgraph has been evaluated. */ + wm_event_do_refresh_wm_and_depsgraph(C); + while (1) { /* get events from ghost, handle window events, add to window queues */ diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 4f68e7cccca..7e7314cc0c8 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -263,13 +263,56 @@ static void wm_notifier_clear(wmNotifier *note) memset(((char *)note) + sizeof(Link), 0, sizeof(*note) - sizeof(Link)); } +/** + * Was part of #wm_event_do_notifiers, split out so it can be called once before entering the #WM_main loop. + * This ensures operators don't run before the UI and depsgraph are initialized. + */ +void wm_event_do_refresh_wm_and_depsgraph(bContext *C) +{ + wmWindowManager *wm = CTX_wm_manager(C); + uint64_t win_combine_v3d_datamask = 0; + + /* combine datamasks so 1 win doesn't disable UV's in another [#26448] */ + for (wmWindow *win = wm->windows.first; win; win = win->next) { + win_combine_v3d_datamask |= ED_view3d_screen_datamask(win->screen); + } + + /* cached: editor refresh callbacks now, they get context */ + for (wmWindow *win = wm->windows.first; win; win = win->next) { + ScrArea *sa; + + CTX_wm_window_set(C, win); + for (sa = win->screen->areabase.first; sa; sa = sa->next) { + if (sa->do_refresh) { + CTX_wm_area_set(C, sa); + ED_area_do_refresh(C, sa); + } + } + + /* XXX make lock in future, or separated derivedmesh users in scene */ + if (G.is_rendering == false) { + /* depsgraph & animation: update tagged datablocks */ + Main *bmain = CTX_data_main(C); + + /* copied to set's in scene_update_tagged_recursive() */ + win->screen->scene->customdata_mask = win_combine_v3d_datamask; + + /* XXX, hack so operators can enforce datamasks [#26482], gl render */ + win->screen->scene->customdata_mask |= win->screen->scene->customdata_mask_modal; + + BKE_scene_update_tagged(bmain->eval_ctx, bmain, win->screen->scene); + } + } + + CTX_wm_window_set(C, NULL); +} + /* called in mainloop */ void wm_event_do_notifiers(bContext *C) { wmWindowManager *wm = CTX_wm_manager(C); wmNotifier *note, *next; wmWindow *win; - uint64_t win_combine_v3d_datamask = 0; if (wm == NULL) return; @@ -373,39 +416,7 @@ void wm_event_do_notifiers(bContext *C) MEM_freeN(note); } - /* combine datamasks so 1 win doesn't disable UV's in another [#26448] */ - for (win = wm->windows.first; win; win = win->next) { - win_combine_v3d_datamask |= ED_view3d_screen_datamask(win->screen); - } - - /* cached: editor refresh callbacks now, they get context */ - for (win = wm->windows.first; win; win = win->next) { - ScrArea *sa; - - CTX_wm_window_set(C, win); - for (sa = win->screen->areabase.first; sa; sa = sa->next) { - if (sa->do_refresh) { - CTX_wm_area_set(C, sa); - ED_area_do_refresh(C, sa); - } - } - - /* XXX make lock in future, or separated derivedmesh users in scene */ - if (G.is_rendering == false) { - /* depsgraph & animation: update tagged datablocks */ - Main *bmain = CTX_data_main(C); - - /* copied to set's in scene_update_tagged_recursive() */ - win->screen->scene->customdata_mask = win_combine_v3d_datamask; - - /* XXX, hack so operators can enforce datamasks [#26482], gl render */ - win->screen->scene->customdata_mask |= win->screen->scene->customdata_mask_modal; - - BKE_scene_update_tagged(bmain->eval_ctx, bmain, win->screen->scene); - } - } - - CTX_wm_window_set(C, NULL); + wm_event_do_refresh_wm_and_depsgraph(C); } static int wm_event_always_pass(const wmEvent *event) diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h index efc01b1f8a8..3fb9cd617bf 100644 --- a/source/blender/windowmanager/wm_event_system.h +++ b/source/blender/windowmanager/wm_event_system.h @@ -87,7 +87,8 @@ void wm_event_do_handlers (bContext *C); void wm_event_add_ghostevent (wmWindowManager *wm, wmWindow *win, int type, int time, void *customdata); -void wm_event_do_notifiers (bContext *C); +void wm_event_do_refresh_wm_and_depsgraph(bContext *C); +void wm_event_do_notifiers(bContext *C); /* wm_keymap.c */