Revision: 48047
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48047
Author:   cyborgmuppet
Date:     2012-06-18 17:11:53 +0000 (Mon, 18 Jun 2012)
Log Message:
-----------
Changed naming of "option" to "mode".
No longer using defvert_verify_index() but defvert_find_index().
Changing function created error wehn not found. Must be adressed.  

Modified Paths:
--------------
    branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c

Modified: 
branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c
===================================================================
--- branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c    
2012-06-18 17:07:26 UTC (rev 48046)
+++ branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c    
2012-06-18 17:11:53 UTC (rev 48047)
@@ -377,31 +377,31 @@
 
 /***********************Start transfer weight*********************************/
 
-typedef enum VertexGroupOption {
+typedef enum VertexGroupMode {
        REPLACE_ACTIVE_VERTEX_GROUP = 1,
        REPLACE_ALL_VERTEX_GROUPS = 2
-} VertexGroupOption;
+} VertexGroupMode;
 
-typedef enum MethodOption {
+typedef enum MethodMode {
        BY_INDEX = 1,
        BY_NEAREST_VERTEX = 2,
        BY_NEAREST_FACE = 3,
        BY_NEAREST_VERTEX_IN_FACE = 4
-} MethodOption;
+} MethodMode;
 
-typedef enum ReplaceOption {
+typedef enum ReplaceMode {
        REPLACE_ALL_WEIGHTS = 1,
        REPLACE_EMPTY_WEIGHTS = 2,
        REPLACE_SELECTED_WEIGHTS = 3
-} ReplaceOption;
+} ReplaceMode;
 
-static EnumPropertyItem vertex_group_option_item[] = {
+static EnumPropertyItem vertex_group_mode_item[] = {
        {REPLACE_ACTIVE_VERTEX_GROUP, "REPLACE_ACTIVE_VERTEX_GROUP", 1, 
"Active", "Transfer active vertex group from selected to active mesh."},
        {REPLACE_ALL_VERTEX_GROUPS, "REPLACE_ALL_VERTEX_GROUPS", 1, "All", 
"Transfer all vertex groups from selected to active mesh."},
        {0, NULL, 0, NULL, NULL}
 };
 
-static EnumPropertyItem method_option_item[] = {
+static EnumPropertyItem method_mode_item[] = {
        {BY_INDEX, "BY_INDEX", 1, "Vertex index", "Copy for identical meshes."},
        {BY_NEAREST_VERTEX, "BY_NEAREST_VERTEX", 1, "Nearest vertex", "Copy 
weight from closest vertex."},
        {BY_NEAREST_FACE, "BY_NEAREST_FACE", 1, "Nearest face", "Barycentric 
interpolation from nearest face."},
@@ -409,7 +409,7 @@
        {0, NULL, 0, NULL, NULL}
 };
 
-static EnumPropertyItem replace_option_item[] = {
+static EnumPropertyItem replace_mode_item[] = {
        {REPLACE_ALL_WEIGHTS, "REPLACE_ALL_WEIGHTS", 1, "All", "Overwrites all 
weights."},
        {REPLACE_EMPTY_WEIGHTS, "REPLACE_EMPTY_WEIGHTS", 1, "Empty", "Adds 
weights to vertices with no weight."},
        {REPLACE_SELECTED_WEIGHTS, "REPLACE_SELECTED_WEIGHTS", 1, "Selected", 
"Replace selected weights."},
@@ -417,9 +417,9 @@
 };
 
 /*copy weight*/
-void vgroup_transfer_weight(MVert *mv_dst, float *weight_dst, float 
weight_src, ReplaceOption replace_option)
+void vgroup_transfer_weight(MVert *mv_dst, float *weight_dst, float 
weight_src, ReplaceMode replace_mode)
 {
-       switch (replace_option) {
+       switch (replace_mode) {
 
                case REPLACE_ALL_WEIGHTS:
                        *weight_dst = weight_src;
@@ -435,7 +435,8 @@
        }
 }
 
-int ED_vgroup_transfer_weight(Object *ob_dst, Object *ob_src, bDeformGroup 
*dg_src, Scene *scene, MethodOption method_option, ReplaceOption replace_option)
+int ED_vgroup_transfer_weight(Object *ob_dst, Object *ob_src, bDeformGroup 
*dg_src, Scene *scene,
+                                                         MethodMode 
method_mode, ReplaceMode replace_mode)
 {
        bDeformGroup *dg_dst;
        Mesh *me_dst, *me_src;
@@ -450,7 +451,7 @@
        float weight, tmp_weight[4], tmp_co[3], normal[3], tmp_mat[4][4], 
dist_v1, dist_v2, dist_v3, dist_v4;
 
        /* create new and overwrite vertex group on destination without data */
-       if (!defgroup_find_name(ob_dst, dg_src->name) || replace_option == 
REPLACE_ALL_WEIGHTS) {
+       if (!defgroup_find_name(ob_dst, dg_src->name) || replace_mode == 
REPLACE_ALL_WEIGHTS) {
                ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, 
dg_src->name));
                ED_vgroup_add_name(ob_dst, dg_src->name);
        }
@@ -464,7 +465,10 @@
        me_src = ob_src->data;
 
        /* sanity check */
-       if (!me_src->dvert) return 0;
+       if (!me_src->dvert) {
+               /*todo fix!*/
+               return 0;
+       }
 
        /* create data in memory when nothing there */
        if (!me_dst->dvert) ED_vgroup_data_create(ob_dst->data);
@@ -485,7 +489,7 @@
        invert_m4_m4(ob_src->imat, ob_src->obmat);
        mult_m4_m4m4(tmp_mat, ob_src->imat, ob_dst->obmat);
 
-       switch (method_option) {
+       switch (method_mode) {
 
                case BY_INDEX:
                        /* check if indices are matching, delete and return if 
not */
@@ -496,6 +500,7 @@
                                if (dv_array_src) MEM_freeN(dv_array_src);
                                if (dv_array_dst) MEM_freeN(dv_array_dst);
                                dmesh_src->release(dmesh_src);
+                               /*todo: fix*/
                                return 0;
                        }
 
@@ -503,9 +508,9 @@
                        for(i = 0, dv_src = dv_array_src, dv_dst = 
dv_array_dst; i < me_dst->totvert; i++, dv_dst++, dv_src++, mv_src++) {
 
                                /* copy weight */
-                               dw_src = defvert_verify_index(*dv_src, 
index_src);
-                               dw_dst = defvert_verify_index(*dv_dst, 
index_dst);
-                               vgroup_transfer_weight(mv_dst, &dw_dst->weight, 
dw_src->weight, replace_option);
+                               dw_src = defvert_find_index(*dv_src, index_src);
+                               dw_dst = defvert_find_index(*dv_dst, index_dst);
+                               vgroup_transfer_weight(mv_dst, &dw_dst->weight, 
dw_src->weight, replace_mode);
                        }
                        break;
 
@@ -526,12 +531,18 @@
 
                                /* node tree accelerated search for closest 
vetex */
                                
BLI_bvhtree_find_nearest(tree_mesh_vertices_src.tree, tmp_co,
-                                                        &nearest, 
tree_mesh_vertices_src.nearest_callback, &tree_mesh_vertices_src);
+                                                                               
 &nearest, tree_mesh_vertices_src.nearest_callback, &tree_mesh_vertices_src);
 
                                /* copy weight */
-                               dw_src = 
defvert_verify_index(dv_array_src[nearest.index], index_src);
-                               dw_dst = defvert_verify_index(*dv_dst, 
index_dst);
-                               vgroup_transfer_weight(mv_dst, &dw_dst->weight, 
dw_src->weight, replace_option);
+                               /*
+                               ideasman42 2012/06/17 21:32:15
+                               this is very bad - this function will add a 
vertex weight if not found, thereby modifying the source which should never 
happen.
+use defvert_find_index() instead. You will need to do something sane when the 
vgroup is not found -
+it should not add any vgroups or act as if all vgroups are 0 weight.
+                               */
+                               dw_src = 
defvert_find_index(dv_array_src[nearest.index], index_src);
+                               dw_dst = defvert_find_index(*dv_dst, index_dst);
+                               vgroup_transfer_weight(mv_dst, &dw_dst->weight, 
dw_src->weight, replace_mode);
                        }
 
                        /* free memory */
@@ -559,33 +570,45 @@
 
                                /* node tree accelerated search for closest 
face */
                                
BLI_bvhtree_find_nearest(tree_mesh_faces_src.tree, tmp_co,
-                                                        &nearest, 
tree_mesh_faces_src.nearest_callback, &tree_mesh_faces_src);
+                                                                               
 &nearest, tree_mesh_faces_src.nearest_callback, &tree_mesh_faces_src);
                                index_nearest = nearest.index;
 
                                /* project onto face */
-                               normal_tri_v3(normal, 
mv_src[mface_src[nearest.index].v1].co,
-                                             
mv_src[mface_src[index_nearest].v2].co,
-                                             
mv_src[mface_src[index_nearest].v3].co);
+                               normal_tri_v3(normal,
+                                                         
mv_src[mface_src[nearest.index].v1].co,
+                                                         
mv_src[mface_src[index_nearest].v2].co,
+                                                         
mv_src[mface_src[index_nearest].v3].co);
 
                                project_v3_plane(tmp_co, normal, 
mv_src[mface_src[index_nearest].v1].co);
 
                                /* interpolate weights */
-                               interp_weights_face_v3(tmp_weight, 
mv_src[mface_src[index_nearest].v1].co,
-                                                      
mv_src[mface_src[index_nearest].v2].co,
-                                                      
mv_src[mface_src[index_nearest].v3].co,
-                                                      
mv_src[mface_src[index_nearest].v4].co, tmp_co);
+                               if (mface_src[index_nearest].v4) {
+                                       interp_weights_face_v3(tmp_weight,
+                                                                               
   mv_src[mface_src[index_nearest].v1].co,
+                                                                               
   mv_src[mface_src[index_nearest].v2].co,
+                                                                               
   mv_src[mface_src[index_nearest].v3].co,
+                                                                               
   mv_src[mface_src[index_nearest].v4].co, tmp_co);
+                               }
+                               else {
+                                       interp_weights_face_v3(tmp_weight,
+                                                                               
   mv_src[mface_src[index_nearest].v1].co,
+                                                                               
   mv_src[mface_src[index_nearest].v2].co,
+                                                                               
   mv_src[mface_src[index_nearest].v3].co, NULL, tmp_co);
+                               }
 
                                /* get weights */
-                               weight = tmp_weight[0] * 
defvert_verify_index(dv_array_src[mface_src[index_nearest].v1], 
index_src)->weight;
-                               weight += tmp_weight[1] * 
defvert_verify_index(dv_array_src[mface_src[index_nearest].v2], 
index_src)->weight;
-                               weight += tmp_weight[2] * 
defvert_verify_index(dv_array_src[mface_src[index_nearest].v3], 
index_src)->weight;
+                               /* ideasman42 2012/06/17 21:32:15*/
+                               /* you can loop over 3-4 items here, ratrher 
then inline all 4 calls. paint_vertex.c has examples of this. */
+                               weight = tmp_weight[0] * 
defvert_find_index(dv_array_src[mface_src[index_nearest].v1], 
index_src)->weight;
+                               weight += tmp_weight[1] * 
defvert_find_index(dv_array_src[mface_src[index_nearest].v2], 
index_src)->weight;
+                               weight += tmp_weight[2] * 
defvert_find_index(dv_array_src[mface_src[index_nearest].v3], 
index_src)->weight;
                                if (mface_src[index_nearest].v4 || 
mface_src[index_nearest].v4 == 0) {
-                                       weight += tmp_weight[3] * 
defvert_verify_index(dv_array_src[mface_src[index_nearest].v4], 
index_src)->weight;
+                                       weight += tmp_weight[3] * 
defvert_find_index(dv_array_src[mface_src[index_nearest].v4], 
index_src)->weight;
                                }
 
                                /* copy weight */
-                               dw_dst = defvert_verify_index(*dv_dst, 
index_dst);
-                               vgroup_transfer_weight(mv_dst, &dw_dst->weight, 
weight, replace_option);
+                               dw_dst = defvert_find_index(*dv_dst, index_dst);
+                               vgroup_transfer_weight(mv_dst, &dw_dst->weight, 
weight, replace_mode);
                        }
 
                        /* free memory */
@@ -613,7 +636,7 @@
 
                                /* node tree accelerated search for closest 
face */
                                
BLI_bvhtree_find_nearest(tree_mesh_faces_src.tree, tmp_co,
-                                                        &nearest, 
tree_mesh_faces_src.nearest_callback, &tree_mesh_faces_src);
+                                                                               
 &nearest, tree_mesh_faces_src.nearest_callback, &tree_mesh_faces_src);
                                index_nearest = nearest.index;
 
                                /* get distances */
@@ -633,9 +656,9 @@
                                }
 
                                /* copy weight */
-                               dw_src = 
defvert_verify_index(dv_array_src[index_nearest_vertex], index_src);
-                               dw_dst = defvert_verify_index(*dv_dst, 
index_dst);
-                               vgroup_transfer_weight(mv_dst, &dw_dst->weight, 
dw_src->weight, replace_option);
+                               dw_src = 
defvert_find_index(dv_array_src[index_nearest_vertex], index_src);
+                               dw_dst = defvert_find_index(*dv_dst, index_dst);
+                               vgroup_transfer_weight(mv_dst, &dw_dst->weight, 
dw_src->weight, replace_mode);
                        }
 
                        /* free memory */
@@ -3001,7 +3024,7 @@
        int change = 0;
        int fail = 0;
 
-       CTX_DATA_BEGIN(C, Object *, ob, selected_editable_objects)
+       CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
        {
                if (obact != ob) {
                        if (ED_vgroup_copy_array(ob, obact)) change++;
@@ -3040,24 +3063,24 @@

@@ 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