diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-04-23 18:40:22 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-04-23 18:41:21 +0300 |
commit | 40f2c92460c356f5ab22d4b9e138383014d95aae (patch) | |
tree | d645dcaff6419c89c87a826ccda8e02788d6f4e3 /source/blender | |
parent | 2467f4df79755b4d503a1b7f93da36cea31fbc53 (diff) |
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.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_material.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/material.c | 7 | ||||
-rw-r--r-- | source/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]); |