Merge branch 'blender-v2.83-release'
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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) {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user