/** * Currently this is only used for Python scripts * which may fail to keep matching UV/TexFace layers. * * \note This should only perform any changes in exceptional cases, * if we need this to be faster we could inline #BM_data_layer_add and only * call #update_data_blocks once at the end. */ void BM_mesh_cd_validate(BMesh *bm) { int totlayer_mtex = CustomData_number_of_layers(&bm->pdata, CD_MTEXPOLY); int totlayer_uv = CustomData_number_of_layers(&bm->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(&bm->ldata, CD_MLOOPUV); do { const char *from_name = bm->ldata.layers[uv_index_first + totlayer_mtex].name; BM_data_layer_add_named(bm, &bm->pdata, CD_MTEXPOLY, from_name); CustomData_set_layer_unique_name(&bm->pdata, totlayer_mtex); } while (totlayer_uv != ++totlayer_mtex); } else if (totlayer_uv < totlayer_mtex) { const int mtex_index_first = CustomData_get_layer_index(&bm->pdata, CD_MTEXPOLY); do { const char *from_name = bm->pdata.layers[mtex_index_first + totlayer_uv].name; BM_data_layer_add_named(bm, &bm->ldata, CD_MLOOPUV, from_name); CustomData_set_layer_unique_name(&bm->ldata, totlayer_uv); } while (totlayer_mtex != ++totlayer_uv); } BLI_assert(totlayer_mtex == totlayer_uv); }
/** * 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); int totlayer_mcol = CustomData_number_of_layers(&me->ldata, CD_MLOOPCOL); int mtex_index = CustomData_get_layer_index(&me->pdata, CD_MTEXPOLY); int uv_index = CustomData_get_layer_index(&me->ldata, CD_MLOOPUV); int i; /* XXX For now, do not delete those, just warn they are not really usable. */ if (UNLIKELY(totlayer_mtex > MAX_MTFACE)) { printf("WARNING! More UV layers than %d allowed, %d last ones won't be available for render, shaders, etc.\n", MAX_MTFACE, totlayer_mtex - MAX_MTFACE); } if (UNLIKELY(totlayer_uv > MAX_MTFACE)) { printf("WARNING! More UV layers than %d allowed, %d last ones won't be available for render, shaders, etc.\n", MAX_MTFACE, totlayer_uv - MAX_MTFACE); } if (UNLIKELY(totlayer_mcol > MAX_MCOL)) { printf("WARNING! More VCol layers than %d allowed, %d last ones won't be available for render, shaders, etc.\n", MAX_MCOL, totlayer_mcol - MAX_MCOL); } if (LIKELY(totlayer_mtex == totlayer_uv)) { /* pass */ } else if (totlayer_mtex < totlayer_uv) { do { const char *from_name = me->ldata.layers[uv_index + 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); mtex_index = CustomData_get_layer_index(&me->pdata, CD_MTEXPOLY); } else if (totlayer_uv < totlayer_mtex) { do { const char *from_name = me->pdata.layers[mtex_index + 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); uv_index = CustomData_get_layer_index(&me->ldata, CD_MLOOPUV); } BLI_assert(totlayer_mtex == totlayer_uv); /* Check uv/tex names match as well!!! */ for (i = 0; i < totlayer_mtex; i++, mtex_index++, uv_index++) { const char *name_src = me->pdata.layers[mtex_index].name; const char *name_dst = me->ldata.layers[uv_index].name; if (!STREQ(name_src, name_dst)) { BKE_mesh_uv_cdlayer_rename_index(me, mtex_index, uv_index, -1, name_src, false); } } }
bool BKE_mesh_uv_cdlayer_rename_index(Mesh *me, const int poly_index, const int loop_index, const int face_index, const char *new_name, const bool do_tessface) { CustomData *pdata, *ldata, *fdata; CustomDataLayer *cdlp, *cdlu, *cdlf; const int step = do_tessface ? 3 : 2; int i; if (me->edit_btmesh) { pdata = &me->edit_btmesh->bm->pdata; ldata = &me->edit_btmesh->bm->ldata; fdata = NULL; /* No tessellated data in BMesh! */ } else { pdata = &me->pdata; ldata = &me->ldata; fdata = &me->fdata; } cdlp = &pdata->layers[poly_index]; cdlu = &ldata->layers[loop_index]; cdlf = fdata && do_tessface ? &fdata->layers[face_index] : NULL; BLI_strncpy(cdlp->name, new_name, sizeof(cdlp->name)); CustomData_set_layer_unique_name(pdata, cdlp - pdata->layers); /* Loop until we do have exactly the same name for all layers! */ for (i = 1; (strcmp(cdlp->name, cdlu->name) != 0 || (cdlf && strcmp(cdlp->name, cdlf->name) != 0)); i++) { switch (i % step) { case 0: BLI_strncpy(cdlp->name, cdlu->name, sizeof(cdlp->name)); CustomData_set_layer_unique_name(pdata, cdlp - pdata->layers); break; case 1: BLI_strncpy(cdlu->name, cdlp->name, sizeof(cdlu->name)); CustomData_set_layer_unique_name(ldata, cdlu - ldata->layers); break; case 2: if (cdlf) { BLI_strncpy(cdlf->name, cdlp->name, sizeof(cdlf->name)); CustomData_set_layer_unique_name(fdata, cdlf - fdata->layers); } break; } } return true; }
/** * 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); int mtex_index = CustomData_get_layer_index(&me->pdata, CD_MTEXPOLY); int uv_index = CustomData_get_layer_index(&me->ldata, CD_MLOOPUV); int i; if (LIKELY(totlayer_mtex == totlayer_uv)) { /* pass */ } else if (totlayer_mtex < totlayer_uv) { do { const char *from_name = me->ldata.layers[uv_index + 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); mtex_index = CustomData_get_layer_index(&me->pdata, CD_MTEXPOLY); } else if (totlayer_uv < totlayer_mtex) { do { const char *from_name = me->pdata.layers[mtex_index + 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); uv_index = CustomData_get_layer_index(&me->ldata, CD_MLOOPUV); } BLI_assert(totlayer_mtex == totlayer_uv); /* Check uv/tex names match as well!!! */ for (i = 0; i < totlayer_mtex; i++, mtex_index++, uv_index++) { const char *name_src = me->pdata.layers[mtex_index].name; const char *name_dst = me->ldata.layers[uv_index].name; if (!STREQ(name_src, name_dst)) { BKE_mesh_uv_cdlayer_rename_index(me, mtex_index, uv_index, -1, name_src, false); } } }