[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