[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45155] trunk/blender/source/blender/ editors/mesh/mesh_data.c: fix [#30658] existing uv mesh coordinates not copied to new created uv map
Campbell Barton
ideasman42 at gmail.com
Mon Mar 26 07:28:09 CEST 2012
Revision: 45155
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45155
Author: campbellbarton
Date: 2012-03-26 05:28:00 +0000 (Mon, 26 Mar 2012)
Log Message:
-----------
fix [#30658] existing uv mesh coordinates not copied to new created uv map
Modified Paths:
--------------
trunk/blender/source/blender/editors/mesh/mesh_data.c
Modified: trunk/blender/source/blender/editors/mesh/mesh_data.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_data.c 2012-03-26 04:32:04 UTC (rev 45154)
+++ trunk/blender/source/blender/editors/mesh/mesh_data.c 2012-03-26 05:28:00 UTC (rev 45155)
@@ -189,23 +189,42 @@
}
}
-static void copy_editface_active_customdata(BMEditMesh *em, int type, int index)
+/* copies from active to 'index' */
+static void editmesh_face_copy_customdata(BMEditMesh *em, int type, int index)
{
-#if 1 /*BMESH_TODO*/
- (void)em;
- (void)type;
- (void)index;
-#else
- EditFace *efa;
- int n = CustomData_get_active_layer(&em->fdata, type);
+ BMesh *bm = em->bm;
+ CustomData *pdata = &bm->pdata;
+ BMIter iter;
+ BMFace *efa;
+ const int n = CustomData_get_active_layer(pdata, type);
- for (efa = em->faces.first; efa; efa = efa->next) {
- void *data = CustomData_em_get_n(&em->fdata, efa->data, type, n);
- CustomData_em_set_n(&em->fdata, efa->data, type, index, data);
+ /* ensure all current elements follow new customdata layout */
+ BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ void *data = CustomData_bmesh_get_n(pdata, efa->head.data, type, n);
+ CustomData_bmesh_set_n(pdata, efa->head.data, type, index, data);
}
-#endif
}
+/* copies from active to 'index' */
+static void editmesh_loop_copy_customdata(BMEditMesh *em, int type, int index)
+{
+ BMesh *bm = em->bm;
+ CustomData *ldata = &bm->ldata;
+ BMIter iter;
+ BMIter liter;
+ BMFace *efa;
+ BMLoop *loop;
+ const int n = CustomData_get_active_layer(ldata, type);
+
+ /* ensure all current elements follow new customdata layout */
+ BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER(loop, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ void *data = CustomData_bmesh_get_n(ldata, loop->head.data, type, n);
+ CustomData_bmesh_set_n(ldata, loop->head.data, type, index, data);
+ }
+ }
+}
+
int ED_mesh_uv_loop_reset_ex(struct bContext *C, struct Mesh *me, const int layernum)
{
BMEditMesh *em = me->edit_btmesh;
@@ -322,11 +341,14 @@
return ED_mesh_uv_loop_reset_ex(C, me, layernum);
}
+/* note: keep in sync with ED_mesh_color_add */
int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_set)
{
BMEditMesh *em;
int layernum;
+ short is_init = FALSE;
+
if (me->edit_btmesh) {
em = me->edit_btmesh;
@@ -334,22 +356,23 @@
if (layernum >= MAX_MTFACE)
return -1;
- BM_data_layer_add(em->bm, &em->bm->pdata, CD_MTEXPOLY);
- CustomData_set_layer_active(&em->bm->pdata, CD_MTEXPOLY, layernum);
- CustomData_set_layer_name(&em->bm->pdata, CD_MTEXPOLY, layernum, name);
-
+ /* CD_MTEXPOLY */
+ BM_data_layer_add_named(em->bm, &em->bm->pdata, CD_MTEXPOLY, name);
/* copy data from active UV */
- if (layernum)
- copy_editface_active_customdata(em, CD_MTFACE, layernum);
-
+ if (layernum) {
+ editmesh_face_copy_customdata(em, CD_MTEXPOLY, layernum);
+ }
if (active_set || layernum == 0) {
CustomData_set_layer_active(&em->bm->pdata, CD_MTEXPOLY, layernum);
}
- BM_data_layer_add(em->bm, &em->bm->ldata, CD_MLOOPUV);
- CustomData_set_layer_name(&em->bm->ldata, CD_MLOOPUV, layernum, name);
-
- CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPUV, layernum);
+ /* CD_MLOOPUV */
+ BM_data_layer_add_named(em->bm, &em->bm->ldata, CD_MLOOPUV, name);
+ /* copy data from active UV */
+ if (layernum) {
+ editmesh_loop_copy_customdata(em, CD_MLOOPUV, layernum);
+ is_init = TRUE;
+ }
if (active_set || layernum == 0) {
CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPUV, layernum);
}
@@ -380,7 +403,10 @@
mesh_update_customdata_pointers(me, TRUE);
}
- ED_mesh_uv_loop_reset_ex(C, me, layernum);
+ /* don't overwrite our copied coords */
+ if (is_init == FALSE) {
+ ED_mesh_uv_loop_reset_ex(C, me, layernum);
+ }
DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM | ND_DATA, me);
@@ -412,6 +438,7 @@
return 1;
}
+/* note: keep in sync with ED_mesh_uv_texture_add */
int ED_mesh_color_add(bContext *C, Scene *UNUSED(scene), Object *UNUSED(ob), Mesh *me, const char *name, int active_set)
{
BMEditMesh *em;
@@ -425,14 +452,12 @@
return -1;
}
- BM_data_layer_add(em->bm, &em->bm->ldata, CD_MLOOPCOL);
- CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPCOL, layernum);
-
+ /* CD_MLOOPCOL */
+ BM_data_layer_add_named(em->bm, &em->bm->ldata, CD_MLOOPCOL, name);
/* copy data from active vertex color layer */
if (layernum) {
- copy_editface_active_customdata(em, CD_MLOOPCOL, layernum);
+ editmesh_loop_copy_customdata(em, CD_MLOOPCOL, layernum);
}
-
if (active_set || layernum == 0) {
CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPCOL, layernum);
}
More information about the Bf-blender-cvs
mailing list