From 53de2c3e4f5bc09b7c7520cdb0b91d8048604996 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 23 Apr 2020 15:45:08 +0200 Subject: Cleanup: Add assert to crash earlier This makes T75096 crash earlier. --- source/blender/blenkernel/intern/dynamicpaint.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c index 4c78c88d168..a704e199007 100644 --- a/source/blender/blenkernel/intern/dynamicpaint.c +++ b/source/blender/blenkernel/intern/dynamicpaint.c @@ -2429,6 +2429,8 @@ static float dist_squared_to_looptri_uv_edges(const MLoopTri *mlooptri, int tri_index, const float point[2]) { + BLI_assert(tri_index >= 0); + float min_distance = FLT_MAX; for (int i = 0; i < 3; i++) { -- cgit v1.2.3 From 2467f4df79755b4d503a1b7f93da36cea31fbc53 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 23 Apr 2020 17:09:29 +0200 Subject: Fix T75607: crash trying to sculpt while remesh is in progress The interface is already locked, but the paint brush drawing could stll be reading the mesh that was being edited in another thread. --- source/blender/windowmanager/intern/wm_draw.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c index d887d9b0eee..d3cd31c6e97 100644 --- a/source/blender/windowmanager/intern/wm_draw.c +++ b/source/blender/windowmanager/intern/wm_draw.c @@ -84,6 +84,13 @@ static void wm_paintcursor_draw(bContext *C, ScrArea *area, ARegion *region) bScreen *screen = WM_window_get_active_screen(win); wmPaintCursor *pc; + /* Don't draw paint cursors with locked interface. Painting is not possible + * then, and cursor drawing can use scene data that another thread may be + * modifying. */ + if (wm->is_interface_locked) { + return; + } + if (region->visible && region == screen->active_region) { for (pc = wm->paintcursors.first; pc; pc = pc->next) { -- cgit v1.2.3 From 40f2c92460c356f5ab22d4b9e138383014d95aae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Thu, 23 Apr 2020 17:40:22 +0200 Subject: Fix T72506 EEVEE: Collection Holdout propagates accross material instances This fix the issue by introducing a default material only for collection holdouts. This avoids hash colision when the same material is used in collections without holdout enabled. --- source/blender/blenkernel/BKE_material.h | 1 + source/blender/blenkernel/intern/material.c | 7 ++++++ .../blender/draw/engines/eevee/eevee_materials.c | 25 +++++++--------------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h index ffa1970d8c6..225d966a51a 100644 --- a/source/blender/blenkernel/BKE_material.h +++ b/source/blender/blenkernel/BKE_material.h @@ -119,6 +119,7 @@ void BKE_material_copybuf_paste(struct Main *bmain, struct Material *ma); /* Default Materials */ struct Material *BKE_material_default_empty(void); +struct Material *BKE_material_default_holdout(void); struct Material *BKE_material_default_surface(void); struct Material *BKE_material_default_volume(void); struct Material *BKE_material_default_gpencil(void); diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 5516e877b10..f641531d577 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -1624,11 +1624,13 @@ void BKE_material_eval(struct Depsgraph *depsgraph, Material *material) * default shader nodes. */ static Material default_material_empty; +static Material default_material_holdout; static Material default_material_surface; static Material default_material_volume; static Material default_material_gpencil; static Material *default_materials[] = {&default_material_empty, + &default_material_holdout, &default_material_surface, &default_material_volume, &default_material_gpencil, @@ -1695,6 +1697,11 @@ Material *BKE_material_default_empty(void) return &default_material_empty; } +Material *BKE_material_default_holdout(void) +{ + return &default_material_holdout; +} + Material *BKE_material_default_surface(void) { return &default_material_surface; diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index dca9f2901ab..f0dbd47e146 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -1755,8 +1755,11 @@ static void material_transparent(Material *ma, } /* Return correct material or empty default material if slot is empty. */ -BLI_INLINE Material *eevee_object_material_get(Object *ob, int slot) +BLI_INLINE Material *eevee_object_material_get(Object *ob, int slot, bool holdout) { + if (holdout) { + return BKE_material_default_holdout(); + } Material *ma = BKE_object_material_get(ob, slot + 1); if (ma == NULL) { if (ob->type == OB_VOLUME) { @@ -1781,10 +1784,10 @@ static void eevee_hair_cache_populate(EEVEE_Data *vedata, EEVEE_StorageList *stl = vedata->stl; const DRWContextState *draw_ctx = DRW_context_state_get(); Scene *scene = draw_ctx->scene; + const bool holdout = (ob->base_flag & BASE_HOLDOUT) != 0; DRWShadingGroup *shgrp = NULL; - Material *ma = eevee_object_material_get(ob, matnr - 1); - const bool holdout = (ob->base_flag & BASE_HOLDOUT) != 0; + Material *ma = eevee_object_material_get(ob, matnr - 1, holdout); const bool use_gpumat = ma->use_nodes && ma->nodetree && !holdout; const bool use_alpha_hash = (ma->blend_method == MA_BM_HASHED); const bool use_alpha_clip = (ma->blend_method == MA_BM_CLIP); @@ -2027,23 +2030,11 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, struct Material **ma_array = BLI_array_alloca(ma_array, materials_len); for (int i = 0; i < materials_len; i++) { - ma_array[i] = eevee_object_material_get(ob, i); + ma_array[i] = eevee_object_material_get(ob, i, holdout); memset(&shgrps_array[i], 0, sizeof(EeveeMaterialShadingGroups)); gpumat_array[i] = NULL; gpumat_depth_array[i] = NULL; - if (holdout) { - material_opaque(ma_array[i], - material_hash, - sldata, - vedata, - &gpumat_array[i], - &gpumat_depth_array[i], - &shgrps_array[i], - true); - continue; - } - switch (ma_array[i]->blend_method) { case MA_BM_SOLID: case MA_BM_CLIP: @@ -2055,7 +2046,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, &gpumat_array[i], &gpumat_depth_array[i], &shgrps_array[i], - false); + holdout); break; case MA_BM_BLEND: material_transparent(ma_array[i], sldata, vedata, &gpumat_array[i], &shgrps_array[i]); -- cgit v1.2.3 From c03b6f6f0bd2d829684a667c944271a05ae12604 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 23 Apr 2020 18:01:04 +0200 Subject: Fix T73195: stereo camera view does not show background image --- .../blender/draw/engines/overlay/overlay_image.c | 41 +++++++++++++--------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/source/blender/draw/engines/overlay/overlay_image.c b/source/blender/draw/engines/overlay/overlay_image.c index c67b3179fa2..c592f11a855 100644 --- a/source/blender/draw/engines/overlay/overlay_image.c +++ b/source/blender/draw/engines/overlay/overlay_image.c @@ -104,25 +104,28 @@ static void overlay_image_calc_aspect(Image *ima, const int size[2], float r_ima } } -static void camera_background_images_stereo_setup(Scene *scene, - View3D *v3d, +static eStereoViews camera_background_images_stereo_eye(const Scene *scene, const View3D *v3d) +{ + if ((scene->r.scemode & R_MULTIVIEW) == 0) { + return STEREO_LEFT_ID; + } + else if (v3d->stereo3d_camera != STEREO_3D_ID) { + /* show only left or right camera */ + return v3d->stereo3d_camera; + } + else { + return v3d->multiview_eye; + } +} + +static void camera_background_images_stereo_setup(const Scene *scene, + const View3D *v3d, Image *ima, ImageUser *iuser) { if (BKE_image_is_stereo(ima)) { iuser->flag |= IMA_SHOW_STEREO; - - if ((scene->r.scemode & R_MULTIVIEW) == 0) { - iuser->multiview_eye = STEREO_LEFT_ID; - } - else if (v3d->stereo3d_camera != STEREO_3D_ID) { - /* show only left or right camera */ - iuser->multiview_eye = v3d->stereo3d_camera; - } - else { - iuser->multiview_eye = v3d->multiview_eye; - } - + iuser->multiview_eye = camera_background_images_stereo_eye(scene, v3d); BKE_image_multiview_index(ima, iuser); } else { @@ -302,6 +305,8 @@ void OVERLAY_image_camera_cache_populate(OVERLAY_Data *vedata, Object *ob) OVERLAY_PrivateData *pd = vedata->stl->pd; OVERLAY_PassList *psl = vedata->psl; const DRWContextState *draw_ctx = DRW_context_state_get(); + const View3D *v3d = draw_ctx->v3d; + const Scene *scene = draw_ctx->scene; Camera *cam = ob->data; const bool show_frame = BKE_object_empty_image_frame_is_visible_in_view3d(ob, draw_ctx->rv3d); @@ -310,8 +315,10 @@ void OVERLAY_image_camera_cache_populate(OVERLAY_Data *vedata, Object *ob) return; } - float norm_obmat[4][4]; - normalize_m4_m4(norm_obmat, ob->obmat); + const bool stereo_eye = camera_background_images_stereo_eye(scene, v3d) == STEREO_LEFT_ID; + const char *viewname = (stereo_eye == STEREO_LEFT_ID) ? STEREO_RIGHT_NAME : STEREO_LEFT_NAME; + float modelmat[4][4]; + BKE_camera_multiview_model_matrix(&scene->r, ob, viewname, modelmat); LISTBASE_FOREACH (CameraBGImage *, bgpic, &cam->bg_images) { if (bgpic->flag & CAM_BGIMG_FLAG_DISABLED) { @@ -329,7 +336,7 @@ void OVERLAY_image_camera_cache_populate(OVERLAY_Data *vedata, Object *ob) if (tex) { image_camera_background_matrix_get(cam, bgpic, draw_ctx, aspect, mat); - mul_m4_m4m4(mat, norm_obmat, mat); + mul_m4_m4m4(mat, modelmat, mat); const bool is_foreground = (bgpic->flag & CAM_BGIMG_FLAG_FOREGROUND) != 0; float color_premult_alpha[4] = {bgpic->alpha, bgpic->alpha, bgpic->alpha, bgpic->alpha}; -- cgit v1.2.3 From 0fbcb824d0ff1673ad186055a472b977406fb61d Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Thu, 23 Apr 2020 10:43:16 +0200 Subject: Fix T76014: correct description of COLLECTION_OT_objects_remove_all before rB17bd5c9d4b1e it was "Remove selected objects from all groups" - `BKE_object_groups_clear` is not checking if a collection is linked to the current scene... - rB713010bd7795 did not change that either So this indeed removes selection from _all_ collections, so account for that in the operator description/idname. Reviewers: brecht https://developer.blender.org/D7500 --- source/blender/editors/object/object_collection.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/object/object_collection.c b/source/blender/editors/object/object_collection.c index 7c12a4839f0..7554c4efeda 100644 --- a/source/blender/editors/object/object_collection.c +++ b/source/blender/editors/object/object_collection.c @@ -302,8 +302,8 @@ static int collection_objects_remove_all_exec(bContext *C, wmOperator *UNUSED(op void COLLECTION_OT_objects_remove_all(wmOperatorType *ot) { /* identifiers */ - ot->name = "Remove from All Unlinked Collections"; - ot->description = "Remove selected objects from all collections not used in a scene"; + ot->name = "Remove from All Collections"; + ot->description = "Remove selected objects from all collections"; ot->idname = "COLLECTION_OT_objects_remove_all"; /* api callbacks */ -- cgit v1.2.3