diff options
-rw-r--r-- | source/blender/blenkernel/BKE_mesh.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_validate.c | 39 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 6 |
3 files changed, 46 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index aac91abc449..8b514c04a1f 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -354,6 +354,7 @@ void BKE_mesh_calc_relative_deform( /* *** mesh_validate.c *** */ int BKE_mesh_validate(struct Mesh *me, const int do_verbose); +void BKE_mesh_cd_validate(struct Mesh *me); bool BKE_mesh_validate_arrays( struct Mesh *me, diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c index 6ec14add8a9..557d201e7fd 100644 --- a/source/blender/blenkernel/intern/mesh_validate.c +++ b/source/blender/blenkernel/intern/mesh_validate.c @@ -922,6 +922,7 @@ bool BKE_mesh_validate_all_customdata(CustomData *vdata, CustomData *edata, { bool is_valid = true; bool is_change_v, is_change_e, is_change_l, is_change_p; + int tot_texpoly, tot_uvloop; CustomDataMask mask = check_meshmask ? CD_MASK_MESH : 0; is_valid &= mesh_validate_customdata(vdata, mask, do_verbose, do_fixes, &is_change_v); @@ -929,6 +930,13 @@ bool BKE_mesh_validate_all_customdata(CustomData *vdata, CustomData *edata, is_valid &= mesh_validate_customdata(ldata, mask, do_verbose, do_fixes, &is_change_l); is_valid &= mesh_validate_customdata(pdata, mask, do_verbose, do_fixes, &is_change_p); + tot_texpoly = CustomData_number_of_layers(pdata, CD_MTEXPOLY); + tot_uvloop = CustomData_number_of_layers(ldata, CD_MLOOPUV); + if (tot_texpoly != tot_uvloop) { + PRINT_ERR("\tCustomDataLayer mismatch, tot_texpoly(%d), tot_uvloop(%d)\n", + tot_texpoly, tot_uvloop); + } + *r_change = (is_change_v || is_change_e || is_change_l || is_change_p); return is_valid; @@ -973,6 +981,37 @@ int BKE_mesh_validate(Mesh *me, const int do_verbose) return false; } } + +/** + * Duplicate of BM_mesh_cd_validate() for Mesh data. + */ +void BKE_mesh_cd_validate(Mesh *me) +{ + int totlayer_mtex = CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY); + int totlayer_uv = CustomData_number_of_layers(&me->ldata, CD_MLOOPUV); + + if (LIKELY(totlayer_mtex == totlayer_uv)) { + /* pass */ + } + else if (totlayer_mtex < totlayer_uv) { + const int uv_index_first = CustomData_get_layer_index(&me->ldata, CD_MLOOPUV); + do { + const char *from_name = me->ldata.layers[uv_index_first + totlayer_mtex].name; + CustomData_add_layer_named(&me->pdata, CD_MTEXPOLY, CD_DEFAULT, NULL, me->totpoly, from_name); + CustomData_set_layer_unique_name(&me->pdata, totlayer_mtex); + } while (totlayer_uv != ++totlayer_mtex); + } + else if (totlayer_uv < totlayer_mtex) { + const int mtex_index_first = CustomData_get_layer_index(&me->pdata, CD_MTEXPOLY); + do { + const char *from_name = me->pdata.layers[mtex_index_first + totlayer_uv].name; + CustomData_add_layer_named(&me->ldata, CD_MLOOPUV, CD_DEFAULT, NULL, me->totloop, from_name); + CustomData_set_layer_unique_name(&me->ldata, totlayer_uv); + } while (totlayer_mtex != ++totlayer_uv); + } + + BLI_assert(totlayer_mtex == totlayer_uv); +} /** \} */ diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index bcbc4c2638b..193177bb33d 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -4149,6 +4149,12 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh) direct_link_customdata(fd, &mesh->ldata, mesh->totloop); direct_link_customdata(fd, &mesh->pdata, mesh->totpoly); + if (mesh->mloopuv || mesh->mtpoly) { + /* for now we have to ensure texpoly and mloopuv layers are aligned + * in the future we may allow non-aligned layers */ + BKE_mesh_cd_validate(mesh); + } + mesh->bb = NULL; mesh->edit_btmesh = NULL; |