[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