[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58325] branches/ soc-2013-meshdata_transfer: Adding UV Transfer between identical meshes

Walid Shouman eng.walidshouman at gmail.com
Wed Jul 17 04:19:20 CEST 2013


Revision: 58325
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58325
Author:   walid
Date:     2013-07-17 02:19:18 +0000 (Wed, 17 Jul 2013)
Log Message:
-----------
Adding UV Transfer between identical meshes

Modified Paths:
--------------
    branches/soc-2013-meshdata_transfer/release/scripts/startup/bl_ui/space_view3d_toolbar.py
    branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c
    branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.h
    branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_data.c
    branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_intern.h
    branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_ops.c

Modified: branches/soc-2013-meshdata_transfer/release/scripts/startup/bl_ui/space_view3d_toolbar.py
===================================================================
--- branches/soc-2013-meshdata_transfer/release/scripts/startup/bl_ui/space_view3d_toolbar.py	2013-07-17 01:40:26 UTC (rev 58324)
+++ branches/soc-2013-meshdata_transfer/release/scripts/startup/bl_ui/space_view3d_toolbar.py	2013-07-17 02:19:18 UTC (rev 58325)
@@ -115,6 +115,7 @@
         col = layout.column(align=True)
 
         col.operator("object.shape_key_transfer_new", text="Transfer Shapekeys (new)")
+        col.operator("mesh.uv_transfer_new", text="Transfer UVs (new)")
 
 
 class VIEW3D_PT_tools_rigidbody(View3DPanel, Panel):

Modified: branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c
===================================================================
--- branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c	2013-07-17 01:40:26 UTC (rev 58324)
+++ branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c	2013-07-17 02:19:18 UTC (rev 58325)
@@ -30,6 +30,66 @@
 
 bool print_shapekeys_info(BMesh *bm, int type, bool type_info, bool layer_info, int mode);
 
+bool BM_mesh_uv_copy(BMesh *bm_src,BMesh *bm_dst, float UNUSED(tolerance))
+{
+
+	int CD_offset_src, CD_offset_dst;
+
+	//used for iterating the destination's loops
+	BMLoop *l;
+	MLoopUV *luv;
+	//used to iterate the destination's faces
+	BMFace *f;
+	//iter => face iterator, liter => loop iterator
+	BMIter iter, liter;
+	int tot_layer_src;//tot_layer_dst;
+	int lay_iter;
+
+	//shall be used within interpolation
+	//struct BMBVHTree *bmtree = NULL;
+	//BMEditMesh *em_src;
+
+	BMFace *f_src; BMIter iter2;
+	BMLoop *l_src; BMIter liter_src;
+	MLoopUV *luv_src;
+
+	//this part shall be used later within interpolation
+	//Is that good to support edit mesh mode at the cost of receiving me_src too ?
+	//if (me_src->edit_btmesh != NULL) em_src = me_src->edit_btmesh;	//edit mesh mode
+	//else
+	//em_src = BKE_editmesh_create(bm_src, true);	//create editmesh data from bm WITH tess.
+													//if it was false ... data other than
+													//em->bm won't be copied
+
+	tot_layer_src = CustomData_number_of_layers(&bm_src->ldata, CD_MLOOPUV);
+
+	//lay_iter over all the layers
+	for(lay_iter = 0; lay_iter < tot_layer_src; lay_iter++){
+		//fix the layer index of the source & dest
+		CD_offset_src = CustomData_get_n_offset(&bm_src->ldata, CD_MLOOPUV,lay_iter);	//get the offset of the
+		CD_offset_dst = CustomData_get_n_offset(&bm_dst->ldata, CD_MLOOPUV,lay_iter);	//lay_iter(th)CD_MLOOPUV layer
+
+		//shall be used within interpolation
+//		for (v = BM_iter_new(&iter, bm_dst, BM_VERTS_OF_MESH, NULL); v; v = BM_iter_step(&iter)){
+
+		for (f = BM_iter_new(&iter, bm_dst, BM_FACES_OF_MESH, NULL),
+		     f_src = BM_iter_new(&iter2, bm_src, BM_FACES_OF_MESH, NULL);
+		     f; f = BM_iter_step(&iter), f_src = BM_iter_step(&iter2))
+		{
+			for (l = BM_iter_new(&liter, NULL, BM_LOOPS_OF_FACE, f),
+			     l_src = BM_iter_new(&liter_src, NULL, BM_LOOPS_OF_FACE, f_src);
+			     l; l = BM_iter_step(&liter), l_src = BM_iter_step(&liter_src))
+			{
+				luv_src = BM_ELEM_CD_GET_VOID_P(l_src,CD_offset_src);
+				luv = BM_ELEM_CD_GET_VOID_P(l,CD_offset_dst);
+
+				copy_v2_v2(luv->uv, luv_src->uv);
+			}
+		}
+	}
+	return true;
+}
+
 bool BKE_bmesh_calc_relative_deform(
 		const int v_count,
 

Modified: branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.h
===================================================================
--- branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.h	2013-07-17 01:40:26 UTC (rev 58324)
+++ branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.h	2013-07-17 02:19:18 UTC (rev 58325)
@@ -37,6 +37,8 @@
 bool BKE_bmesh_calc_relative_deform(const int v_count, const float (*vert_cos_src)[], const float (*vert_cos_dst)[],
 									const float (*vert_cos_org)[],	float (*vert_cos_new)[]);
 
+bool BM_mesh_uv_copy(BMesh *bm_src,BMesh *bm_dst, float UNUSED(tolerance));
+
 bool BM_mesh_shapekey_copy(BMesh *bm_src, BMesh *bm_dst, float tolerance, float radius_interp,
                            int interp_pow, int no_pow, bool USE_NORMALS, ST_ShapekeyGroupMode replace_mode,
                            int *act_shapekey_lay);

Modified: branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_data.c
===================================================================
--- branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_data.c	2013-07-17 01:40:26 UTC (rev 58324)
+++ branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_data.c	2013-07-17 02:19:18 UTC (rev 58325)
@@ -40,6 +40,7 @@
 #include "BLI_path_util.h"
 #include "BLI_array.h"
 #include "BLI_math.h"
+#include "BLI_blenlib.h"
 
 #include "BKE_context.h"
 #include "BKE_depsgraph.h"
@@ -465,6 +466,58 @@
 	}
 }
 
+static bool ED_mesh_uv_transfer(Object *ob_dst, Object *ob_src, bContext *UNUSED(C), Scene *UNUSED(scene), wmOperator * UNUSED(op))
+{
+	Mesh *me_dst, *me_src;
+	BMesh *bm_dst, *bm_src;
+
+	float tolerance = 1.1;	//stub
+
+	int num_src_lay, num_dst_lay;
+
+	int i;
+
+	me_dst = ob_dst->data;
+	me_src = ob_src->data;
+
+	//manipulating the layers first as its interface uses the Mesh structure not the BMesh
+	num_src_lay = CustomData_number_of_layers(&me_src->ldata, CD_MLOOPUV);
+	num_dst_lay = CustomData_number_of_layers(&me_dst->ldata, CD_MLOOPUV);
+
+	if (num_src_lay < 1) {
+		//the source should have UV layers
+		return false;
+	}
+
+	//adding enough layers
+	for(i = 0; i < (num_src_lay - num_dst_lay); i++)
+	{
+		ED_mesh_uv_texture_add(me_dst, NULL, true);
+	}
+
+	//allocate space
+	bm_src = BM_mesh_create(&bm_mesh_allocsize_default);
+	bm_dst = BM_mesh_create(&bm_mesh_allocsize_default);
+
+	BM_mesh_bm_from_me(bm_src, me_src, TRUE, true, ob_src->shapenr);	//TRUE -> should transfer shapekeys too!!
+	BM_mesh_bm_from_me(bm_dst, me_dst, TRUE, true, ob_dst->shapenr);
+
+	if (!BM_mesh_uv_copy(bm_src, bm_dst, tolerance)) {
+		return false;
+	}
+
+	//transfer the BMesh back to Mesh
+	BM_mesh_bm_to_me(bm_src, me_src, FALSE);
+	BM_mesh_bm_to_me(bm_dst, me_dst, TRUE);
+
+	//free the BMesh
+	BM_mesh_free(bm_src);
+	BM_mesh_free(bm_dst);
+
+	return true;
+
+}
+
 /* note: keep in sync with ED_mesh_uv_texture_add */
 int ED_mesh_color_add(Mesh *me, const char *name, const bool active_set)
 {
@@ -715,6 +768,60 @@
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
 
+static int uv_transfer_exec(bContext *C, wmOperator * op)
+{
+	Scene *scene = CTX_data_scene(C);
+	Object *ob_act = CTX_data_active_object(C);
+	int fail = 0;
+
+	/* Macro to loop through selected objects.*/
+	CTX_DATA_BEGIN (C, Object *, ob_slc, selected_editable_objects)
+	{
+		//if the selected isn't the active object
+		if (ob_act != ob_slc) {
+
+			if (!ED_mesh_uv_transfer(ob_act, ob_slc, C, scene, op)) {
+				fail++;
+			}
+		}
+	}
+
+	////ported from transfer weights
+	/* Event notifiers for correct display of data.*/
+	DAG_id_tag_update(&ob_slc->id, OB_RECALC_DATA);
+	WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob_slc);
+	WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob_slc->data);
+
+	CTX_DATA_END;
+
+	if (fail != 0) {
+		return OPERATOR_CANCELLED;
+	}
+	else {
+		return OPERATOR_FINISHED;
+	}
+}
+
+void MESH_OT_uv_transfer_new(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Transfer UV (new)";
+	ot->idname = "MESH_OT_uv_transfer_new";
+	ot->description = "Transfer UV maps to the selected objects";
+
+	/* api callbacks */
+	ot->poll = layers_poll;			//don't know how to edit this yet!!
+	ot->exec = uv_transfer_exec;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;	//not revised!!
+
+	/* properties */
+	RNA_def_float(ot->srna, "tolerance", 0.01f, 0.001f, 10.0f,
+	              "Tolerance", "Radius of source vertices to inherit from", 0.001f, 5.0f);
+
+}
+
 /*********************** vertex color operators ************************/
 
 static int mesh_vertex_color_add_exec(bContext *C, wmOperator *UNUSED(op))

Modified: branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_intern.h
===================================================================
--- branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_intern.h	2013-07-17 01:40:26 UTC (rev 58324)
+++ branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_intern.h	2013-07-17 02:19:18 UTC (rev 58325)
@@ -217,6 +217,7 @@
 /* *** mesh_data.c *** */
 void MESH_OT_uv_texture_add(struct wmOperatorType *ot);
 void MESH_OT_uv_texture_remove(struct wmOperatorType *ot);
+void MESH_OT_uv_transfer_new(struct wmOperatorType *ot);
 void MESH_OT_vertex_color_add(struct wmOperatorType *ot);
 void MESH_OT_vertex_color_remove(struct wmOperatorType *ot);
 /* no create_mask yet */

Modified: branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_ops.c
===================================================================
--- branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_ops.c	2013-07-17 01:40:26 UTC (rev 58324)
+++ branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_ops.c	2013-07-17 02:19:18 UTC (rev 58325)
@@ -143,6 +143,7 @@
 	
 	WM_operatortype_append(MESH_OT_uv_texture_add);
 	WM_operatortype_append(MESH_OT_uv_texture_remove);
+	WM_operatortype_append(MESH_OT_uv_transfer_new);
 	WM_operatortype_append(MESH_OT_vertex_color_add);
 	WM_operatortype_append(MESH_OT_vertex_color_remove);
 	WM_operatortype_append(MESH_OT_customdata_clear_mask);




More information about the Bf-blender-cvs mailing list