[Bf-blender-cvs] [f6bb3262f17] blender2.8: DwM: add CD_AUTO_FROM_NAME for mesh conversion
Campbell Barton
noreply at git.blender.org
Thu Jun 29 07:19:46 CEST 2017
Commit: f6bb3262f17170c5bbcd732d84b17b4174673cb5
Author: Campbell Barton
Date: Thu Jun 29 15:23:47 2017 +1000
Branches: blender2.8
https://developer.blender.org/rBf6bb3262f17170c5bbcd732d84b17b4174673cb5
DwM: add CD_AUTO_FROM_NAME for mesh conversion
===================================================================
M source/blender/draw/intern/draw_cache_impl_mesh.c
===================================================================
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index c65799521b2..d7bef6b1045 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -243,6 +243,7 @@ static void mesh_cd_calc_used_gpu_layers(
CustomData *cd_ldata, uchar cd_lused[CD_NUMTYPES],
struct GPUMaterial **gpumat_array, int gpumat_array_len)
{
+ /* See: DM_vertex_attributes_from_gpu for similar logic */
GPUVertexAttribs gattribs = {0};
for (int i = 0; i < gpumat_array_len; i++) {
@@ -251,37 +252,74 @@ static void mesh_cd_calc_used_gpu_layers(
GPU_material_vertex_attributes(gpumat, &gattribs);
for (int j = 0; j < gattribs.totlayer; j++) {
const char *name = gattribs.layer[j].name;
- switch (gattribs.layer[j].type) {
+ int type = gattribs.layer[j].type;
+ int layer = -1;
+
+ if (type == CD_AUTO_FROM_NAME) {
+ /* We need to deduct what exact layer is used.
+ *
+ * We do it based on the specified name.
+ */
+ if (name[0]) {
+ layer = CustomData_get_named_layer_index(cd_ldata, CD_MLOOPUV, name);
+ type = CD_MTFACE;
+ if (layer == -1) {
+ layer = CustomData_get_named_layer_index(cd_ldata, CD_MLOOPCOL, name);
+ type = CD_MCOL;
+ }
+#if 0 /* Tangents are always from UV's - this will never happen. */
+ if (layer == -1) {
+ layer = CustomData_get_named_layer_index(cd_ldata, CD_TANGENT, name);
+ type = CD_TANGENT;
+ }
+#endif
+ if (layer == -1) {
+ continue;
+ }
+ }
+ else {
+ /* Fall back to the UV layer, which matches old behavior. */
+ type = CD_MTFACE;
+ }
+ }
+
+ switch (type) {
case CD_MTFACE:
{
- int index = (name[0] != '\0') ?
- CustomData_get_named_layer(cd_ldata, CD_MLOOPUV, name) :
- CustomData_get_active_layer(cd_ldata, CD_MLOOPUV);
- if (index != -1) {
- cd_lused[CD_MLOOPUV] |= (1 << index);
+ if (layer == -1) {
+ layer = (name[0] != '\0') ?
+ CustomData_get_named_layer(cd_ldata, CD_MLOOPUV, name) :
+ CustomData_get_active_layer(cd_ldata, CD_MLOOPUV);
+ }
+ if (layer != -1) {
+ cd_lused[CD_MLOOPUV] |= (1 << layer);
}
break;
}
case CD_TANGENT:
{
- int index = (name[0] != '\0') ?
- CustomData_get_named_layer(cd_ldata, CD_MLOOPUV, name) :
- CustomData_get_active_layer(cd_ldata, CD_MLOOPUV);
- if (index != -1) {
- cd_lused[CD_TANGENT] |= (1 << index);
+ if (layer == -1) {
+ layer = (name[0] != '\0') ?
+ CustomData_get_named_layer(cd_ldata, CD_MLOOPUV, name) :
+ CustomData_get_active_layer(cd_ldata, CD_MLOOPUV);
+ }
+ if (layer != -1) {
+ cd_lused[CD_TANGENT] |= (1 << layer);
/* TODO(campbell): investigate why this is needed T51919. */
- cd_lused[CD_MLOOPUV] |= (1 << index);
+ cd_lused[CD_MLOOPUV] |= (1 << layer);
}
break;
}
case CD_MCOL:
{
- int index = (name[0] != '\0') ?
- CustomData_get_named_layer(cd_ldata, CD_MLOOPCOL, name) :
- CustomData_get_active_layer(cd_ldata, CD_MLOOPCOL);
- if (index != -1) {
- cd_lused[CD_MLOOPCOL] |= (1 << index);
+ if (layer == -1) {
+ layer = (name[0] != '\0') ?
+ CustomData_get_named_layer(cd_ldata, CD_MLOOPCOL, name) :
+ CustomData_get_active_layer(cd_ldata, CD_MLOOPCOL);
+ }
+ if (layer != -1) {
+ cd_lused[CD_MLOOPCOL] |= (1 << layer);
}
break;
}
More information about the Bf-blender-cvs
mailing list