From a67cc72232ae71f7c58e5aa88fc919f53fa72433 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 11 Jun 2018 08:37:56 +0200 Subject: MetaBall support for Workbench + EEVEE Note: Metaballs only support the first material slot. Splicing it per material would create empty Batches. In order to overcome this we set the batch for other materials to NULL. We added extra checks in EEVEE and Workbench to not draw when the geom is NULL. --- .../blender/draw/intern/draw_cache_impl_metaball.c | 29 +++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'source/blender/draw/intern/draw_cache_impl_metaball.c') diff --git a/source/blender/draw/intern/draw_cache_impl_metaball.c b/source/blender/draw/intern/draw_cache_impl_metaball.c index f01e7b929f8..24930921bee 100644 --- a/source/blender/draw/intern/draw_cache_impl_metaball.c +++ b/source/blender/draw/intern/draw_cache_impl_metaball.c @@ -49,7 +49,9 @@ static void metaball_batch_cache_clear(MetaBall *mb); typedef struct MetaBallBatchCache { Gwn_Batch *batch; + Gwn_Batch **shaded_triangles; + int mat_len; /* settings to determine if cache is invalid */ bool is_dirty; } MetaBallBatchCache; @@ -75,6 +77,8 @@ static void metaball_batch_cache_init(MetaBall *mb) cache = mb->batch_cache = MEM_mallocN(sizeof(*cache), __func__); } cache->batch = NULL; + cache->mat_len = 0; + cache->shaded_triangles = NULL; cache->is_dirty = false; } @@ -110,6 +114,9 @@ static void metaball_batch_cache_clear(MetaBall *mb) } GWN_BATCH_DISCARD_SAFE(cache->batch); + /* Note: shaded_triangles[0] is already freed by cache->batch */ + MEM_SAFE_FREE(cache->shaded_triangles); + cache->mat_len = 0; } void DRW_mball_batch_cache_free(MetaBall *mb) @@ -125,8 +132,9 @@ void DRW_mball_batch_cache_free(MetaBall *mb) Gwn_Batch *DRW_metaball_batch_cache_get_triangles_with_normals(Object *ob) { - if (!BKE_mball_is_basis(ob)) + if (!BKE_mball_is_basis(ob)) { return NULL; + } MetaBall *mb = ob->data; MetaBallBatchCache *cache = metaball_batch_cache_get(mb); @@ -142,3 +150,22 @@ Gwn_Batch *DRW_metaball_batch_cache_get_triangles_with_normals(Object *ob) return cache->batch; } + +Gwn_Batch **DRW_metaball_batch_cache_get_surface_shaded(Object *ob, MetaBall *mb, struct GPUMaterial **UNUSED(gpumat_array), uint gpumat_array_len) +{ + if (!BKE_mball_is_basis(ob)) { + return NULL; + } + + MetaBallBatchCache *cache = metaball_batch_cache_get(mb); + if (cache->shaded_triangles == NULL) { + cache->mat_len = gpumat_array_len; + cache->shaded_triangles = MEM_callocN(sizeof(*cache->shaded_triangles) * cache->mat_len, __func__); + cache->shaded_triangles[0] = DRW_metaball_batch_cache_get_triangles_with_normals(ob); + for (int i = 1; i < cache->mat_len; ++i) { + cache->shaded_triangles[i] = NULL; + } + } + return cache->shaded_triangles; + +} -- cgit v1.2.3