From 285a68b7bbf2fa40e41d507991467387f5dd5264 Mon Sep 17 00:00:00 2001 From: Joseph Eagar Date: Wed, 8 Jun 2022 12:30:01 -0700 Subject: Sculpt: PBVH Draw Support for EEVEE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch adds support for PBVH drawing in EEVEE. Notes: # PBVH_FACES only. For Multires we'll need an API to get/cache attributes. DynTopo support will be merged in later with sculpt-dev's DynTopo implementation. # Supports vertex color and UV attributes only; other types can be added fairly easily though. # Workbench only sends the active vertex color and UV layers to the GPU. # Added a new draw engine API method, DRW_cdlayer_attr_aliases_add. Please review. # The vertex format object is now stored in the pbvh. Reviewed By: Clément Foucault & Brecht Van Lommel & Jeroen Bakker Differential Revision: https://developer.blender.org/D13897 Ref D13897 --- source/blender/draw/DRW_engine.h | 9 ++++++ .../draw/engines/workbench/workbench_engine.c | 5 ++-- source/blender/draw/intern/draw_cache.c | 32 ++++++++++++++++++++++ source/blender/draw/intern/draw_cache_impl_mesh.cc | 3 +- source/blender/draw/intern/draw_manager_data.c | 2 +- 5 files changed, 47 insertions(+), 4 deletions(-) (limited to 'source/blender/draw') diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h index 00822946fe5..5b3d262ac66 100644 --- a/source/blender/draw/DRW_engine.h +++ b/source/blender/draw/DRW_engine.h @@ -23,6 +23,9 @@ struct DrawEngineType; struct GHash; struct GPUMaterial; struct GPUOffScreen; +struct GPUVertFormat; +struct CustomDataLayer; +struct CustomData; struct GPUViewport; struct ID; struct Main; @@ -218,6 +221,12 @@ void DRW_opengl_context_activate(bool drw_state); */ void DRW_draw_cursor_2d_ex(const struct ARegion *region, const float cursor[2]); +void DRW_cdlayer_attr_aliases_add(struct GPUVertFormat *format, + char *base_name, + const struct CustomData *data, + const struct CustomDataLayer *cl, + bool is_active_render, + bool is_active_layer); #ifdef __cplusplus } #endif diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c index fb20bde2f65..9eb35c25bf4 100644 --- a/source/blender/draw/engines/workbench/workbench_engine.c +++ b/source/blender/draw/engines/workbench/workbench_engine.c @@ -97,7 +97,7 @@ static void workbench_cache_sculpt_populate(WORKBENCH_PrivateData *wpd, { const bool use_single_drawcall = !ELEM(color_type, V3D_SHADING_MATERIAL_COLOR); if (use_single_drawcall) { - DRWShadingGroup *grp = workbench_material_setup(wpd, ob, 0, color_type, NULL); + DRWShadingGroup *grp = workbench_material_setup(wpd, ob, ob->actcol, color_type, NULL); DRW_shgroup_call_sculpt(grp, ob, false, false); } else { @@ -323,7 +323,8 @@ static eV3DShadingColorType workbench_color_type_get(WORKBENCH_PrivateData *wpd, } } - if (is_sculpt_pbvh && color_type == V3D_SHADING_TEXTURE_COLOR) { + if (is_sculpt_pbvh && color_type == V3D_SHADING_TEXTURE_COLOR && + BKE_pbvh_type(ob->sculpt->pbvh) != PBVH_FACES) { /* Force use of material color for sculpt. */ color_type = V3D_SHADING_MATERIAL_COLOR; } diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index fb074cc728e..dc4e34c64cb 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -3410,3 +3410,35 @@ void DRW_batch_cache_free_old(Object *ob, int ctime) } /** \} */ + +void DRW_cdlayer_attr_aliases_add(GPUVertFormat *format, + char *base_name, + const CustomData *data, + const CustomDataLayer *cl, + bool is_active_render, + bool is_active_layer) +{ + char attr_name[32], attr_safe_name[GPU_MAX_SAFE_ATTR_NAME]; + const char *layer_name = cl->name; + + GPU_vertformat_safe_attr_name(layer_name, attr_safe_name, GPU_MAX_SAFE_ATTR_NAME); + + /* Attribute layer name. */ + BLI_snprintf(attr_name, sizeof(attr_name), "%s%s", base_name, attr_safe_name); + GPU_vertformat_alias_add(format, attr_name); + + /* Auto layer name. */ + BLI_snprintf(attr_name, sizeof(attr_name), "a%s", attr_safe_name); + GPU_vertformat_alias_add(format, attr_name); + + /* Active render layer name. */ + if (is_active_render) { + GPU_vertformat_alias_add(format, base_name); + } + + /* Active display layer name. */ + if (is_active_layer) { + BLI_snprintf(attr_name, sizeof(attr_name), "a%s", base_name); + GPU_vertformat_alias_add(format, attr_name); + } +} diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.cc b/source/blender/draw/intern/draw_cache_impl_mesh.cc index ec71250b63b..1b45f3f88dd 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.cc +++ b/source/blender/draw/intern/draw_cache_impl_mesh.cc @@ -744,7 +744,8 @@ static bool mesh_batch_cache_valid(Object *object, Mesh *me) } if (object->sculpt && object->sculpt->pbvh) { - if (cache->pbvh_is_drawing != BKE_pbvh_is_drawing(object->sculpt->pbvh)) { + if (cache->pbvh_is_drawing != BKE_pbvh_is_drawing(object->sculpt->pbvh) || + BKE_pbvh_draw_cache_invalid(object->sculpt->pbvh)) { return false; } diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index f0960c5324b..7cdc42b5a81 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -1238,7 +1238,7 @@ static void drw_sculpt_generate_calls(DRWSculptCallbackData *scd) &update_frustum, &draw_frustum, (void (*)(void *, GPU_PBVH_Buffers *))sculpt_draw_cb, - scd); + scd, scd->use_mats); if (SCULPT_DEBUG_BUFFERS) { int debug_node_nr = 0; -- cgit v1.2.3