[Bf-blender-cvs] [65ef507b8bf] temp-sculpt-colors: tempt-sculpt-colors: editmode fix

Joseph Eagar noreply at git.blender.org
Thu Nov 4 00:19:21 CET 2021


Commit: 65ef507b8bfdb985df7aa3ea3874ce05de1f094b
Author: Joseph Eagar
Date:   Wed Nov 3 16:01:06 2021 -0700
Branches: temp-sculpt-colors
https://developer.blender.org/rB65ef507b8bfdb985df7aa3ea3874ce05de1f094b

tempt-sculpt-colors: editmode fix

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

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/mesh_extractors/extract_mesh_vbo_vcol.cc

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

diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c
index 874a56fabf3..3d93ef47e27 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.c
+++ b/source/blender/draw/engines/workbench/workbench_engine.c
@@ -267,7 +267,12 @@ static eV3DShadingColorType workbench_color_type_get(WORKBENCH_PrivateData *wpd,
     }
   }
   else if (color_type == V3D_SHADING_VERTEX_COLOR) {
-    if ((me == NULL) || !CustomData_has_layer(&me->vdata, CD_PROP_COLOR)) {
+    bool has_color = me && (CustomData_has_layer(&me->vdata, CD_PROP_COLOR) ||
+                            CustomData_has_layer(&me->vdata, CD_MLOOPCOL) ||
+                            CustomData_has_layer(&me->ldata, CD_PROP_COLOR) ||
+                            CustomData_has_layer(&me->ldata, CD_MLOOPCOL));
+
+    if (!has_color) {
       color_type = V3D_SHADING_OBJECT_COLOR;
     }
   }
diff --git a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.c b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.c
index abfbeabef6b..f68acb73a91 100644
--- a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.c
+++ b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.c
@@ -464,6 +464,10 @@ MeshRenderData *mesh_render_data_create(Mesh *me,
     mr->bm = me->edit_mesh->bm;
     mr->edit_bmesh = me->edit_mesh;
     mr->me = (do_final) ? me->edit_mesh->mesh_eval_final : me->edit_mesh->mesh_eval_cage;
+
+    /* needed so correct vcol layer is shown in edit mode */
+    mr->me->attributes_active_index = me->attributes_active_index;
+
     mr->edit_data = is_mode_active ? mr->me->runtime.edit_data : NULL;
 
     if (mr->edit_data) {
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 080ef4cdeee..eb1fac23336 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
@@ -45,37 +45,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;
 
-#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];
-      const char *layer_name = CustomData_get_layer_name(cd_ldata, CD_MLOOPCOL, i);
-      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(cd_ldata, CD_MLOOPCOL)) {
-        GPU_vertformat_alias_add(&format, "c");
-      }
-      if (i == CustomData_get_active_layer(cd_ldata, CD_MLOOPCOL)) {
-        GPU_vertformat_alias_add(&format, "ac");
-      }
-
-      /* Gather number of auto layers. */
-      /* We only do `vcols` that are not overridden by `uvs`. */
-      if (CustomData_get_named_layer_index(cd_ldata, CD_MLOOPUV, layer_name) == -1) {
-        BLI_snprintf(attr_name, sizeof(attr_name), "a%s", attr_safe_name);
-        GPU_vertformat_alias_add(&format, attr_name);
-      }
-    }
-  }
-#endif
-
   /*
-  note that there are three color attribute types that operate over two domains
-  (verts and face corners)
+  Note there are two color attribute types that operate over two domains
+  (verts and face corners).
   */
   int vcol_types[2] = {CD_MLOOPCOL, CD_PROP_COLOR};
 
@@ -84,11 +56,14 @@ static void extract_vcol_init(const MeshRenderData *mr,
                                          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;
+  /* prefer the active attribute to set active color if it's a color layer  */
+  if (actlayer && ELEM(actlayer->type, CD_PROP_COLOR, CD_MLOOPCOL) &&
+      ELEM(actdomain, ATTR_DOMAIN_POINT, ATTR_DOMAIN_CORNER)) {
+    CustomData *cdata = actdomain == ATTR_DOMAIN_POINT ? cd_vdata : cd_ldata;
     actn = actlayer - (cdata->layers + cdata->typemap[actlayer->type]);
   }
 
+  /* set up vbo format */
   for (int i = 0; i < ARRAY_SIZE(vcol_types); i++) {
     int type = vcol_types[i];
 
@@ -137,7 +112,8 @@ static void extract_vcol_init(const MeshRenderData *mr,
 
   gpuMeshVcol *vcol_data = (gpuMeshVcol *)GPU_vertbuf_get_data(vbo);
 
-  for (int i = 0; i < 3; i++) {
+  /* build data */
+  for (int i = 0; i < ARRAY_SIZE(vcol_types); i++) {
     int type = vcol_types[i];
 
     for (int step = 0; step < 2; step++) {
@@ -151,7 +127,9 @@ static void extract_vcol_init(const MeshRenderData *mr,
           BMFace *f;
           BMIter iter;
 
-          int cd_vcol = cdata->layers[idx].offset;
+          CustomData *cdata_orig = step ? &mr->bm->ldata : &mr->bm->vdata;
+          int idx_orig = CustomData_get_layer_index_n(cdata_orig, type, j);
+          int cd_vcol = cdata_orig->layers[idx_orig].offset;
 
           BM_ITER_MESH (f, &iter, mr->bm, BM_FACES_OF_MESH) {
             BMLoop *l_iter = BM_FACE_FIRST_LOOP(f);
@@ -173,8 +151,8 @@ static void extract_vcol_init(const MeshRenderData *mr,
                   float temp[4];
 
                   MLoopCol *mloopcol = (MLoopCol *)BM_ELEM_CD_GET_VOID_P(elem, cd_vcol);
-                  rgba_float_to_uchar((unsigned char *)mloopcol, temp);
-                  linearrgb_to_srgb_v3_v3(temp, temp);
+                  rgba_uchar_to_float(temp, (unsigned char *)mloopcol);
+                  srgb_to_linearrgb_v3_v3(temp, temp);
 
                   vcol_data->r = unit_float_to_ushort_clamp(temp[0]);
                   vcol_data->g = unit_float_to_ushort_clamp(temp[1]);
@@ -189,10 +167,6 @@ static void extract_vcol_init(const MeshRenderData *mr,
           }
         }
         else {
-          using MPropCol3 = struct {
-            float color[3];
-          };
-
           switch (type) {
             case CD_PROP_COLOR: {
               MPropCol *colors = (MPropCol *)cdata->layers[idx].data;
@@ -225,8 +199,9 @@ static void extract_vcol_init(const MeshRenderData *mr,
               if (step) {
                 for (int k = 0; k < mr->loop_len; k++, vcol_data++, colors++) {
                   float temp[4];
-                  rgba_float_to_uchar((unsigned char *)colors, temp);
-                  linearrgb_to_srgb_v3_v3(temp, temp);
+
+                  rgba_uchar_to_float(temp, (unsigned char *)colors);
+                  srgb_to_linearrgb_v3_v3(temp, temp);
 
                   vcol_data->r = unit_float_to_ushort_clamp(temp[0]);
                   vcol_data->g = unit_float_to_ushort_clamp(temp[1]);
@@ -241,8 +216,8 @@ static void extract_vcol_init(const MeshRenderData *mr,
                   MLoopCol *color = colors + ml->v;
                   float temp[4];
 
-                  rgba_float_to_uchar((unsigned char *)color, temp);
-                  linearrgb_to_srgb_v3_v3(temp, temp);
+                  rgba_uchar_to_float(temp, (unsigned char *)color);
+                  srgb_to_linearrgb_v3_v3(temp, temp);
 
                   vcol_data->r = unit_float_to_ushort_clamp(temp[0]);
                   vcol_data->g = unit_float_to_ushort_clamp(temp[1]);



More information about the Bf-blender-cvs mailing list