Fix bug in previous commit; customdata_bmesh_set_default now ignores

CD_MESH_ID layers
This commit is contained in:
Joseph Eagar 2021-07-11 23:28:19 -04:00
parent f07f56aa37
commit 320a1b6f35
4 changed files with 43 additions and 16 deletions

View File

@ -3866,10 +3866,11 @@ static void CustomData_bmesh_set_default_n(CustomData *data, void **block, int n
int offset = data->layers[n].offset;
const LayerTypeInfo *typeInfo = layerType_getInfo(data->layers[n].type);
/*
if (data->layers[n].flag & CD_FLAG_ELEM_NOCOPY) {
/* can't allow this to be called on CD_MESH_ID */
if (data->layers[n].type == CD_MESH_ID) {
return;
}*/
}
if (typeInfo->set_default) {
typeInfo->set_default(POINTER_OFFSET(*block, offset), 1);

View File

@ -40,10 +40,14 @@
#define SELECT 1
static const int _typemap[] = {0, 0, 1, 0, 2, 0, 0, 0, 3};
static void bm_assign_id_intern(BMesh *bm, BMElem *elem, uint id)
{
BM_ELEM_CD_SET_INT(elem, bm->idmap.cd_id_off[elem->head.htype], id);
// CustomData *cdata = &bm->vdata + _typemap[elem->head.htype];
// int cd_id_off = cdata->layers[cdata->typemap[CD_MESH_ID]].offset;
BM_ELEM_CD_SET_INT(elem, bm->idmap.cd_id_off[elem->head.htype], id);
bm->idmap.maxid = MAX2(bm->idmap.maxid, id);
if (bm->idmap.flag & BM_HAS_ID_MAP) {
@ -88,7 +92,9 @@ void bm_free_id(BMesh *bm, BMElem *elem)
}
uint id = BM_ELEM_CD_GET_INT(elem, bm->idmap.cd_id_off[elem->head.htype]);
range_tree_uint_retake(bm->idmap.idtree, id);
if (range_tree_uint_has(bm->idmap.idtree, id)) {
range_tree_uint_release(bm->idmap.idtree, id);
}
if ((bm->idmap.flag & BM_HAS_ID_MAP) && bm->idmap.map && id >= 0 && id < bm->idmap.map_size) {
bm->idmap.map[id] = NULL;

View File

@ -303,7 +303,7 @@ static void bm_log_vert_customdata(
CustomData_bmesh_copy_data(&bm->vdata, &entry->vdata, v->head.data, &lv->customdata);
// forcibly copy id
bm_log_copy_id(&bm->vdata, (BMElem *)v, lv->customdata);
// bm_log_copy_id(&bm->vdata, (BMElem *)v, lv->customdata);
#endif
}
@ -326,7 +326,7 @@ static void bm_log_face_customdata(BMesh *bm, BMLog *log, BMFace *f, BMLogFace *
CustomData_bmesh_copy_data(&bm->pdata, &entry->pdata, f->head.data, &lf->customdata_f);
// forcibly copy id
bm_log_copy_id(&bm->pdata, (BMElem *)f, lf->customdata_f);
// bm_log_copy_id(&bm->pdata, (BMElem *)f, lf->customdata_f);
BMLoop *l1 = f->l_first;
BMLoop *l2 = f->l_first->next;
@ -436,12 +436,19 @@ static BMLogFace *bm_log_face_alloc(BMLog *log, BMFace *f)
static void bm_log_verts_unmake_pre(
BMesh *bm, BMLog *log, GHash *verts, BMLogEntry *entry, BMLogCallbacks *callbacks)
{
const int cd_vert_mask_offset = CustomData_get_offset(&bm->vdata, CD_PAINT_MASK);
GHashIterator gh_iter;
GHASH_ITER (gh_iter, verts) {
void *key = BLI_ghashIterator_getKey(&gh_iter);
BMLogVert *lv = BLI_ghashIterator_getValue(&gh_iter);
uint id = POINTER_AS_UINT(key);
BMVert *v = bm_log_vert_from_id(log, id);
/* Ensure the log has the final values of the vertex before
* deleting it */
bm_log_vert_bmvert_copy(log, entry, lv, v, cd_vert_mask_offset, true);
if (callbacks) {
callbacks->on_vert_kill(v, callbacks->userdata);
}
@ -460,15 +467,11 @@ static void bm_log_verts_unmake(
uint id = POINTER_AS_UINT(key);
BMVert *v = bm_log_vert_from_id(log, id);
/* Ensure the log has the final values of the vertex before
* deleting it */
bm_log_vert_bmvert_copy(log, entry, lv, v, cd_vert_mask_offset, true);
BM_vert_kill(bm, v);
}
}
static void bm_log_faces_unmake(
ATTR_NO_OPT static void bm_log_faces_unmake(
BMesh *bm, BMLog *log, GHash *faces, BMLogEntry *entry, BMLogCallbacks *callbacks)
{
GHashIterator gh_iter;
@ -498,7 +501,7 @@ static void bm_log_faces_unmake(
CustomData_bmesh_copy_data(&bm->pdata, &entry->pdata, f->head.data, &lf->customdata_f);
// forcibly copy id
bm_log_copy_id(&bm->pdata, (BMElem *)f, lf->customdata_f);
// bm_log_copy_id(&bm->pdata, (BMElem *)f, lf->customdata_f);
}
BMLoop *ls[3] = {f->l_first, f->l_first->next, f->l_first->prev};
@ -554,7 +557,7 @@ static void bm_log_verts_restore(
}
}
static void bm_log_faces_restore(
ATTR_NO_OPT static void bm_log_faces_restore(
BMesh *bm, BMLog *log, GHash *faces, BMLogEntry *entry, BMLogCallbacks *callbacks)
{
GHashIterator gh_iter;
@ -568,6 +571,24 @@ static void bm_log_faces_restore(
};
BMFace *f;
if (!v[0] || !v[1] || !v[2]) {
BMIter iter;
BMVert *v2;
const int cd_id = bm->idmap.cd_id_off[BM_VERT];
BM_ITER_MESH (v2, &iter, bm, BM_VERTS_OF_MESH) {
int id = BM_ELEM_CD_GET_INT(v2, cd_id);
for (int i = 0; i < 3; i++) {
if (!v[i] && lf->v_ids[i] == (uint)id) {
printf("found vertex\n");
}
}
}
printf("Undo error! %p %p %p\n", v[0], v[1], v[2]);
continue;
}
f = BM_face_create_verts(bm, v, 3, NULL, BM_CREATE_SKIP_ID, true);
f->head.hflag = lf->hflag;

View File

@ -248,8 +248,7 @@ enum {
CD_FLAG_EXTERNAL = (1 << 3),
/* Indicates external data is read into memory */
CD_FLAG_IN_MEMORY = (1 << 4),
CD_FLAG_ELEM_NOCOPY =
(1 << 5), // disables CustomData_bmesh_copy_data and CustomData_bmesh_set_default_n.
CD_FLAG_ELEM_NOCOPY = (1 << 5), // disables CustomData_bmesh_copy_data.
};
/* Limits */