[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46984] branches/meshdata_transfer/source/ blender/editors/object/object_vgroup.c: Restructuring code.
Ove Murberg Henriksen
sorayasilvermoon at hotmail.com
Thu May 24 22:03:10 CEST 2012
Revision: 46984
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46984
Author: cyborgmuppet
Date: 2012-05-24 20:03:09 +0000 (Thu, 24 May 2012)
Log Message:
-----------
Restructuring code.
All functions merged into ED_vgroup_transfer_weight() to avoid duplicate code.
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-05-24 19:41:09 UTC (rev 46983)
+++ branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c 2012-05-24 20:03:09 UTC (rev 46984)
@@ -376,79 +376,34 @@
return 1;
}
-/********************** Start transfer weight functions *********************/
+/***********************Start transfer weight function************************/
-int ED_vgroup_transfer_weight_by_index(Object *ob_dst, Object *ob_src, short dw_replace_options, bDeformGroup *dg_src)
+int ED_vgroup_transfer_weight(
+ Object *ob_dst, Object *ob_src, bDeformGroup *dg_src, short replace_options, short method_options)
{
- MDeformVert **dv_array_src;
- MDeformVert **dv_array_dst;
- MDeformWeight *dw_dst, *dw_src;
- MVert *mv_dst;
- Mesh *me_dst;
- int dv_tot_src, dv_tot_dst;
- int i, index_src, index_dst;
bDeformGroup *dg_dst;
-
- enum dw_options {REPLACE_ALL_WEIGHTS = 1, REPLACE_EMPTY_WEIGHTS = 2, REPLACE_SELECTED_WEIGHTS = 3} dw_options = dw_replace_options;
-
- /*create new and overwrite vertex group on destination without data*/
- if (!defgroup_find_name(ob_dst, dg_src->name) || dw_options == 1){
- ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, dg_src->name));
- ED_vgroup_add_name(ob_dst, dg_src->name);
- }
-
- /*get meshes*/
- me_dst = ob_dst->data;
-
- /*get vertices*/
- mv_dst = me_dst->mvert;
-
- /*get destination deformgroup*/
- dg_dst = defgroup_find_name(ob_dst, dg_src->name);
-
- /*get vertex group arrays*/
- ED_vgroup_give_parray(ob_src->data, &dv_array_src, &dv_tot_src, FALSE);
- ED_vgroup_give_parray(ob_dst->data, &dv_array_dst, &dv_tot_dst, FALSE);
-
- /*get indexes of vertex groups*/
- index_src = BLI_findindex(&ob_src->defbase, dg_src);
- index_dst = BLI_findindex(&ob_dst->defbase, dg_dst);
-
- /*check if indices are matching, delete and return if not*/
- if (ob_dst == ob_src || dv_tot_dst == 0 || (dv_tot_dst != dv_tot_src) || dv_array_src == NULL || dv_array_dst == NULL) {
- ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, dg_dst->name));
- return 0;
- }
-
- /* loop through the vertices and copy weight*/
- for (i = 0; i < dv_tot_dst; i++, dv_array_src++, dv_array_dst++, mv_dst++){
- dw_src = defvert_verify_index(*dv_array_src, index_src);
- dw_dst = defvert_verify_index(*dv_array_dst, index_dst);
- if (dw_options == REPLACE_ALL_WEIGHTS) dw_dst->weight = dw_src->weight;
- else if (dw_options == REPLACE_EMPTY_WEIGHTS) {if (!dw_dst->weight || dw_dst->weight == 0) dw_dst->weight = dw_src->weight;}
- else if (dw_options == REPLACE_SELECTED_WEIGHTS) {if (mv_dst->flag & SELECT) dw_dst->weight = dw_src->weight;}
- else return 0;
- }
- return 1;
-}
-
-int ED_vgroup_transfer_weight_by_nearest_vertex(Object *ob_dst, Object *ob_src, short dw_replace_options, bDeformGroup *dg_src)
-{
- bDeformGroup *dg_dst;
- MDeformVert **dv_array_src, **dv_array_dst;
- MDeformWeight *dw_dst, *dw_src;
- MVert *mv_dst;
Mesh *me_dst;
- BVHTreeFromMesh tree_mesh_src;
- BVHTreeNearest nearest;
DerivedMesh *dmesh_src;
- int dv_tot_src, dv_tot_dst, i, index_dst, index_src;
- float tmp_co[3], tmp_mat[4][4];
+ BVHTreeFromMesh tree_mesh_vertices_src, tree_mesh_faces_src = {NULL};
+ MDeformVert **dv_array_src, **dv_array_dst;
+ MVert *mv_dst, *mv_src;
+ MFace *mface_src;
+ BVHTreeNearest nearest;
+ MDeformWeight *dw_dst, *dw_src;
+ int dv_tot_src, dv_tot_dst, i, index_dst, index_src, index_nearest, index_nearest_vertex;
+ float weight, tmp_weight[4], tmp_co[3], normal[3], tmp_mat[4][4], dist_v1, dist_v2, dist_v3, dist_v4;
- enum dw_options {REPLACE_ALL_WEIGHTS = 1, REPLACE_EMPTY_WEIGHTS = 2, REPLACE_SELECTED_WEIGHTS = 3} dw_options = dw_replace_options;
+ enum replace_option {REPLACE_ALL_WEIGHTS = 1,
+ REPLACE_EMPTY_WEIGHTS = 2,
+ REPLACE_SELECTED_WEIGHTS = 3} replace_option = replace_options;
+ enum method_option {BY_INDEX = 1,
+ BY_NEAREST_VERTEX = 2,
+ BY_NEAREST_FACE = 3,
+ BY_NEAREST_VERTEX_IN_FACE = 4} method_option = method_options;
+
/*create new and overwrite vertex group on destination without data*/
- if (!defgroup_find_name(ob_dst, dg_src->name) || dw_replace_options == 1){
+ if (!defgroup_find_name(ob_dst, dg_src->name) || replace_option == 1){
ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, dg_src->name));
ED_vgroup_add_name(ob_dst, dg_src->name);
}
@@ -460,9 +415,6 @@
me_dst = ob_dst->data;
dmesh_src = ob_src->derivedDeform;
- /*make node tree*/
- bvhtree_from_mesh_verts(&tree_mesh_src, dmesh_src, 0.0, 2, 6);
-
/*get vertex group arrays*/
ED_vgroup_give_parray(ob_src->data, &dv_array_src, &dv_tot_src, FALSE);
ED_vgroup_give_parray(ob_dst->data, &dv_array_dst, &dv_tot_dst, FALSE);
@@ -473,224 +425,224 @@
/*get vertices*/
mv_dst = me_dst->mvert;
+ mv_src = dmesh_src->getVertArray(dmesh_src);
/*prepare transformation matrix*/
invert_m4_m4(ob_src->imat, ob_src->obmat);
mult_m4_m4m4(tmp_mat, ob_src->imat, ob_dst->obmat);
- /* loop through the vertices and copy weight*/
- for (i = 0; i < me_dst->totvert; i++, mv_dst++, dv_array_dst++){
+ switch (method_option) {
- /*reset nearest*/
- nearest.index = -1;
- nearest.dist = FLT_MAX;
+ case (BY_INDEX):
+ /*check if indices are matching, delete and return if not*/
+ if (ob_dst == ob_src || dv_tot_dst == 0 || (dv_tot_dst != dv_tot_src)
+ || dv_array_src == NULL || dv_array_dst == NULL) {
+ ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, dg_dst->name));
+ return 0;
+ }
- /*transform into target space*/
- mul_v3_m4v3(tmp_co, tmp_mat, mv_dst->co);
+ /* loop through the vertices*/
+ for (i = 0; i < dv_tot_dst; i++, dv_array_src++, dv_array_dst++, mv_dst++){
- /*node tree accelerated search for closest vetex*/
- BLI_bvhtree_find_nearest(tree_mesh_src.tree, tmp_co, &nearest, tree_mesh_src.nearest_callback, &tree_mesh_src);
- dw_src = defvert_verify_index(dv_array_src[nearest.index], index_src);
- dw_dst = defvert_verify_index(*dv_array_dst, index_dst);
- if (dw_options == REPLACE_ALL_WEIGHTS) dw_dst->weight = dw_src->weight;
- else if (dw_options == REPLACE_EMPTY_WEIGHTS) {if (!dw_dst->weight || dw_dst->weight == 0) dw_dst->weight = dw_src->weight;}
- else if(dw_options == REPLACE_SELECTED_WEIGHTS) {if (mv_dst->flag & SELECT) dw_dst->weight = dw_src->weight;}
- else return 0;
- }
+ /*copy weight*/
+ dw_src = defvert_verify_index(*dv_array_src, index_src);
+ dw_dst = defvert_verify_index(*dv_array_dst, index_dst);
- /*free memory and return*/
- free_bvhtree_from_mesh(&tree_mesh_src);
- return 1;
-}
+ switch (replace_option) {
-int ED_vgroup_transfer_weight_by_nearest_face(Object *ob_dst, Object *ob_src, short dw_replace_options, bDeformGroup *dg_src)
-{
- bDeformGroup *dg_dst;
- Mesh *me_dst;
- DerivedMesh *dmesh_src;
- BVHTreeFromMesh tree_mesh_faces_src = {NULL};
- MDeformVert **dv_array_src, **dv_array_dst;
- MVert *mv_dst, *mv_src;
- MFace *mface_src;
- BVHTreeNearest nearest;
- MDeformWeight *dw_dst;
- int dv_tot_src, dv_tot_dst, i, index_dst, index_src;
- float weight, tmp_weight[4], tmp_co[3], normal[3], tmp_mat[4][4];
+ case (REPLACE_ALL_WEIGHTS):
+ dw_dst->weight = dw_src->weight;
+ break;
- enum dw_options {REPLACE_ALL_WEIGHTS = 1, REPLACE_EMPTY_WEIGHTS = 2, REPLACE_SELECTED_WEIGHTS = 3} dw_options = dw_replace_options;
+ case(REPLACE_EMPTY_WEIGHTS):
+ if (!dw_dst->weight || dw_dst->weight == 0) dw_dst->weight = dw_src->weight;
+ break;
- /*create new and overwrite vertex group on destination without data*/
- if (!defgroup_find_name(ob_dst, dg_src->name) || dw_options == 1){
- ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, dg_src->name));
- ED_vgroup_add_name(ob_dst, dg_src->name);
- }
+ case(REPLACE_SELECTED_WEIGHTS):
+ if (mv_dst->flag & SELECT) dw_dst->weight = dw_src->weight;
+ break;
+ }
+ }
+ break;
- /*get destination deformgroup*/
- dg_dst = defgroup_find_name(ob_dst, dg_src->name);
+ case (BY_NEAREST_VERTEX):
+ /*make node tree*/
+ bvhtree_from_mesh_verts(&tree_mesh_vertices_src, dmesh_src, 0.0, 2, 6);
- /*get meshes*/
- me_dst = ob_dst->data;
- dmesh_src = ob_src->derivedDeform;
+ /* loop through the vertices*/
+ for (i = 0; i < me_dst->totvert; i++, mv_dst++, dv_array_dst++){
- /*make node tree*/
- DM_ensure_tessface(dmesh_src);
- bvhtree_from_mesh_faces(&tree_mesh_faces_src, dmesh_src, 0.0, 2, 6);
+ /*reset nearest*/
+ nearest.index = -1;
+ nearest.dist = FLT_MAX;
- /*get vertex group arrays*/
- ED_vgroup_give_parray(ob_src->data, &dv_array_src, &dv_tot_src, FALSE);
- ED_vgroup_give_parray(ob_dst->data, &dv_array_dst, &dv_tot_dst, FALSE);
+ /*transform into target space*/
+ mul_v3_m4v3(tmp_co, tmp_mat, mv_dst->co);
- /*get indexes of vertex groups*/
- index_src = BLI_findindex(&ob_src->defbase, dg_src);
- index_dst = BLI_findindex(&ob_dst->defbase, dg_dst);
+ /*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);
- /*get vertices*/
- mv_dst = me_dst->mvert;
- mv_src = dmesh_src->getVertArray(dmesh_src);
+ /*copy weight*/
+ dw_src = defvert_verify_index(dv_array_src[nearest.index], index_src);
+ dw_dst = defvert_verify_index(*dv_array_dst, index_dst);
- /*get faces*/
- mface_src = dmesh_src->getTessFaceArray(dmesh_src);
+ switch (replace_option) {
- /*prepare transformation matrix*/
- invert_m4_m4(ob_src->imat, ob_src->obmat);
- mult_m4_m4m4(tmp_mat, ob_src->imat, ob_dst->obmat);
+ case (REPLACE_ALL_WEIGHTS):
+ dw_dst->weight = dw_src->weight;
+ break;
- /* loop through the vertices and copy weight from nearest weight*/
- for (i = 0; i < me_dst->totvert; i++, mv_dst++, dv_array_dst++){
+ case(REPLACE_EMPTY_WEIGHTS):
+ if (!dw_dst->weight || dw_dst->weight == 0) dw_dst->weight = dw_src->weight;
+ break;
- /*reset nearest*/
- nearest.index = -1;
- nearest.dist = FLT_MAX;
+ case(REPLACE_SELECTED_WEIGHTS):
+ if (mv_dst->flag & SELECT) dw_dst->weight = dw_src->weight;
+ break;
+ }
+ }
+ break;
- /*transform into target space*/
- mul_v3_m4v3(tmp_co, tmp_mat, mv_dst->co);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list