[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46712] branches/meshdata_transfer/source/ blender/editors/object/object_vgroup.c: Fucntions adjusted to support options.
Ove Murberg Henriksen
sorayasilvermoon at hotmail.com
Thu May 17 10:10:20 CEST 2012
Revision: 46712
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46712
Author: cyborgmuppet
Date: 2012-05-17 08:10:19 +0000 (Thu, 17 May 2012)
Log Message:
-----------
Fucntions adjusted to support options.
(still lacking feature for selected and option for all)
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-17 07:59:25 UTC (rev 46711)
+++ branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c 2012-05-17 08:10:19 UTC (rev 46712)
@@ -424,17 +424,17 @@
int ED_vgroup_transfer_weight_by_index_all(Object *ob_dst, Object *ob_src, short mode)
{
- /* mode 1 == replace all weights*/
+
if(mode == 1){
return ED_vgroup_copy_array(ob_dst, ob_src);
}
- /* mode 2 == apply to null/0 weights*/
+
else if(mode == 2){
return 0;
}
- /* mode 3 == apply to selected weights*/
+
else if(mode == 3){
return 0;
}
@@ -443,19 +443,72 @@
int ED_vgroup_transfer_weight_by_index_single(Object *ob_dst, Object *ob_src, short mode)
{
+ MDeformVert **dv_array_src;
+ MDeformVert **dv_array_dst;
+ MDeformWeight *dw_dst, *dw_src;
+ int dv_tot_src, dv_tot_dst;
+ int i, index_src, index_dst;
+ bDeformGroup *dg_src, *dg_dst;
+
+ /*get source deform group*/
+ dg_src= BLI_findlink(&ob_src->defbase, (ob_src->actdef-1));
+
+ /*create new and overwrite vertex group on destination without data*/
+ if(!defgroup_find_name(ob_dst, dg_src->name) || mode == 1){
+ ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, dg_src->name));
+ ED_vgroup_add_name(ob_dst, dg_src->name);
+ }
+
+ /*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;
+ }
+
/* mode 1 == replace all weights*/
if(mode == 1){
- return ED_vgroup_copy_single(ob_dst, ob_src);
+ /* loop through the vertices and copy weight*/
+ for(i=0; i<dv_tot_dst; i++, dv_array_src++, dv_array_dst++) {
+ dw_src= defvert_verify_index(*dv_array_src, index_src);
+ dw_dst= defvert_verify_index(*dv_array_dst, index_dst);
+ dw_dst->weight= dw_src->weight;
+ }
+ return 1;
}
- /* mode 2 == apply to null/0 weights*/
+ /* mode 2 == replace null weights*/
else if(mode == 2){
- return 0;
+ /* loop through the vertices and copy weight*/
+ for(i=0; i<dv_tot_dst; i++, dv_array_src++, dv_array_dst++) {
+ dw_src= defvert_verify_index(*dv_array_src, index_src);
+ dw_dst= defvert_verify_index(*dv_array_dst, index_dst);
+ /*check if destination weight is null or zero*/
+ if(!dw_dst->weight || dw_dst->weight == 0) dw_dst->weight= dw_src->weight;
+ }
+ return 1;
}
- /* mode 3 == apply to selected weights*/
+ /* mode 3 == replace selected weights*/
else if(mode == 3){
- return 0;
+ /* loop through the vertices and copy weight*/
+ for(i=0; i<dv_tot_dst; i++, dv_array_src++, dv_array_dst++) {
+ dw_src= defvert_verify_index(*dv_array_src, index_src);
+ dw_dst= defvert_verify_index(*dv_array_dst, index_dst);
+ /*check if source vertex is selected*/
+ if((*dv_array_src)->flag == 1) dw_dst->weight= dw_src->weight; /*this does not work*/
+ }
+ return 1;
}
else return 0;
}
@@ -464,9 +517,6 @@
{
ob_dst= ob_dst;
ob_src= ob_src;
- /* mode 1 == replace all weights*/
- /* mode 2 == apply to null/0 weights*/
- /* mode 3 == apply to selected weights*/
return mode;
}
@@ -483,17 +533,14 @@
int dv_tot_src, dv_tot_dst, i, index_dst, index_src;
float tmp_co[3], tmp_mat[4][4];
- /* mode 1 == replace all weights*/
- /* mode 2 == apply to null/0 weights*/
- /* mode 3 == apply to selected weights*/
- return mode;
-
/*get source deform group*/
dg_src= BLI_findlink(&ob_src->defbase, (ob_src->actdef-1));
/*create new and overwrite vertex group on destination without data*/
- ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, dg_src->name));
- ED_vgroup_add_name(ob_dst, dg_src->name);
+ if(!defgroup_find_name(ob_dst, dg_src->name) || mode == 1){
+ ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, dg_src->name));
+ ED_vgroup_add_name(ob_dst, dg_src->name);
+ }
/*get destination deformgroup*/
dg_dst= defgroup_find_name(ob_dst, dg_src->name);
@@ -521,37 +568,74 @@
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 from nearest weight*/
- for(i=0; i < me_dst->totvert; i++, mv_dst++, dv_array_dst++){
+ /* mode 1 == replace all weights*/
+ if(mode == 1){
+ /* loop through the vertices and copy weight*/
+ for(i=0; i < me_dst->totvert; i++, mv_dst++, dv_array_dst++){
+ /*reset nearest*/
+ nearest.index= -1;
+ nearest.dist= FLT_MAX;
+ /*transform into target space*/
+ mul_v3_m4v3(tmp_co, tmp_mat, mv_dst->co);
+ /*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);
+ dw_dst->weight= dw_src->weight;
+ }
+ /*free memory and return*/
+ free_bvhtree_from_mesh(&tree_mesh_src);
+ return 1;
+ }
- /*reset nearest*/
- nearest.index= -1;
- nearest.dist= FLT_MAX;
+ /* mode 2 == replace null weights*/
+ else if(mode == 2){
+ /* loop through the vertices and copy weight weight*/
+ for(i=0; i < me_dst->totvert; i++, mv_dst++, dv_array_dst++){
+ /*reset nearest*/
+ nearest.index= -1;
+ nearest.dist= FLT_MAX;
+ /*transform into target space*/
+ mul_v3_m4v3(tmp_co, tmp_mat, mv_dst->co);
+ /*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);
+ /*check if destination weight is null or zero*/
+ if(!dw_dst->weight || dw_dst->weight == 0) dw_dst->weight= dw_src->weight;
+ }
+ /*free memory and return*/
+ free_bvhtree_from_mesh(&tree_mesh_src);
+ return 1;
+ }
- /*transform into target space*/
- mul_v3_m4v3(tmp_co, tmp_mat, mv_dst->co);
+ /* mode 3 == replace selected weights*/
+ else if(mode == 3){
+ /* loop through the vertices and copy weight*/
+ for(i=0; i < me_dst->totvert; i++, mv_dst++, dv_array_dst++){
+ /*reset nearest*/
+ nearest.index= -1;
+ nearest.dist= FLT_MAX;
+ /*transform into target space*/
+ mul_v3_m4v3(tmp_co, tmp_mat, mv_dst->co);
+ /*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);
+ /*dw_dst->weight= dw_src->weight;*//*TODO fix this*/
+ }
- /*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);
-
- /*copy weight*/
- dw_src= defvert_verify_index(dv_array_src[nearest.index], index_src);
- dw_dst= defvert_verify_index(*dv_array_dst, index_dst);
- dw_dst->weight= dw_src->weight;
+ /*free memory and return*/
+ free_bvhtree_from_mesh(&tree_mesh_src);
+ return 1;
}
-
- /*free memory and return*/
- free_bvhtree_from_mesh(&tree_mesh_src);
- return 1;
+ else return 0;
}
int ED_vgroup_transfer_weight_by_nearest_vertex_in_face_all(Object *ob_dst, Object *ob_src, short mode)
{
ob_dst= ob_dst;
ob_src= ob_src;
- /* mode 1 == replace all weights*/
- /* mode 2 == apply to null/0 weights*/
- /* mode 3 == apply to selected weights*/
return mode;
}
@@ -569,17 +653,14 @@
int dv_tot_src, dv_tot_dst, i, index_dst, index_src;
float dist_v1, dist_v2, dist_v3, dist_v4, tmp_co[3], tmp_mat[4][4];
- /* mode 1 == replace all weights*/
- /* mode 2 == apply to null/0 weights*/
- /* mode 3 == apply to selected weights*/
- return mode;
-
/*get source deform group*/
dg_src= BLI_findlink(&ob_src->defbase, (ob_src->actdef-1));
/*create new and overwrite vertex group on destination without data*/
- ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, dg_src->name));
- ED_vgroup_add_name(ob_dst, dg_src->name);
+ if(!defgroup_find_name(ob_dst, dg_src->name) || mode == 1){
+ ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, dg_src->name));
+ ED_vgroup_add_name(ob_dst, dg_src->name);
+ }
/*get destination deformgroup*/
dg_dst= defgroup_find_name(ob_dst, dg_src->name);
@@ -611,59 +692,136 @@
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 from nearest weight*/
- for(i=0; i < me_dst->totvert; i++, mv_dst++, dv_array_dst++){
+ /* mode 1 == replace all weights*/
+ if(mode == 1){
+ /* loop through the vertices and copy weight from nearest weight*/
+ for(i=0; i < me_dst->totvert; i++, mv_dst++, dv_array_dst++){
+ /*reset nearest*/
+ nearest.index= -1;
+ nearest.dist= FLT_MAX;
+ /*transform into target space*/
+ mul_v3_m4v3(tmp_co, tmp_mat, mv_dst->co);
+ /*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);
+ /*get distances*/
+ dist_v1= len_squared_v3v3(tmp_co, mv_src[mface_src[nearest.index].v1].co);
+ dist_v2= len_squared_v3v3(tmp_co, mv_src[mface_src[nearest.index].v2].co);
+ dist_v3= len_squared_v3v3(tmp_co, mv_src[mface_src[nearest.index].v3].co);
+ /*get weight from triangle*/
+ if(dist_v1<dist_v2 && dist_v1<dist_v3){
+ dw_src= defvert_verify_index(dv_array_src[mface_src[nearest.index].v1], index_src);
+ }
+ else if(dist_v2<dist_v3){
+ dw_src= defvert_verify_index(dv_array_src[mface_src[nearest.index].v2], index_src);
+ }
+ else{
+ dw_src= defvert_verify_index(dv_array_src[mface_src[nearest.index].v3], index_src);
+ }
+ /*check for and get weight from quad*/
+ if(mface_src[nearest.index].v4){
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list