[Bf-blender-cvs] [17df30e8ea4] temp-sculpt-colors: temp-sculpt-colors: make requested changes
Joseph Eagar
noreply at git.blender.org
Sat Feb 12 16:52:00 CET 2022
Commit: 17df30e8ea47a165d69c658e47037fe2367357d2
Author: Joseph Eagar
Date: Sat Feb 12 07:27:54 2022 -0800
Branches: temp-sculpt-colors
https://developer.blender.org/rB17df30e8ea47a165d69c658e47037fe2367357d2
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.
===================================================================
M source/blender/blenkernel/BKE_attribute.h
M source/blender/blenkernel/intern/attribute.c
M source/blender/blenkernel/intern/customdata.cc
M source/blender/blenkernel/intern/mesh.cc
M source/blender/blenloader/intern/versioning_300.c
M source/blender/draw/engines/workbench/workbench_engine.c
M source/blender/draw/intern/draw_cache_extract_mesh_render_data.c
M source/blender/draw/intern/draw_cache_impl_mesh.c
M source/blender/draw/intern/mesh_extractors/extract_mesh.h
M source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_attributes.cc
M source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vcol.cc
M source/blender/editors/geometry/geometry_attributes.cc
M source/blender/makesdna/DNA_customdata_types.h
M source/blender/makesdna/DNA_mesh_types.h
M source/blender/makesrna/intern/rna_attribute.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_attribute.h b/source/blender/blenkernel/BKE_attribute.h
index 551e779af16..68966ae7114 100644
--- a/source/blender/blenkernel/BKE_attribute.h
+++ b/source/blender/blenkernel/BKE_attribute.h
@@ -43,6 +43,10 @@ typedef enum AttributeDomainMask {
ATTR_DOMAIN_MASK_ALL = (1 << 5) - 1
} AttributeDomainMask;
+/* All domains that support color attributes */
+#define ATTR_DOMAIN_MASK_COLOR \
+ ((AttributeDomainMask)((ATTR_DOMAIN_MASK_POINT | ATTR_DOMAIN_MASK_CORNER)))
+
/* Attributes */
bool BKE_id_attributes_supported(struct ID *id);
@@ -67,7 +71,7 @@ struct CustomDataLayer *BKE_id_attribute_find(const struct ID *id,
int type,
AttributeDomain domain);
-AttributeDomain BKE_id_attribute_domain(struct ID *id, struct CustomDataLayer *layer);
+AttributeDomain BKE_id_attribute_domain(struct ID *id, const struct CustomDataLayer *layer);
int BKE_id_attribute_data_length(struct ID *id, struct CustomDataLayer *layer);
bool BKE_id_attribute_required(struct ID *id, struct CustomDataLayer *layer);
bool BKE_id_attribute_rename(struct ID *id,
@@ -84,39 +88,49 @@ void BKE_id_attributes_active_set(struct ID *id, struct CustomDataLayer *layer);
int *BKE_id_attributes_active_index_p(struct ID *id);
CustomData *BKE_id_attributes_iterator_next_domain(struct ID *id, struct CustomDataLayer *layers);
-const CustomDataLayer *BKE_id_attribute_from_index(const struct ID *id,
- int lookup_index,
- const AttributeDomainMask domain_mask);
+CustomDataLayer *BKE_id_attribute_from_index(const struct ID *id,
+ int lookup_index,
+ AttributeDomainMask domain_mask,
+ CustomDataMask layer_mask);
+
+/** Layer is allowed to be nullptr; if so -1 (layer not found) will be returned. */
+int BKE_id_attribute_to_index(const struct ID *id,
+ const CustomDataLayer *layer,
+ AttributeDomainMask domain_mask,
+ CustomDataMask layer_mask);
+
+struct CustomDataLayer *BKE_id_attribute_subset_active_get(struct ID *id,
+ int active_flag,
+ AttributeDomainMask domain_mask,
+ CustomDataMask mask);
+void BKE_id_attribute_subset_active_set(struct ID *id,
+ struct CustomDataLayer *layer,
+ int active_flag,
+ AttributeDomainMask domain_mask,
+ CustomDataMask mask);
+
+/** Copies CustomData instances into a (usually stack-allocated) ID. This is a shallow copy, the
+ purpose is to create a bride for using the C attribute API on arbitrary sets of CustomData
+ domains.
+*/
+
+void BKE_id_attribute_copy_domains_temp(struct ID *temp_id,
+ const struct CustomData *vdata,
+ const struct CustomData *edata,
+ const struct CustomData *ldata,
+ const struct CustomData *pdata,
+ const struct CustomData *cdata);
-struct AttributeRef *BKE_id_attributes_active_color_ref_p(struct ID *id);
-void BKE_id_attributes_active_color_set(struct ID *id, struct CustomDataLayer *active_layer);
struct CustomDataLayer *BKE_id_attributes_active_color_get(struct ID *id);
-
-struct AttributeRef *BKE_id_attributes_render_color_ref_p(struct ID *id);
+void BKE_id_attributes_active_color_set(struct ID *id, struct CustomDataLayer *active_layer);
+struct CustomDataLayer *BKE_id_attributes_render_color_get(struct ID *id);
void BKE_id_attributes_render_color_set(struct ID *id, struct CustomDataLayer *active_layer);
-CustomDataLayer *BKE_id_attributes_render_color_get(struct ID *id);
bool BKE_id_attribute_find_unique_name(struct ID *id,
const char *name,
char *outname,
CustomDataMask mask);
-int BKE_id_attribute_index_from_ref(struct ID *id,
- struct AttributeRef *ref,
- AttributeDomainMask domain_mask,
- CustomDataMask type_filter);
-
-bool BKE_id_attribute_ref_from_index(struct ID *id,
- int attr_index,
- AttributeDomainMask domain_mask,
- CustomDataMask type_filter,
- struct AttributeRef *r_ref);
-
-bool BKE_id_attribute_ref_layer_equals(const struct AttributeRef *ref,
- const struct CustomDataLayer *layer,
- const AttributeDomain domain);
-bool BKE_id_attribute_ref_equals(const struct AttributeRef *ref1, const struct AttributeRef *ref2);
-
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/intern/attribute.c b/source/blender/blenkernel/intern/attribute.c
index 07c64fedf90..f7f98059199 100644
--- a/source/blender/blenkernel/intern/attribute.c
+++ b/source/blender/blenkernel/intern/attribute.c
@@ -301,7 +301,7 @@ int BKE_id_attributes_length(const ID *id,
return length;
}
-AttributeDomain BKE_id_attribute_domain(ID *id, CustomDataLayer *layer)
+AttributeDomain BKE_id_attribute_domain(ID *id, const CustomDataLayer *layer)
{
DomainInfo info[ATTR_DOMAIN_NUM];
get_domains(id, info);
@@ -440,9 +440,10 @@ CustomData *BKE_id_attributes_iterator_next_domain(ID *id, CustomDataLayer *laye
return NULL;
}
-const CustomDataLayer *BKE_id_attribute_from_index(const ID *id,
- int lookup_index,
- const AttributeDomainMask domain_mask)
+CustomDataLayer *BKE_id_attribute_from_index(const ID *id,
+ int lookup_index,
+ AttributeDomainMask domain_mask,
+ CustomDataMask layer_mask)
{
DomainInfo info[ATTR_DOMAIN_NUM];
get_domains(id, info);
@@ -456,244 +457,207 @@ const CustomDataLayer *BKE_id_attribute_from_index(const ID *id,
}
for (int i = 0; i < customdata->totlayer; i++) {
- if (CD_MASK_PROP_ALL & CD_TYPE_AS_MASK(customdata->layers[i].type)) {
- if (index == lookup_index) {
- return customdata->layers + i;
- }
+ if (!(layer_mask & CD_TYPE_AS_MASK(customdata->layers[i].type)) ||
+ (CD_TYPE_AS_MASK(customdata->layers[i].type) & CD_FLAG_TEMPORARY)) {
+ continue;
+ }
- index++;
+ if (index == lookup_index) {
+ return customdata->layers + i;
}
+
+ index++;
}
}
return NULL;
}
-CustomDataLayer *BKE_id_attributes_active_color_get(ID *id)
+/** Get list of domain types but with ATTR_DOMAIN_FACE and
+ * ATTR_DOMAIN_CORNER swapped.
+ */
+static void get_domains_types(AttributeDomain domains[ATTR_DOMAIN_NUM])
{
- AttributeRef *ref = BKE_id_attributes_active_color_ref_p(id);
-
- if (!ref) {
- fprintf(stderr, "%s: vertex colors not supported for this type\n", __func__);
- return NULL;
- }
-
- if (!ref->name[0]) {
- return NULL;
+ for (AttributeDomain i = 0; i < ATTR_DOMAIN_NUM; i++) {
+ domains[i] = i;
}
- DomainInfo info[ATTR_DOMAIN_NUM];
- get_domains(id, info);
-
- int idx = CustomData_get_named_layer_index(info[ref->domain].customdata, ref->type, ref->name);
-
- return idx != -1 ? info[ref->domain].customdata->layers + idx : NULL;
+ /* swap corner and face */
+ SWAP(AttributeDomain, domains[ATTR_DOMAIN_FACE], domains[ATTR_DOMAIN_CORNER]);
}
-void BKE_id_attributes_active_color_set(ID *id, CustomDataLayer *active_layer)
+int BKE_id_attribute_to_index(const struct ID *id,
+ const CustomDataLayer *layer,
+ AttributeDomainMask domain_mask,
+ CustomDataMask layer_mask)
{
- AttributeRef *ref = BKE_id_attributes_active_color_ref_p(id);
-
- if (!ref) {
- fprintf(stderr, "%s: vertex colors not supported for this type\n", __func__);
- return;
+ if (!layer) {
+ return -1;
}
DomainInfo info[ATTR_DOMAIN_NUM];
+ AttributeDomain domains[ATTR_DOMAIN_NUM];
+ get_domains_types(domains);
get_domains(id, info);
- if (!active_layer || !ELEM(active_layer->type, CD_PROP_COLOR, CD_MLOOPCOL)) {
- fprintf(stderr,
- "bad active color layer %p; type was %d\n",
- active_layer,
- active_layer ? active_layer->type : -1);
- return;
- }
+ int index = 0;
+ for (int i = 0; i < ATTR_DOMAIN_NUM; i++) {
+ if (!(domain_mask & (1 << domains[i])) || !info[domains[i]].customdata) {
+ continue;
+ }
- for (AttributeDomain domain = 0; domain < ATTR_DOMAIN_NUM; domain++) {
- CustomData *customdata = info[domain].customdata;
+ CustomData *cdata = info[domains[i]].customdata;
+ for (int j = 0; j < cdata->totlayer; j++) {
+ CustomDataLayer *layer2 = cdata->layers + j;
- if (customdata) {
- for (int i = 0; i < customdata->totlayer; i++) {
- CustomDataLayer *layer = &customdata->layers[i];
+ if (!(CD_TYPE_AS_MASK(layer2->type) & layer_mask) ||
+ (CD_TYPE_AS_MASK(layer2->type) & CD_FLAG_TEMPORARY)) {
+ continue;
+ }
- if (layer == active_layer && ELEM(domain, ATTR_DOMAIN_POINT, ATTR_DOMAIN_CORNER)) {
- ref->type = layer->type;
- ref->domain = domain;
- BLI_strncpy_utf8(ref->name, layer->name, MAX_CUSTOMDATA_LAYER_NAME);
- return;
- }
+ if (layer == layer2) {
+ return index;
}
- }
- }
-
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list