[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