[Bf-blender-cvs] [d42acadba5d] temp-sculpt-colors: temp-sculpt-colors: vcol extractor rewrite

Joseph Eagar noreply at git.blender.org
Wed Nov 3 22:38:33 CET 2021


Commit: d42acadba5dcf82fa58bfdca439cafc08028e1fe
Author: Joseph Eagar
Date:   Wed Nov 3 14:30:40 2021 -0700
Branches: temp-sculpt-colors
https://developer.blender.org/rBd42acadba5dcf82fa58bfdca439cafc08028e1fe

temp-sculpt-colors: vcol extractor rewrite

Draw cache system now properly uploads all three
vcol types to the gpu.

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

M	release/datafiles/icons/brush.sculpt.draw_sharp.dat
M	release/scripts/startup/bl_ui/properties_data_mesh.py
M	source/blender/draw/intern/draw_cache_impl_mesh.c
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/datafiles/CMakeLists.txt

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

diff --git a/release/datafiles/icons/brush.sculpt.draw_sharp.dat b/release/datafiles/icons/brush.sculpt.draw_sharp.dat
index 1877c0ae4d4..9bea1b02894 100644
Binary files a/release/datafiles/icons/brush.sculpt.draw_sharp.dat and b/release/datafiles/icons/brush.sculpt.draw_sharp.dat differ
diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py
index e0a9248515d..27921a5766a 100644
--- a/release/scripts/startup/bl_ui/properties_data_mesh.py
+++ b/release/scripts/startup/bl_ui/properties_data_mesh.py
@@ -576,7 +576,7 @@ class DATA_PT_mesh_attributes(MeshButtonsPanel, Panel):
         col.operator("geometry.attribute_remove", icon='REMOVE', text="")
 
         active = mesh.attributes.active
-        print(active.domain, active.data_type)
+        
         if active.domain == "POINT" and active.data_type == "FLOAT_COLOR":
             layout.operator("sculpt.vertex_to_loop_colors", text="Save To Corners")
             layout.operator("sculpt.loop_to_vertex_colors", text="Load From Corners")
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 41475851292..d78b864a952 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -457,15 +457,37 @@ static void mesh_cd_calc_active_mask_uv_layer(const Mesh *me, DRW_MeshCDMask *cd
   }
 }
 
-static void mesh_cd_calc_active_vcol_layer(const Mesh *me, DRW_MeshAttributes *attrs_used)
+static bool mesh_cd_calc_active_vcol_layer(Mesh *me, DRW_MeshAttributes *attrs_used)
 {
+  CustomDataLayer *layer = BKE_id_attributes_active_get((ID *)me);
+
   const Mesh *me_final = editmesh_final_or_this(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);
 
-  int layer = CustomData_get_active_layer(cd_vdata, CD_PROP_COLOR);
-  if (layer != -1) {
-    drw_mesh_attributes_add_request(attrs_used, CD_PROP_COLOR, layer, ATTR_DOMAIN_POINT);
+  int type, idx = -1;
+  AttributeDomain domain;
+
+  if (layer && ELEM(layer->type, CD_PROP_FLOAT3, CD_PROP_COLOR, CD_MLOOPCOL)) {
+    domain = BKE_id_attribute_domain((ID *)me, layer);
+    type = layer->type;
+
+    idx = CustomData_get_named_layer(
+        domain == ATTR_DOMAIN_POINT ? cd_vdata : cd_ldata, type, layer->name);
+  }
+  else {
+    idx = CustomData_get_active_layer(cd_vdata, CD_PROP_COLOR);
+    type = CD_PROP_COLOR;
+    domain = ATTR_DOMAIN_POINT;
+  }
+
+  if (idx != -1) {
+    if (type != CD_MLOOPCOL) {
+      drw_mesh_attributes_add_request(attrs_used, type, idx, domain);
+    }
   }
+
+  return idx != -1;
 }
 
 static void mesh_cd_calc_active_mloopcol_layer(const Mesh *me, DRW_MeshCDMask *cd_used)
@@ -622,13 +644,15 @@ static DRW_MeshCDMask mesh_cd_calc_used_gpu_layers(const Mesh *me,
             break;
           }
           case CD_MCOL: {
+            const CustomData *cdata = domain == ATTR_DOMAIN_POINT ? cd_vdata : cd_ldata;
+
             /* Vertex Color Data */
             if (layer == -1) {
-              layer = (name[0] != '\0') ? CustomData_get_named_layer(cd_ldata, CD_MLOOPCOL, name) :
-                                          CustomData_get_render_layer(cd_ldata, CD_MLOOPCOL);
+              layer = (name[0] != '\0') ? CustomData_get_named_layer(cdata, CD_MLOOPCOL, name) :
+                                          CustomData_get_render_layer(cdata, CD_MLOOPCOL);
             }
             if (layer != -1) {
-              cd_used.vcol |= (1 << layer);
+              cd_used.vcol = 1;
             }
 
             break;
@@ -637,12 +661,15 @@ static DRW_MeshCDMask mesh_cd_calc_used_gpu_layers(const Mesh *me,
             cd_used.orco = 1;
             break;
           }
+          case CD_PROP_FLOAT3:
+          case CD_PROP_COLOR:
+            cd_used.vcol = 1;
+
+            /* fallthrough */
           case CD_PROP_BOOL:
           case CD_PROP_INT32:
           case CD_PROP_FLOAT:
-          case CD_PROP_FLOAT2:
-          case CD_PROP_FLOAT3:
-          case CD_PROP_COLOR: {
+          case CD_PROP_FLOAT2: {
             if (layer != -1 && domain != ATTR_DOMAIN_NUM) {
               drw_mesh_attributes_add_request(attributes, type, layer, domain);
             }
@@ -1112,7 +1139,10 @@ static void sculpt_request_active_vcol(MeshBatchCache *cache, Mesh *me)
 {
   DRW_MeshAttributes attrs_needed;
   drw_mesh_attributes_clear(&attrs_needed);
-  mesh_cd_calc_active_vcol_layer(me, &attrs_needed);
+
+  if (mesh_cd_calc_active_vcol_layer(me, &attrs_needed)) {
+    cache->cd_used.vcol = 1;
+  }
 
   BLI_assert(attrs_needed.num_requests != 0 &&
              "No MPropCol layer available in Sculpt, but batches requested anyway!");
@@ -1138,6 +1168,7 @@ GPUBatch *DRW_mesh_batch_cache_get_surface(Mesh *me)
 {
   MeshBatchCache *cache = mesh_batch_cache_get(me);
   mesh_batch_cache_request_surface_batches(cache);
+
   return cache->batch.surface;
 }
 
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_attributes.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_attributes.cc
index 9edefe32fbc..8033653b85a 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_attributes.cc
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_attributes.cc
@@ -95,6 +95,18 @@ template<> struct attribute_type_converter<MPropCol, gpuMeshCol> {
   }
 };
 
+template<> struct attribute_type_converter<MLoopCol, gpuMeshCol> {
+  static gpuMeshCol convert_value(MLoopCol value)
+  {
+    gpuMeshCol result;
+    result.r = value.r * 257;
+    result.g = value.g * 257;
+    result.b = value.b * 257;
+    result.a = value.a * 257;
+    return result;
+  }
+};
+
 /* Return the number of component for the attribute's value type, or 0 if is it unsupported. */
 static uint gpu_component_size_for_attribute_type(CustomDataType type)
 {
@@ -328,6 +340,10 @@ static void extract_attr_init(const MeshRenderData *mr,
       extract_attr_generic<MPropCol, gpuMeshCol>(mr, vbo, request);
       break;
     }
+    case CD_MLOOPCOL: {
+      extract_attr_generic<MLoopCol, gpuMeshCol>(mr, vbo, request);
+      break;
+    }
     default: {
       BLI_assert(false);
     }
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 ed4f2649b77..fb1bc112455 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
@@ -44,9 +44,9 @@ static void extract_vcol_init(const MeshRenderData *mr,
 
   CustomData *cd_vdata = (mr->extract_type == MR_EXTRACT_BMESH) ? &mr->bm->vdata : &mr->me->vdata;
   CustomData *cd_ldata = (mr->extract_type == MR_EXTRACT_BMESH) ? &mr->bm->ldata : &mr->me->ldata;
-  uint32_t vcol_layers = cache->cd_used.vcol;
 
 #if 0
+  uint32_t vcol_layers = cache->cd_used.vcol;
   for (int i = 0; i < MAX_MCOL; i++) {
     if (vcol_layers & (1 << i)) {
       char attr_name[32], attr_safe_name[GPU_MAX_SAFE_ATTR_NAME];
@@ -79,27 +79,42 @@ static void extract_vcol_init(const MeshRenderData *mr,
   */
   int vcol_types[3] = {CD_MLOOPCOL, CD_PROP_COLOR, CD_PROP_FLOAT3};
 
+  CustomDataLayer *actlayer = BKE_id_attributes_active_get((ID *)mr->me);
+  AttributeDomain actdomain = actlayer ? BKE_id_attribute_domain((ID *)mr->me, actlayer) :
+                                         ATTR_DOMAIN_AUTO;
+  int actn = -1;
+
+  if (actlayer && ELEM(actdomain, ATTR_DOMAIN_POINT, ATTR_DOMAIN_CORNER)) {
+    CustomData *cdata = actdomain == ATTR_DOMAIN_POINT ? &mr->me->vdata : &mr->me->ldata;
+    actn = actlayer - (cdata->layers + cdata->typemap[actlayer->type]);
+  }
+
   for (int i = 0; i < 3; i++) {
     int type = vcol_types[i];
 
     for (int step = 0; step < 2; step++) {
       CustomData *cdata = step ? cd_ldata : cd_vdata;
       int count = CustomData_number_of_layers(cdata, type);
+      AttributeDomain domain = step ? ATTR_DOMAIN_CORNER : ATTR_DOMAIN_POINT;
 
       for (int j = 0; j < count; j++) {
         int idx = CustomData_get_layer_index_n(cdata, type, j);
 
         char attr_name[32], attr_safe_name[GPU_MAX_SAFE_ATTR_NAME];
-        const char *layer_name = CustomData_get_layer_name(cdata, type, i);
+        const char *layer_name = CustomData_get_layer_name(cdata, type, j);
         GPU_vertformat_safe_attr_name(layer_name, attr_safe_name, GPU_MAX_SAFE_ATTR_NAME);
 
         BLI_snprintf(attr_name, sizeof(attr_name), "c%s", attr_safe_name);
         GPU_vertformat_attr_add(&format, attr_name, GPU_COMP_U16, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
 
-        if (i == CustomData_get_render_layer(cdata, type)) {
+        if (j == CustomData_get_render_layer(cdata, type)) {
           GPU_vertformat_alias_add(&format, "c");
         }
-        if (i == CustomData_get_active_layer(cdata, type)) {
+
+        bool is_active = actn == -1 && j == CustomData_get_active_layer(cdata, type);
+        is_active |= actn != -1 && domain == actdomain && j == actn && type == actlayer->type;
+
+        if (is_active) {
           GPU_vertformat_alias_add(&format, "ac");
         }
 
diff --git a/source/blender/editors/datafiles/CMakeLists.txt b/source/blender/editors/datafiles/CMakeLists.txt
index bd0bc4c3a11..4b099105195 100644
--- a/source/blender/editors/datafiles/CMakeLists.txt
+++ b/source/blender/editors/datafiles/CMakeLists.txt
@@ -742,6 +742,7 @@ set_property(GLOBAL PROPERTY ICON_GEOM_NAMES
   brush.particle.puff
   brush.particle.smooth
   brush.particle.weight
+  brush.sculpt.array
   brush.sculpt.blob
   brush.sculpt.boundary
   brush.sculpt.clay
@@ -750,11 +751,11 @@ set_property(GLOBAL PROPERTY ICON_GEOM_NAMES
   brush.sculpt.cloth
   brush.sculpt.crease
   brush.sculpt.displacement_eraser
-  brush.sculpt.displacement_smear
   brush.sculpt.draw
   brush.sculpt.draw_face_sets
   brush.sculpt.draw_sharp
   brush.sculpt.elastic_deform
+  brush.sculpt.fairing
   brush.sculpt.fill
   brush.sculpt.flatten
   brush.sculpt.grab
@@ -767,13 +768,15 @@ set_property(GLOBAL PROPERTY ICON_GEOM_NAMES
   brush.sculpt.pinch
   brush.sculpt.pose
   brush.sculpt.rotate
-  brush.sculp

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list