[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