[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