Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Eagar <joeedh@gmail.com>2022-02-12 18:27:54 +0300
committerJoseph Eagar <joeedh@gmail.com>2022-02-12 18:27:54 +0300
commit17df30e8ea47a165d69c658e47037fe2367357d2 (patch)
treed6c0a6c81dc3291b9bc923a36af529f831313586 /source/blender/draw/intern/draw_cache_impl_mesh.c
parentf09dbc54a5a59b189c797193dc29abf2caee0c29 (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.c161
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)