diff options
author | Philipp Oeser <info@graphics-engineer.com> | 2020-04-23 19:26:22 +0300 |
---|---|---|
committer | Philipp Oeser <info@graphics-engineer.com> | 2020-04-23 19:26:22 +0300 |
commit | 7d98dfd6bb3921e661f5ba5adb04ffd9876395f1 (patch) | |
tree | c97fc60a92a7966bb59edb23e3e8400aad5591be | |
parent | 5e045485009c93d845ff0295066aa45297c1bc1a (diff) | |
parent | 0fbcb824d0ff1673ad186055a472b977406fb61d (diff) |
Merge branch 'blender-v2.83-release'
-rw-r--r-- | source/blender/blenkernel/BKE_material.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/dynamicpaint.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/material.c | 7 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_materials.c | 25 | ||||
-rw-r--r-- | source/blender/draw/engines/overlay/overlay_image.c | 41 | ||||
-rw-r--r-- | source/blender/editors/object/object_collection.c | 4 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_draw.c | 7 |
7 files changed, 51 insertions, 36 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/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c index 3a8b846a41d..2e1b17844c4 100644 --- a/source/blender/blenkernel/intern/dynamicpaint.c +++ b/source/blender/blenkernel/intern/dynamicpaint.c @@ -2432,6 +2432,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++) { diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index b3fb9681918..8d21a869907 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]); 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}; 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 */ 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) { |