Revision: 58889
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58889
Author:   walid
Date:     2013-08-04 03:26:38 +0000 (Sun, 04 Aug 2013)
Log Message:
-----------
UV transfer Operator: Managing UV layers for transfer and fixing 
initializations related to Multiple layers transfer

Modified Paths:
--------------
    
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

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-08-04 03:02:35 UTC (rev 58888)
+++ 
branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c
        2013-08-04 03:26:38 UTC (rev 58889)
@@ -1339,7 +1339,7 @@
 
 bool BM_mesh_uv_copy2(BMesh *bm_src, BMesh *bm_dst, float UNUSED(tolerance), 
float UNUSED(radius_interp),
                             int UNUSED(dist_pow), int UNUSED(no_pow), bool 
UNUSED(USE_NORMALS),
-                            ST_ShapekeyGroupMode replace_mode, int 
*act_shapekey_lay, float tmp_mat[4][4])
+                            ReplaceGroupMode replace_mode, int 
*UNUSED(act_shapekey_lay), float tmp_mat[4][4])
 {
        //-----uv dependent variables
        BMLoop *l, *l2;                                         //used for 
iterating the destination's loops
@@ -1606,7 +1606,7 @@
        }
 
        tmp_weight = MEM_mallocN(sizeof(*tmp_weight) * exp_vert_per_face, 
"tmp_weight bmesh_data_transfer.c");
-       if (replace_mode == ST_APPEND_SHAPEKEY_GROUPS) {
+       if (replace_mode == APPEND_GROUPS) {
                //add 1 to skip the basis
                src_lay_start = 0;
                src_lay_end = tot_layer_src;
@@ -1614,19 +1614,18 @@
                dst_lay_end = tot_layer_dst;
        }
 
-       else if ((replace_mode == ST_REPLACE_ENOUGH_SHAPEKEY_GROUPS) || 
(replace_mode == ST_REPLACE_ALL_SHAPEKEY_GROUPS)) {
+       else if ((replace_mode == REPLACE_ENOUGH_GROUPS) || (replace_mode == 
REPLACE_ALL_GROUPS)) {
                src_lay_start = 0;
                src_lay_end = tot_layer_src;
                dst_lay_start = 0;
                dst_lay_end = tot_layer_src;
        }
 
-       else if (replace_mode == ST_REPLACE_ACTIVE_SHAPEKEY_GROUP) {
-               //passed shapekey reperesents the # of shapekeys (starts from 
one), however lay_start uses it as an index
-               src_lay_start = act_shapekey_lay[0] - 1;
-               src_lay_end = act_shapekey_lay[0];
-               dst_lay_start = act_shapekey_lay[1] - 1;
-               dst_lay_end = act_shapekey_lay[1];
+       else if (replace_mode == REPLACE_ACTIVE_GROUP) {
+               src_lay_start = 
CustomData_get_active_layer_index(&bm_src->ldata, CD_MLOOPUV);
+               src_lay_end = src_lay_start + 1;        //stopping condition
+               dst_lay_start = 
CustomData_get_active_layer_index(&bm_dst->ldata, CD_MLOOPUV);
+               dst_lay_end = dst_lay_start + 1;
        }
 
        for (src_lay_iter = src_lay_start, dst_lay_iter = dst_lay_start; 
src_lay_iter < src_lay_end;
@@ -1668,6 +1667,7 @@
                        if (fl_table[f_src->head.index].f == NULL) {    //if 
the face source reperesnts a new entry
                                f_src_table[f_src_count] = f_src;
                                f_src_count++;
+                               fl_table[f_src->head.index].count = 0;  //this 
init to take into account coming from another layer
 
                                if (f_dst->len > exp_dst_loops_per_src_face)
                                {
@@ -1684,7 +1684,7 @@
                        }
 
                        fl_table[f_src->head.index].f = f_src;
-                       fl_table[f_src->head.index].count += f_dst->len;        
//we need count to be init with zero (calloc) in adv
+                       fl_table[f_src->head.index].count += f_dst->len;
 
                        //get a coordinate list of the f verts
                        BM_ITER_ELEM_INDEX (v2, &iter2, f_src, 
BM_VERTS_OF_FACE, v_src_count) {
@@ -1861,9 +1861,14 @@
                        //copy the value to each of them
                        for (i = 0; i < l_grp[h].count; i++) {
                                //commenting this would leave us with the 
output of interpolation for each face ^_^
-                               copy_v2_v2(BM_ELEM_CD_GET_VOID_P(l_grp[h].l[i], 
CD_dst),mid_uv);
+                               copy_v2_v2(BM_ELEM_CD_GET_VOID_P(l_grp[h].l[i], 
CD_dst), mid_uv);
                        }
                }
+
+               //reset the faces for the next addition to the fl_table
+               BM_ITER_MESH_INDEX (f_src, &iter, bm_src, BM_FACES_OF_MESH, b) {
+                       fl_table[b].f = NULL;
+               }
        }
 
        BM_ITER_MESH_INDEX (f_src, &iter, bm_src, BM_FACES_OF_MESH, b) {

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-08-04 03:02:35 UTC (rev 58888)
+++ 
branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.h
        2013-08-04 03:26:38 UTC (rev 58889)
@@ -34,6 +34,13 @@
        ST_APPEND_SHAPEKEY_GROUPS = 4
 } ST_ShapekeyGroupMode;
 
+typedef enum ReplaceGroupMode {
+       REPLACE_ACTIVE_GROUP = 1,
+       REPLACE_ENOUGH_GROUPS = 2,
+       REPLACE_ALL_GROUPS = 3,
+       APPEND_GROUPS = 4
+} ReplaceGroupMode;
+
 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_edge_has_consistant_loops(BMEdge *e, int CD_offset);
@@ -44,7 +51,7 @@
 
 bool BM_mesh_uv_copy2(BMesh *bm_src, BMesh *bm_dst, float UNUSED(tolerance), 
float UNUSED(radius_interp),
                             int UNUSED(dist_pow), int UNUSED(no_pow), bool 
UNUSED(USE_NORMALS),
-                            ST_ShapekeyGroupMode replace_mode, int 
*act_shapekey_lay, float tmp_mat[4][4]);
+                            ReplaceGroupMode replace_mode, int 
*UNUSED_act_shapekey_lay, float tmp_mat[4][4]);
 
 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,

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-08-04 03:02:35 UTC (rev 58888)
+++ branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_data.c 
2013-08-04 03:26:38 UTC (rev 58889)
@@ -466,19 +466,31 @@
        }
 }
 
-typedef enum UT_UVTransferMode {
-       UT_USE_NEAREST_VERTEX = 1,
-       UT_USE_NEAREST_FACE = 2
-} UT_UVTransferMode;
+typedef enum TransferMode {
+       SPATIAL_TRANSFER = 1,
+       PROJECTION_TRANSFER = 2
+} TransferMode;
 
-static EnumPropertyItem UT_transfer_mode_item[] = {
-    {UT_USE_NEAREST_VERTEX,
-        "UT_USE_NEAREST_VERTEX", 0, "Nearest vertex", "Copy from the nearest 
vertices"},
-    {UT_USE_NEAREST_FACE,
-        "UT_USE_NEAREST_FACE", 0, "Nearest face", "Copy from the nearest 
face"},
+static EnumPropertyItem transfer_mode_item[] = {
+    {SPATIAL_TRANSFER,
+        "SPATIAL_TRANSFER", 0, "Spatial transfer", "Copy by analyzing the 
spatial relations"},
+    {PROJECTION_TRANSFER,
+        "PROJECTION_TRANSFER", 0, "Projection transfer", "Copy by projecting 
the desitnation onto the source"},
     {0, NULL, 0, NULL, NULL}
 };
 
+static EnumPropertyItem replace_mode_item[] = {
+    {REPLACE_ACTIVE_GROUP,
+        "REPLACE_ACTIVE_GROUP", 0, "Active", "Overwrite active group only"},
+    {REPLACE_ENOUGH_GROUPS,
+        "REPLACE_ENOUGH_GROUPS", 0, "Enough", "Overwrite source groups only as 
needed"},
+    {REPLACE_ALL_GROUPS,
+        "REPLACE_ALL_GROUPS", 0, "All", "Overwrite all groups"},
+    {APPEND_GROUPS,
+        "APPEND_GROUPS", 0, "Append", "Add groups without overwriting"},
+       {0, NULL, 0, NULL, NULL}
+};
+
 static bool ED_mesh_uv_transfer(Object *ob_dst, Object *ob_src, bContext 
*UNUSED(C), Scene *UNUSED(scene), wmOperator * op)
 {
        Mesh *me_dst, *me_src;
@@ -489,7 +501,8 @@
        int interp_pow = RNA_int_get(op->ptr, "interp_power");
        bool interp_normals = RNA_boolean_get(op->ptr, "interp_normals");
        int no_pow = RNA_int_get(op->ptr, "normals_power");
-       UT_UVTransferMode transfer_mode = RNA_enum_get(op->ptr, 
"transfer_mode");
+       ReplaceGroupMode replace_mode = RNA_enum_get(op->ptr, "replace_mode");
+       TransferMode transfer_mode = RNA_enum_get(op->ptr, "transfer_mode");
 
        int num_src_lay, num_dst_lay;
 
@@ -497,6 +510,10 @@
 
        float tmp_mat[4][4];
 
+       int CD_src;
+       int active_dst, active_src;
+       char *src_name;
+
        invert_m4_m4(ob_src->imat, ob_src->obmat);
        mul_m4_m4m4(tmp_mat, ob_src->imat, ob_dst->obmat);
 
@@ -509,15 +526,87 @@
 
        if (num_src_lay < 1) {
                //the source should have UV layers
+               BKE_report(op->reports, RPT_ERROR,
+                          "Transfer failed no UV groups were found (source 
mesh should have -at least- UV group)");
+
                return false;
        }
 
-       //adding enough layers
-       for(i = 0; i < (num_src_lay - num_dst_lay); i++)
+       if (replace_mode == REPLACE_ENOUGH_GROUPS) {
+
+               //add layers as needed
+               i = num_src_lay - num_dst_lay;
+               while (i > 0) {
+                       ED_mesh_uv_texture_add(me_dst, NULL, true);
+                       i--;
+               }
+               CD_src = CustomData_get_layer_index(&me_src->pdata, 
CD_MTEXPOLY);
+               //copy the names
+               for (i = 0; i < num_src_lay; ++i) {
+
+                       src_name = me_src->pdata.layers[CD_src + i].name;
+                       CustomData_set_layer_name(&me_dst->ldata, CD_MLOOPUV, 
i, src_name);
+                       CustomData_set_layer_name(&me_dst->pdata, CD_MTEXPOLY, 
i, src_name);
+//                     CustomData_set_layer_name(&me_dst->fdata, CD_MFACE, i, 
src_name);       //could that be of any need?
+               }
+       }
+
+       //we'll tell the copy function to start copying from # of source layers 
from the end of the dst layers
+       else if (replace_mode == APPEND_GROUPS)
        {
-               ED_mesh_uv_texture_add(me_dst, NULL, true);
+               CD_src = CustomData_get_layer_index(&me_src->pdata, 
CD_MTEXPOLY);
+               for (i = 0; i < num_src_lay; ++i) {
+
+                       src_name = me_src->pdata.layers[CD_src + i].name;
+                       //append uv layer with the src names
+                       ED_mesh_uv_texture_add(me_dst, src_name, true);
+               }
        }
 
+       else if (replace_mode == REPLACE_ALL_GROUPS)
+       {
+               i = num_dst_lay;
+               while (i > 0) {
+                       i--;
+                       ED_mesh_uv_texture_remove_index(me_dst, i);
+               }
+
+               CD_src = CustomData_get_layer_index(&me_src->pdata, 
CD_MTEXPOLY);
+               for (i = 0; i < num_src_lay; ++i) {
+                       src_name = me_src->pdata.layers[CD_src + i].name;
+                       //add uv layer with the src name
+                       ED_mesh_uv_texture_add(me_dst, src_name, true);
+               }
+       }
+
+       else if (replace_mode == REPLACE_ACTIVE_GROUP) {
+
+               //find the source active layer
+               active_src = CustomData_get_active_layer_index(&me_src->ldata, 
CD_MLOOPUV);
+               active_dst = CustomData_get_active_layer_index(&me_dst->ldata, 
CD_MLOOPUV);
+
+               CD_src = CustomData_get_layer_index(&me_src->pdata, 
CD_MTEXPOLY);
+
+               if (num_src_lay == 0) { //empty destination
+                       src_name = me_src->pdata.layers[CD_src + 
active_src].name;
+
+                       //add uv layer with the src name
+                       ED_mesh_uv_texture_add(me_dst, src_name, true);
+
+                       //make the added layer the active one
+                       ///what about the MTEXPOLY
+                       CustomData_set_layer_active(&me_dst->ldata, CD_MLOOPUV, 
0);
+               }
+
+               else {  //destination has layers (accordingly there's a 
selected layer)
+
+                       src_name = me_src->pdata.layers[CD_src + 
active_src].name;
+
+                       CustomData_set_layer_name(&me_dst->ldata, CD_MLOOPUV, 
active_dst, src_name);

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to