[Bf-blender-cvs] [ba410bb416b] temp-sculpt-colors: Merge branch 'master' into temp-sculpt-colors

Joseph Eagar noreply at git.blender.org
Mon Mar 7 09:28:39 CET 2022


Commit: ba410bb416b931fb09698810f2eabbe882220389
Author: Joseph Eagar
Date:   Mon Mar 7 00:17:59 2022 -0800
Branches: temp-sculpt-colors
https://developer.blender.org/rBba410bb416b931fb09698810f2eabbe882220389

Merge branch 'master' into temp-sculpt-colors

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



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

diff --cc release/datafiles/locale
index 2d12637a69d,2a5095eed30..ad63b22b5a1
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@@ -1,1 -1,1 +1,1 @@@
- Subproject commit 2d12637a69df7643484a8a3655b7eeb6faa170a7
 -Subproject commit 2a5095eed3028e91624d27ca93e4c65f572b809d
++Subproject commit ad63b22b5a1adffc90beb96607c690e2b344ac94
diff --cc release/scripts/addons
index bdfb44b4256,bb62f10715a..fbb5111e155
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@@ -1,1 -1,1 +1,1 @@@
- Subproject commit bdfb44b4256c683360f05f5bde7159660f82c7b5
 -Subproject commit bb62f10715a871d7069d2b2c74b2efc97c3c350c
++Subproject commit fbb5111e1551ad26edabb2a58beb18da149cdceb
diff --cc source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vcol.cc
index d8dfad5b2cc,7a8f4a9a17e..e0993739b56
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vcol.cc
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_vcol.cc
@@@ -287,88 -147,25 +287,88 @@@ static void extract_vcol_init_subdiv(co
    /* Index of the vertex color layer in the compact buffer. Used vertex color layers are stored in
     * a single buffer. */
    int pack_layer_index = 0;
 -  for (int i = 0; i < MAX_MTFACE; i++) {
 -    if (vcol_layers & (1 << i)) {
 -      /* Include stride in offset, we use a stride of 2 since colors are packed into 2 uints. */
 -      const int dst_offset = (int)subdiv_cache->num_subdiv_loops * 2 * pack_layer_index++;
 -      const MLoopCol *mloopcol = (MLoopCol *)CustomData_get_layer_n(cd_ldata, CD_MLOOPCOL, i);
 -
 -      gpuMeshVcol *vcol = mesh_vcol;
 -
 -      for (int ml_index = 0; ml_index < coarse_mesh->totloop; ml_index++, vcol++, mloopcol++) {
 -        vcol->r = unit_float_to_ushort_clamp(BLI_color_from_srgb_table[mloopcol->r]);
 -        vcol->g = unit_float_to_ushort_clamp(BLI_color_from_srgb_table[mloopcol->g]);
 -        vcol->b = unit_float_to_ushort_clamp(BLI_color_from_srgb_table[mloopcol->b]);
 -        vcol->a = unit_float_to_ushort_clamp(mloopcol->a * (1.0f / 255.0f));
 -      }
 +  for (const VColRef &ref : refs) {
 +    /* Include stride in offset, we use a stride of 2 since colors are packed into 2 uints. */
 +    const int dst_offset = (int)subdiv_cache->num_subdiv_loops * 2 * pack_layer_index++;
 +
 +    const CustomData *cdata = ref.domain == ATTR_DOMAIN_POINT ? cd_vdata : cd_ldata;
 +    const MLoop *ml = coarse_mesh->mloop;
 +
 +    int layer_i = CustomData_get_named_layer_index(cdata, ref.layer->type, ref.layer->name);
 +
 +    if (layer_i == -1) {
 +      printf("%s: missing color layer %s\n", __func__, ref.layer->name);
 +      vcol += coarse_mesh->totloop;
 +      continue;
 +    }
 +
 +    MLoopCol *mcol = NULL;
 +    MPropCol *pcol = NULL;
  
 -      /* Ensure data is uploaded properly. */
 -      GPU_vertbuf_tag_dirty(src_data);
 -      draw_subdiv_interp_custom_data(subdiv_cache, src_data, dst_buffer, 4, dst_offset, true);
 +    if (ref.layer->type == CD_PROP_COLOR) {
 +      pcol = static_cast<MPropCol *>(cdata->layers[layer_i].data);
      }
 +    else {
 +      mcol = static_cast<MLoopCol *>(cdata->layers[layer_i].data);
 +    }
 +
 +    const bool is_vert = ref.domain == ATTR_DOMAIN_POINT;
 +
 +    if (extract_bmesh) {
 +      BMesh *bm = coarse_mesh->edit_mesh->bm;
 +      BMIter iter;
 +      BMFace *f;
 +      int cd_ofs = cdata->layers[layer_i].offset;
 +      const bool is_byte = ref.layer->type == CD_MLOOPCOL;
 +
 +      BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
 +        BMLoop *l_iter = f->l_first;
 +
 +        do {
 +          BMElem *elem = is_vert ? reinterpret_cast<BMElem *>(l_iter->v) :
 +                                   reinterpret_cast<BMElem *>(l_iter);
 +
 +          if (is_byte) {
 +            MLoopCol *mcol2 = static_cast<MLoopCol *>(BM_ELEM_CD_GET_VOID_P(elem, cd_ofs));
 +
 +            vcol->r = unit_float_to_ushort_clamp(BLI_color_from_srgb_table[mcol2->r]);
 +            vcol->g = unit_float_to_ushort_clamp(BLI_color_from_srgb_table[mcol2->g]);
 +            vcol->b = unit_float_to_ushort_clamp(BLI_color_from_srgb_table[mcol2->b]);
 +            vcol->a = unit_float_to_ushort_clamp(mcol2->a * (1.0f / 255.0f));
 +          }
 +          else {
 +            MPropCol *pcol2 = static_cast<MPropCol *>(BM_ELEM_CD_GET_VOID_P(elem, cd_ofs));
 +
 +            vcol->r = unit_float_to_ushort_clamp(pcol2->color[0]);
 +            vcol->g = unit_float_to_ushort_clamp(pcol2->color[1]);
 +            vcol->b = unit_float_to_ushort_clamp(pcol2->color[2]);
 +            vcol->a = unit_float_to_ushort_clamp(pcol2->color[3]);
 +          }
 +        } while ((l_iter = l_iter->next) != f->l_first);
 +      }
 +    }
 +    else {
 +      for (int ml_index = 0; ml_index < coarse_mesh->totloop; ml_index++, vcol++, ml++) {
 +        int idx = is_vert ? ml->v : ml_index;
 +
 +        if (mcol) {
 +          vcol->r = unit_float_to_ushort_clamp(BLI_color_from_srgb_table[mcol[idx].r]);
 +          vcol->g = unit_float_to_ushort_clamp(BLI_color_from_srgb_table[mcol[idx].g]);
 +          vcol->b = unit_float_to_ushort_clamp(BLI_color_from_srgb_table[mcol[idx].b]);
 +          vcol->a = unit_float_to_ushort_clamp(mcol[idx].a * (1.0f / 255.0f));
 +        }
 +        else if (pcol) {
 +          vcol->r = unit_float_to_ushort_clamp(pcol[idx].color[0]);
 +          vcol->g = unit_float_to_ushort_clamp(pcol[idx].color[1]);
 +          vcol->b = unit_float_to_ushort_clamp(pcol[idx].color[2]);
 +          vcol->a = unit_float_to_ushort_clamp(pcol[idx].color[3]);
 +        }
 +      }
 +    }
 +
 +    /* Ensure data is uploaded properly. */
 +    GPU_vertbuf_tag_dirty(src_data);
-     draw_subdiv_interp_custom_data(subdiv_cache, src_data, dst_buffer, 4, dst_offset);
++    draw_subdiv_interp_custom_data(subdiv_cache, src_data, dst_buffer, 4, dst_offset, true);
    }
  
    GPU_vertbuf_discard(src_data);
diff --cc source/blender/editors/sculpt_paint/paint_vertex.cc
index 40b3a2b6bcf,e2f8d81fe13..6e483cec97c
--- a/source/blender/editors/sculpt_paint/paint_vertex.cc
+++ b/source/blender/editors/sculpt_paint/paint_vertex.cc
@@@ -4089,10 -3507,8 +4089,16 @@@ extern "C" static int vpaint_invoke(bCo
                                      vpaint_stroke_done,
                                      event->type);
  
-   SCULPT_undo_push_begin(CTX_data_active_object(C), "Vertex Paint");
++  Object *ob = CTX_data_active_object(C);
++
++  if (SCULPT_has_loop_colors(ob) && ob->sculpt->pbvh) {
++    BKE_pbvh_ensure_node_loops(ob->sculpt->pbvh, BKE_object_get_original_mesh(ob));
++  }
++
++  SCULPT_undo_push_begin(ob, "Vertex Paint");
 +
    if ((retval = op->type->modal(C, op, event)) == OPERATOR_FINISHED) {
 -    paint_stroke_free(C, op, op->customdata);
 +    paint_stroke_free(C, op, (PaintStroke *)op->customdata);
      return OPERATOR_FINISHED;
    }
  
diff --cc source/blender/editors/sculpt_paint/sculpt.c
index aece6cd3991,70ff7596d6d..a3d554e2043
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@@ -144,19 -143,19 +144,27 @@@ const float *SCULPT_vertex_co_get(Sculp
    return NULL;
  }
  
 -const float *SCULPT_vertex_color_get(SculptSession *ss, int index)
++bool SCULPT_has_loop_colors(const Object *ob)
+ {
 -  switch (BKE_pbvh_type(ss->pbvh)) {
 -    case PBVH_FACES:
 -      if (ss->vcol) {
 -        return ss->vcol[index].color;
 -      }
 -      break;
 -    case PBVH_BMESH:
 -    case PBVH_GRIDS:
 -      break;
 -  }
 -  return NULL;
++  Mesh *me = BKE_object_get_original_mesh(ob);
++  CustomDataLayer *layer = BKE_id_attributes_active_color_get(&me->id);
++
++  return layer && BKE_id_attribute_domain(&me->id, layer) == ATTR_DOMAIN_CORNER;
++}
++
 +bool SCULPT_has_colors(const SculptSession *ss)
 +{
 +  return ss->vcol || ss->mcol;
 +}
 +
 +void SCULPT_vertex_color_get(SculptSession *ss, int index, float r_color[4])
 +{
 +  BKE_pbvh_vertex_color_get(ss->pbvh, index, r_color);
 +}
 +
 +void SCULPT_vertex_color_set(SculptSession *ss, int index, const float color[4])
 +{
 +  BKE_pbvh_vertex_color_set(ss->pbvh, index, color);
  }
  
  void SCULPT_vertex_normal_get(SculptSession *ss, int index, float no[3])
@@@ -3165,12 -3163,12 +3173,13 @@@ static void do_brush_action(Sculpt *sd
  
    /* Check for unsupported features. */
    PBVHType type = BKE_pbvh_type(ss->pbvh);
-   if (SCULPT_TOOL_NEEDS_COLOR(brush->sculpt_tool)) {
 -  if (brush->sculpt_tool == SCULPT_TOOL_PAINT && type != PBVH_FACES) {
 -    return;
 -  }
+ 
 -  if (brush->sculpt_tool == SCULPT_TOOL_SMEAR && type != PBVH_FACES) {
 -    return;
++  if (SCULPT_TOOL_NEEDS_COLOR(brush->sculpt_tool) && SCULPT_has_loop_colors(ob)) {
 +    if (type != PBVH_FACES) {
 +      return;
 +    }
 +
 +    BKE_pbvh_ensure_node_loops(ss->pbvh, BKE_object_get_original_mesh(ob));
    }
  
    /* Build a list of all nodes that are potentially within the brush's area of influence */
diff --cc source/blender/editors/sculpt_paint/sculpt_intern.h
index a2333d246e0,6f9df4d8252..84f6360825f
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@@ -867,9 -857,7 +867,10 @@@ const float *SCULPT_vertex_co_get(struc
  void SCULPT_vertex_normal_get(SculptSession *ss, int index, float no[3]);
  
  float SCULPT_vertex_mask_get(struct SculptSession *ss, int index);
 -const float *SCULPT_vertex_color_get(SculptSession *ss, int index);
 +void SCULPT_vertex_color_get(SculptSession *ss, int index, float r_color[4]);
 +void SCULPT_vertex_color_set(SculptSession *ss, int index, const float color[4]);
 +bool SCULPT_has_colors(const SculptSession *ss);
++bool SCULPT_has_loop_colors(const struct Object *ob);
  
  const float *SCULPT_vertex_persistent_co_get(SculptSession *ss, int index);
  void SCULPT_vertex_persistent_normal_get(SculptSession *ss, int index, float no[3]);
diff --cc source/blender/editors/sculpt_paint/sculpt_ops.c
index 5d1b176537a,53e8649585a..7e7a009dec9
--- a/source/blender/editors/sculpt_paint/sculpt_ops.c
+++ b/source/blender/editors/sculpt_paint/sculpt_ops.c
@@@ -1034,7 -1018,6 +1034,10 @@@ static int sculpt_mask_by_color_invoke(
      return OPERATOR_CANCELLED;
    }
  
-   BKE_pbvh_ensure_node_loops(ss->pbvh, BKE_object_get_original_mesh(ob));
++  if (SC

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list