[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