forked from bartvdbraak/blender
Fix for customdata layer copying. Issue was caused by mixing up of destination and source in copy function. Also fixed an error in Py API, check to see if layers were different should be check to see if they're the same.
This commit is contained in:
parent
8b2ffc1428
commit
c63602286c
@ -852,24 +852,24 @@ void BM_data_layer_copy(BMesh *bm, CustomData *data, int type, int src_n, int ds
|
|||||||
BMVert *eve;
|
BMVert *eve;
|
||||||
|
|
||||||
BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
|
BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
|
||||||
void *ptr = CustomData_bmesh_get_n(data, eve->head.data, type, dst_n);
|
void *ptr = CustomData_bmesh_get_n(data, eve->head.data, type, src_n);
|
||||||
CustomData_bmesh_set_n(data, eve->head.data, type, src_n, ptr);
|
CustomData_bmesh_set_n(data, eve->head.data, type, dst_n, ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (&bm->edata == data) {
|
else if (&bm->edata == data) {
|
||||||
BMEdge *eed;
|
BMEdge *eed;
|
||||||
|
|
||||||
BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
|
BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
|
||||||
void *ptr = CustomData_bmesh_get_n(data, eed->head.data, type, dst_n);
|
void *ptr = CustomData_bmesh_get_n(data, eed->head.data, type, src_n);
|
||||||
CustomData_bmesh_set_n(data, eed->head.data, type, src_n, ptr);
|
CustomData_bmesh_set_n(data, eed->head.data, type, dst_n, ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (&bm->pdata == data) {
|
else if (&bm->pdata == data) {
|
||||||
BMFace *efa;
|
BMFace *efa;
|
||||||
|
|
||||||
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
||||||
void *ptr = CustomData_bmesh_get_n(data, efa->head.data, type, dst_n);
|
void *ptr = CustomData_bmesh_get_n(data, efa->head.data, type, src_n);
|
||||||
CustomData_bmesh_set_n(data, efa->head.data, type, src_n, ptr);
|
CustomData_bmesh_set_n(data, efa->head.data, type, dst_n, ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (&bm->ldata == data) {
|
else if (&bm->ldata == data) {
|
||||||
@ -879,8 +879,8 @@ void BM_data_layer_copy(BMesh *bm, CustomData *data, int type, int src_n, int ds
|
|||||||
|
|
||||||
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
||||||
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
|
||||||
void *ptr = CustomData_bmesh_get_n(data, l->head.data, type, dst_n);
|
void *ptr = CustomData_bmesh_get_n(data, l->head.data, type, src_n);
|
||||||
CustomData_bmesh_set_n(data, l->head.data, type, src_n, ptr);
|
CustomData_bmesh_set_n(data, l->head.data, type, dst_n, ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -309,44 +309,44 @@ int ED_mesh_uv_loop_reset(struct bContext *C, struct Mesh *me)
|
|||||||
int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_set)
|
int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_set)
|
||||||
{
|
{
|
||||||
BMEditMesh *em;
|
BMEditMesh *em;
|
||||||
int layernum;
|
int layernum_dst;
|
||||||
|
|
||||||
short is_init = FALSE;
|
short is_init = FALSE;
|
||||||
|
|
||||||
if (me->edit_btmesh) {
|
if (me->edit_btmesh) {
|
||||||
em = me->edit_btmesh;
|
em = me->edit_btmesh;
|
||||||
|
|
||||||
layernum = CustomData_number_of_layers(&em->bm->pdata, CD_MTEXPOLY);
|
layernum_dst = CustomData_number_of_layers(&em->bm->pdata, CD_MTEXPOLY);
|
||||||
if (layernum >= MAX_MTFACE)
|
if (layernum_dst >= MAX_MTFACE)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* CD_MTEXPOLY */
|
/* CD_MTEXPOLY */
|
||||||
BM_data_layer_add_named(em->bm, &em->bm->pdata, CD_MTEXPOLY, name);
|
BM_data_layer_add_named(em->bm, &em->bm->pdata, CD_MTEXPOLY, name);
|
||||||
/* copy data from active UV */
|
/* copy data from active UV */
|
||||||
if (layernum) {
|
if (layernum_dst) {
|
||||||
const int layernum_dst = CustomData_get_active_layer(&em->bm->pdata, CD_MTEXPOLY);
|
const int layernum_src = CustomData_get_active_layer(&em->bm->pdata, CD_MTEXPOLY);
|
||||||
BM_data_layer_copy(em->bm, &em->bm->pdata, CD_MTEXPOLY, layernum, layernum_dst);
|
BM_data_layer_copy(em->bm, &em->bm->pdata, CD_MTEXPOLY, layernum_src, layernum_dst);
|
||||||
}
|
}
|
||||||
if (active_set || layernum == 0) {
|
if (active_set || layernum_dst == 0) {
|
||||||
CustomData_set_layer_active(&em->bm->pdata, CD_MTEXPOLY, layernum);
|
CustomData_set_layer_active(&em->bm->pdata, CD_MTEXPOLY, layernum_dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* CD_MLOOPUV */
|
/* CD_MLOOPUV */
|
||||||
BM_data_layer_add_named(em->bm, &em->bm->ldata, CD_MLOOPUV, name);
|
BM_data_layer_add_named(em->bm, &em->bm->ldata, CD_MLOOPUV, name);
|
||||||
/* copy data from active UV */
|
/* copy data from active UV */
|
||||||
if (layernum) {
|
if (layernum_dst) {
|
||||||
const int layernum_dst = CustomData_get_active_layer(&em->bm->ldata, CD_MLOOPUV);
|
const int layernum_src = CustomData_get_active_layer(&em->bm->ldata, CD_MLOOPUV);
|
||||||
BM_data_layer_copy(em->bm, &em->bm->ldata, CD_MLOOPUV, layernum, layernum_dst);
|
BM_data_layer_copy(em->bm, &em->bm->ldata, CD_MLOOPUV, layernum_src, layernum_dst);
|
||||||
|
|
||||||
is_init = TRUE;
|
is_init = TRUE;
|
||||||
}
|
}
|
||||||
if (active_set || layernum == 0) {
|
if (active_set || layernum_dst == 0) {
|
||||||
CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPUV, layernum);
|
CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPUV, layernum_dst);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
layernum = CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY);
|
layernum_dst = CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY);
|
||||||
if (layernum >= MAX_MTFACE)
|
if (layernum_dst >= MAX_MTFACE)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (me->mtpoly) {
|
if (me->mtpoly) {
|
||||||
@ -361,11 +361,11 @@ int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_s
|
|||||||
CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_DEFAULT, NULL, me->totface, name);
|
CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_DEFAULT, NULL, me->totface, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (active_set || layernum == 0) {
|
if (active_set || layernum_dst == 0) {
|
||||||
CustomData_set_layer_active(&me->pdata, CD_MTEXPOLY, layernum);
|
CustomData_set_layer_active(&me->pdata, CD_MTEXPOLY, layernum_dst);
|
||||||
CustomData_set_layer_active(&me->ldata, CD_MLOOPUV, layernum);
|
CustomData_set_layer_active(&me->ldata, CD_MLOOPUV, layernum_dst);
|
||||||
|
|
||||||
CustomData_set_layer_active(&me->fdata, CD_MTFACE, layernum);
|
CustomData_set_layer_active(&me->fdata, CD_MTFACE, layernum_dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
mesh_update_customdata_pointers(me, TRUE);
|
mesh_update_customdata_pointers(me, TRUE);
|
||||||
@ -373,13 +373,13 @@ int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_s
|
|||||||
|
|
||||||
/* don't overwrite our copied coords */
|
/* don't overwrite our copied coords */
|
||||||
if (is_init == FALSE) {
|
if (is_init == FALSE) {
|
||||||
ED_mesh_uv_loop_reset_ex(C, me, layernum);
|
ED_mesh_uv_loop_reset_ex(C, me, layernum_dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
DAG_id_tag_update(&me->id, 0);
|
DAG_id_tag_update(&me->id, 0);
|
||||||
WM_event_add_notifier(C, NC_GEOM | ND_DATA, me);
|
WM_event_add_notifier(C, NC_GEOM | ND_DATA, me);
|
||||||
|
|
||||||
return layernum;
|
return layernum_dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me)
|
int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me)
|
||||||
|
@ -271,13 +271,16 @@ static PyObject *bpy_bmlayeritem_copy_from(BPy_BMLayerItem *self, BPy_BMLayerIte
|
|||||||
}
|
}
|
||||||
|
|
||||||
else if ((self->htype != value->htype) ||
|
else if ((self->htype != value->htype) ||
|
||||||
(self->type != value->type) ||
|
(self->type != value->type))
|
||||||
(self->index != value->index))
|
|
||||||
{
|
{
|
||||||
PyErr_SetString(PyExc_ValueError,
|
PyErr_SetString(PyExc_ValueError,
|
||||||
"layer.copy_from(other): layer type mismatch");
|
"layer.copy_from(other): layer type mismatch");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (self->index == value->index) {
|
||||||
|
Py_RETURN_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
data = bpy_bm_customdata_get(self->bm, self->htype);
|
data = bpy_bm_customdata_get(self->bm, self->htype);
|
||||||
|
|
||||||
if ((bpy_bmlayeritem_get(self) == NULL) ||
|
if ((bpy_bmlayeritem_get(self) == NULL) ||
|
||||||
|
Loading…
Reference in New Issue
Block a user