[Bf-blender-cvs] [3067efe54ed] temp-sculpt-colors: temp-sculpt-colors: Various fixes

Joseph Eagar noreply at git.blender.org
Fri Jan 7 16:53:41 CET 2022


Commit: 3067efe54eda52ccd679041aa657ca21c76f49fb
Author: Joseph Eagar
Date:   Fri Jan 7 07:51:59 2022 -0800
Branches: temp-sculpt-colors
https://developer.blender.org/rB3067efe54eda52ccd679041aa657ca21c76f49fb

temp-sculpt-colors: Various fixes

* Fixed byte color layers not rendering in EEVEE
* Fixed byte color layers not showing up in ui list
  for vertex color shading node.
* Rewrote vcol extractor for non-BMesh case to be
  less messy.

===================================================================

M	source/blender/blenkernel/intern/attribute.c
M	source/blender/draw/intern/draw_cache_impl_mesh.c
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vcol.cc
M	source/blender/editors/geometry/geometry_attributes.c
M	source/blender/editors/space_node/drawnode.cc
M	source/blender/gpu/intern/gpu_codegen.c
M	source/blender/makesrna/intern/rna_attribute.c
M	source/blender/makesrna/intern/rna_internal.h

===================================================================

diff --git a/source/blender/blenkernel/intern/attribute.c b/source/blender/blenkernel/intern/attribute.c
index 67aff869751..f89e678f3e0 100644
--- a/source/blender/blenkernel/intern/attribute.c
+++ b/source/blender/blenkernel/intern/attribute.c
@@ -495,6 +495,10 @@ CustomDataLayer *BKE_id_attributes_active_color_get(ID *id)
     return NULL;
   }
 
+  if (!ref->name[0]) {
+    return NULL;
+  }
+
   DomainInfo info[ATTR_DOMAIN_NUM];
   get_domains(id, info);
 
@@ -561,6 +565,10 @@ CustomDataLayer *BKE_id_attributes_render_color_get(ID *id)
     return NULL;
   }
 
+  if (!ref->name[0]) {
+    return NULL;
+  }
+
   DomainInfo info[ATTR_DOMAIN_NUM];
   get_domains(id, info);
 
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 6981c771173..8bde4e081d6 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -574,12 +574,34 @@ static DRW_MeshCDMask mesh_cd_calc_used_gpu_layers(const Mesh *me,
 
             if (layer == -1) {
               layer = CustomData_get_named_layer(cd_vdata, CD_PROP_COLOR, name);
-              type = CD_PROP_COLOR;
+              if (layer != -1) {
+                type = CD_PROP_COLOR;
+                domain = ATTR_DOMAIN_POINT;
+              }
+            }
+
+            if (layer == -1) {
+              layer = CustomData_get_named_layer(cd_ldata, CD_PROP_COLOR, name);
+              if (layer != -1) {
+                type = CD_PROP_COLOR;
+                domain = ATTR_DOMAIN_CORNER;
+              }
+            }
+
+            if (layer == -1) {
+              layer = CustomData_get_named_layer(cd_vdata, CD_MLOOPCOL, name);
+              if (layer != -1) {
+                type = CD_MLOOPCOL;
+                domain = ATTR_DOMAIN_POINT;
+              }
             }
 
             if (layer == -1) {
               layer = CustomData_get_named_layer(cd_ldata, CD_MLOOPCOL, name);
-              type = CD_MCOL;
+              if (layer != -1) {
+                type = CD_MLOOPCOL;
+                domain = ATTR_DOMAIN_CORNER;
+              }
             }
 
 #if 0 /* Tangents are always from UV's - this will never happen. */
@@ -656,7 +678,10 @@ static DRW_MeshCDMask mesh_cd_calc_used_gpu_layers(const Mesh *me,
             break;
           }
 
-          case CD_MCOL:
+          /* note that attr->type will always be CD_PROP_COLOR event for
+             CD_MLOOPCOL layers, see node_shader_gpu_vertex_color in
+             node_shader_vertex_color.cc
+           */
           case CD_MLOOPCOL:
           case CD_PROP_COLOR: {
             const AttributeRef *render = &me->attr_color_render;
@@ -667,15 +692,28 @@ static DRW_MeshCDMask mesh_cd_calc_used_gpu_layers(const Mesh *me,
 
             if (layer == -1 && name[0] != '\0') {
               layer = CustomData_get_named_layer_index(cd_ldata, type, name);
+              domain = layer != -1 ? ATTR_DOMAIN_CORNER : domain;
 
-              if (layer != -1) {
-                domain = ATTR_DOMAIN_CORNER;
-              }
-              else {
+              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;
                 }
               }
 
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vcol.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vcol.cc
index 69eafe78d53..d1c816330ed 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vcol.cc
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vcol.cc
@@ -145,8 +145,11 @@ static void init_vcol_format(GPUVertFormat *format,
 
     /* Gather number of auto layers. */
     /* We only do `vcols` that are not overridden by `uvs`. */
-    if (ref.domain == ATTR_DOMAIN_CORNER &&
-        CustomData_get_named_layer_index(cd_ldata, CD_MLOOPUV, ref.name) == -1) {
+
+    bool bad = ref.domain == ATTR_DOMAIN_CORNER;
+    bad = bad && CustomData_get_named_layer_index(cd_ldata, CD_MLOOPUV, ref.name) != -1;
+
+    if (!bad) {
       BLI_snprintf(attr_name, sizeof(attr_name), "a%s", attr_safe_name);
       GPU_vertformat_alias_add(format, attr_name);
     }
@@ -264,89 +267,38 @@ static void extract_vcol_init(const MeshRenderData *mr,
       }
     }
     else {
-      if (ref.domain == ATTR_DOMAIN_CORNER) {
-        if (ref.type == CD_MLOOPCOL) {
-          int totloop = mr->loop_len;
-          int idx = CustomData_get_named_layer_index(cdata, ref.type, ref.name);
-
-          if (idx == -1) {
-            vcol_data += totloop;
-            continue;
-          }
-
-          MLoopCol *mloopcol = (MLoopCol *)cdata->layers[idx].data;
-
-          for (int i = 0; i < totloop; i++, mloopcol++) {
-            vcol_data->r = unit_float_to_ushort_clamp(BLI_color_from_srgb_table[mloopcol->r]);
-            vcol_data->g = unit_float_to_ushort_clamp(BLI_color_from_srgb_table[mloopcol->g]);
-            vcol_data->b = unit_float_to_ushort_clamp(BLI_color_from_srgb_table[mloopcol->b]);
-            vcol_data->a = unit_float_to_ushort_clamp(mloopcol->a * (1.0f / 255.0f));
-            vcol_data++;
-          }
-        }
-        else {
-          int totloop = mr->loop_len;
-          int idx = CustomData_get_named_layer_index(cdata, ref.type, ref.name);
-
-          if (idx == -1) {
-            vcol_data += totloop;
-            continue;
-          }
+      int totloop = mr->loop_len;
+      int idx = CustomData_get_named_layer_index(cdata, ref.type, ref.name);
 
-          MPropCol *pcol = (MPropCol *)cdata->layers[idx].data;
+      MLoopCol *mcol = NULL;
+      MPropCol *pcol = NULL;
+      const MLoop *mloop = mr->mloop;
 
-          for (int i = 0; i < totloop; i++, pcol++) {
-            vcol_data->r = unit_float_to_ushort_clamp(pcol->color[0]);
-            vcol_data->g = unit_float_to_ushort_clamp(pcol->color[1]);
-            vcol_data->b = unit_float_to_ushort_clamp(pcol->color[2]);
-            vcol_data->a = unit_float_to_ushort_clamp(pcol->color[3]);
-            vcol_data++;
-          }
-        }
+      if (ref.type == CD_PROP_COLOR) {
+        pcol = static_cast<MPropCol*>(cdata->layers[idx].data);
+      }
+      else {
+        mcol = static_cast<MLoopCol *>(cdata->layers[idx].data);
       }
-      else if (ref.domain == ATTR_DOMAIN_POINT) {
-        if (ref.type == CD_MLOOPCOL) {
-          int totloop = mr->loop_len;
-          int idx = CustomData_get_named_layer_index(cdata, ref.type, ref.name);
-
-          if (idx == -1) {
-            vcol_data += totloop;
-            continue;
-          }
 
-          const MLoop *ml = mr->mloop;
-          MLoopCol *mloopcol = (MLoopCol *)cdata->layers[idx].data;
-
-          for (int i = 0; i < totloop; i++, ml++) {
-            vcol_data->r = unit_float_to_ushort_clamp(
-                BLI_color_from_srgb_table[mloopcol[ml->v].r]);
-            vcol_data->g = unit_float_to_ushort_clamp(
-                BLI_color_from_srgb_table[mloopcol[ml->v].g]);
-            vcol_data->b = unit_float_to_ushort_clamp(
-                BLI_color_from_srgb_table[mloopcol[ml->v].b]);
-            vcol_data->a = unit_float_to_ushort_clamp(mloopcol[ml->v].a * (1.0f / 255.0f));
-            vcol_data++;
-          }
+      const bool is_corner = ref.domain == ATTR_DOMAIN_CORNER;
+      
+      for (int i = 0; i < totloop; i++, mloop++) {
+        const int v_i = is_corner ? i : mloop->v;
+
+        if (mcol) {
+          vcol_data->r = unit_float_to_ushort_clamp(BLI_color_from_srgb_table[mcol[v_i].r]);
+          vcol_data->g = unit_float_to_ushort_clamp(BLI_color_from_srgb_table[mcol[v_i].g]);
+          vcol_data->b = unit_float_to_ushort_clamp(BLI_color_from_srgb_table[mcol[v_i].b]);
+          vcol_data->a = unit_float_to_ushort_clamp(mcol[v_i].a * (1.0f / 255.0f));
+          vcol_data++;
         }
-        else {
-          int totloop = mr->loop_len;
-          int idx = CustomData_get_named_layer_index(cdata, ref.type, ref.name);
-          const MLoop *ml = mr->mloop;
-
-          if (idx == -1) {
-            vcol_data += totloop;
-            continue;
-          }
-
-          MPropCol *pcol = (MPropCol *)cdata->layers[idx].data;
-
-          for (int i = 0; i < totloop; i++, ml++) {
-            vcol_data->r = unit_float_to_ushort_clamp(pcol[ml->v].color[0]);
-            vcol_data->g = unit_float_to_ushort_clamp(pcol[ml->v].color[1]);
-            vcol_data->b = unit_float_to_ushort_clamp(pcol[ml->v].color[2]);
-            vcol_data->a = unit_float_to_ushort_clamp(pcol[ml->v].color[3]);
-            vcol_data++;
-          }
+        else if (pcol) {
+          vcol_data->r = unit_float_to_ushort_clamp(pcol[v_i].color[0]);
+          vcol_data->g = unit_float_to_ushort_clamp(pcol[v_i].color[1]);
+          vcol_data->b = unit_float_to_ushort_clamp(pcol[v_i].color[2]);
+          vcol_data->a = unit_float_to_ushort_clamp(pcol[v_i].color[3]);
+          vcol_data++;
         }
       }
     }
diff --git a/source/blender/editors/geometry/geometry_attributes.c b/source/blender/editors/geometry/geometry_attributes.c
index b991855b6da..6b6c5a0945d 100644
--- a/source/blender/editors/geometry/geometry_attributes.c
+++ b/source/blender/editors/geometry/geometry_attributes.c
@@ -236,6 +236,10 @@ static int geometry_color_attribute_add_exec(bContext *C, wmOperator *op)
 
   BKE_id_attributes_active_color_set(id, layer);
 
+  if (!BKE_id_attributes_render_color_get(id)) {
+    BKE_id_attributes_render_color_set(id, layer);
+  }
+
   DEG_id_tag_update(id, ID_RECALC_GEOMETRY);
   WM_main_add_notifier(NC_GEOM | ND_DATA

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list