diff options
author | Joseph Eagar <joeedh@gmail.com> | 2022-02-12 18:27:54 +0300 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2022-02-12 18:27:54 +0300 |
commit | 17df30e8ea47a165d69c658e47037fe2367357d2 (patch) | |
tree | d6c0a6c81dc3291b9bc923a36af529f831313586 /source/blender/draw/intern/draw_cache_impl_mesh.c | |
parent | f09dbc54a5a59b189c797193dc29abf2caee0c29 (diff) |
temp-sculpt-colors: make requested changes
* Active/render color references are now
stored in customdata flags
* Everything seems to work except for gpu
subsurf in editmode. Need to track that
one down still.
Diffstat (limited to 'source/blender/draw/intern/draw_cache_impl_mesh.c')
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl_mesh.c | 161 |
1 files changed, 59 insertions, 102 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c index ab04b57bf01..cd7578c09ae 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -458,52 +458,24 @@ static void mesh_cd_calc_active_mask_uv_layer(const Object *object, } } -static bool mesh_cd_calc_active_vcol_layer(const Object *object, - const Mesh *me, - DRW_MeshAttributes *attrs_used) -{ - const Mesh *me_final = editmesh_final_or_this(object, me); - const CustomData *cd_vdata = mesh_cd_vdata_get_from_mesh(me_final); - const CustomData *cd_ldata = mesh_cd_ldata_get_from_mesh(me_final); - - CustomDataLayer *layer = BKE_id_attributes_active_color_get((ID *)me); - - int type, layer_i = -1; - AttributeDomain domain; - - if (layer && ELEM(layer->type, CD_PROP_COLOR, CD_MLOOPCOL)) { - domain = BKE_id_attribute_domain((ID *)me, layer); - type = layer->type; - - layer_i = CustomData_get_named_layer( - domain == ATTR_DOMAIN_POINT ? cd_vdata : cd_ldata, type, layer->name); - } - else { - layer_i = CustomData_get_active_layer(cd_vdata, CD_PROP_COLOR); - type = CD_PROP_COLOR; - domain = ATTR_DOMAIN_POINT; - } - - if (layer_i != -1) { - if (type != CD_MLOOPCOL) { - drw_mesh_attributes_add_request(attrs_used, type, layer_i, domain); - } - } - - return layer_i != -1; -} - static void mesh_cd_calc_active_mloopcol_layer(const Object *object, const Mesh *me, DRW_MeshCDMask *cd_used) { const Mesh *me_final = editmesh_final_or_this(object, me); + Mesh query_mesh = *me_final; + const CustomData *cd_vdata = mesh_cd_vdata_get_from_mesh(me_final); const CustomData *cd_ldata = mesh_cd_ldata_get_from_mesh(me_final); - int layer = mesh_cd_get_active_color_i(me_final, cd_vdata, cd_ldata); - if (layer != -1) { - cd_used->vcol |= (1UL << (uint)layer); + BKE_id_attribute_copy_domains_temp(&query_mesh.id, cd_vdata, NULL, cd_ldata, NULL, NULL); + + CustomDataLayer *layer = BKE_id_attributes_active_color_get(&query_mesh.id); + int layer_i = BKE_id_attribute_to_index( + &query_mesh.id, layer, ATTR_DOMAIN_MASK_COLOR, CD_MASK_COLOR_ALL); + + if (layer_i != -1) { + cd_used->vcol |= (1UL << (uint)layer_i); } } @@ -549,6 +521,11 @@ static DRW_MeshCDMask mesh_cd_calc_used_gpu_layers(const Object *object, const CustomData *cd_vdata = mesh_cd_vdata_get_from_mesh(me_final); const CustomData *cd_edata = mesh_cd_edata_get_from_mesh(me_final); + /* create a local copy of mesh with final customdata domains + we can query */ + Mesh query_mesh = *me; + BKE_id_attribute_copy_domains_temp(&query_mesh.id, cd_vdata, cd_edata, cd_ldata, cd_pdata, NULL); + /* See: DM_vertex_attributes_from_gpu for similar logic */ DRW_MeshCDMask cd_used; mesh_cd_layers_type_clear(&cd_used); @@ -683,65 +660,46 @@ static DRW_MeshCDMask mesh_cd_calc_used_gpu_layers(const Object *object, CD_MLOOPCOL layers, see node_shader_gpu_vertex_color in node_shader_vertex_color.cc */ + case CD_MCOL: case CD_MLOOPCOL: case CD_PROP_COLOR: { - const AttributeRef *render = &me->attr_color_render; + CustomDataLayer *layer = NULL; - if (domain == ATTR_DOMAIN_NUM) { - domain = render->domain; - } + if (name[0]) { + int layer_i = 0; - if (layer == -1 && name[0] != '\0') { - layer = CustomData_get_named_layer_index(cd_ldata, type, name); - domain = layer != -1 ? ATTR_DOMAIN_CORNER : domain; + AttributeDomain domain = ATTR_DOMAIN_POINT; + layer_i = CustomData_get_named_layer_index(cd_vdata, CD_PROP_COLOR, name); + layer_i = layer_i == -1 ? CustomData_get_named_layer_index(cd_vdata, CD_MLOOPCOL, name) : layer_i; - if (layer == -1) { - layer = CustomData_get_named_layer_index(cd_vdata, type, name); - domain = layer != -1 ? ATTR_DOMAIN_POINT : domain; - } - - if (layer == -1) { - layer = CustomData_get_named_layer_index(cd_ldata, CD_MLOOPCOL, name); - - if (layer != -1) { - domain = ATTR_DOMAIN_CORNER; - type = CD_MLOOPCOL; - } - } - - if (layer == -1) { - layer = CustomData_get_named_layer_index(cd_vdata, CD_MLOOPCOL, name); - - if (layer != -1) { - domain = ATTR_DOMAIN_POINT; - type = CD_MLOOPCOL; - } - } - - if (layer == -1) { - break; + if (layer_i == -1) { + domain = ATTR_DOMAIN_CORNER; + layer_i = layer_i == -1 ? + CustomData_get_named_layer_index(cd_ldata, CD_PROP_COLOR, name) : + layer_i; + layer_i = layer_i == -1 ? + CustomData_get_named_layer_index(cd_ldata, CD_MLOOPCOL, name) : + layer_i; } - AttributeRef ref; - const CustomData *cdata = domain == ATTR_DOMAIN_POINT ? cd_vdata : cd_ldata; - CustomDataLayer *clayer = cdata->layers + layer; - - ref.domain = domain; - BLI_strncpy(ref.name, clayer->name, sizeof(ref.name)); - ref.type = clayer->type; - - int layer_i = mesh_cd_get_vcol_i(cd_vdata, cd_ldata, &ref); - - if (layer_i >= 0) { - cd_used.vcol |= 1UL << (uint)layer_i; + /* Note that this is not the same as the layer_i below. */ + if (layer_i != -1) { + layer = (domain == ATTR_DOMAIN_POINT ? cd_vdata : cd_ldata)->layers + layer_i; } } else { - int layer_i = mesh_cd_get_vcol_i(cd_vdata, cd_ldata, render); + layer = BKE_id_attributes_render_color_get(&query_mesh.id); + } - if (layer_i >= 0) { - cd_used.vcol |= 1UL << (uint)layer_i; - } + if (!layer) { + break; + } + + int layer_i = BKE_id_attribute_to_index( + (ID *)&query_mesh, layer, ATTR_DOMAIN_MASK_COLOR, CD_MASK_COLOR_ALL); + + if (layer_i != -1) { + cd_used.vcol |= 1UL << (uint)layer_i; } break; @@ -1231,29 +1189,28 @@ static void texpaint_request_active_vcol(MeshBatchCache *cache, Object *object, static void sculpt_request_active_vcol(MeshBatchCache *cache, Object *object, Mesh *me) { - DRW_MeshAttributes attrs_needed; - drw_mesh_attributes_clear(&attrs_needed); - const Mesh *me_final = editmesh_final_or_this(object, me); const CustomData *cd_vdata = mesh_cd_vdata_get_from_mesh(me_final); const CustomData *cd_ldata = mesh_cd_ldata_get_from_mesh(me_final); - if (mesh_cd_calc_active_vcol_layer(object, me, &attrs_needed)) { - int active = mesh_cd_get_active_color_i(me_final, cd_vdata, cd_ldata); - int render = mesh_cd_get_render_color_i(me_final, cd_vdata, cd_ldata); + Mesh query_mesh = *me_final; + BKE_id_attribute_copy_domains_temp(&query_mesh.id, cd_vdata, NULL, cd_ldata, NULL, NULL); - if (active >= 0) { - cache->cd_used.vcol |= 1UL << (uint)active; - } - if (render >= 0) { - cache->cd_used.vcol |= 1UL << (uint)render; - } - } + CustomDataLayer *active = BKE_id_attributes_active_color_get(&query_mesh.id); + CustomDataLayer *render = BKE_id_attributes_render_color_get(&query_mesh.id); - BLI_assert(attrs_needed.num_requests != 0 && - "No MPropCol layer available in Sculpt, but batches requested anyway!"); + int active_i = BKE_id_attribute_to_index( + &query_mesh.id, active, ATTR_DOMAIN_MASK_COLOR, CD_MASK_COLOR_ALL); + int render_i = BKE_id_attribute_to_index( + &query_mesh.id, render, ATTR_DOMAIN_MASK_COLOR, CD_MASK_COLOR_ALL); - drw_mesh_attributes_merge(&cache->attr_needed, &attrs_needed, me->runtime.render_mutex); + if (active_i >= 0) { + cache->cd_used.vcol |= 1UL << (uint)active_i; + } + + if (render_i >= 0) { + cache->cd_used.vcol |= 1UL << (uint)render_i; + } } GPUBatch *DRW_mesh_batch_cache_get_all_verts(Mesh *me) |