[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46705] branches/meshdata_transfer: Added framework for transfer weight options.

Ove Murberg Henriksen sorayasilvermoon at hotmail.com
Thu May 17 03:42:08 CEST 2012


Revision: 46705
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46705
Author:   cyborgmuppet
Date:     2012-05-17 01:42:06 +0000 (Thu, 17 May 2012)
Log Message:
-----------
Added framework for transfer weight options.
vertex_group_transfer_weight_exec() governs all.
Functions renamed/added with _transfer_weight_
as opposed to _copy_by_ 
This is to reflect changes in parameters and usage as the internal code will change.

Modified Paths:
--------------
    branches/meshdata_transfer/release/scripts/startup/bl_ui/space_view3d_toolbar.py
    branches/meshdata_transfer/source/blender/editors/object/object_intern.h
    branches/meshdata_transfer/source/blender/editors/object/object_ops.c
    branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c

Modified: branches/meshdata_transfer/release/scripts/startup/bl_ui/space_view3d_toolbar.py
===================================================================
--- branches/meshdata_transfer/release/scripts/startup/bl_ui/space_view3d_toolbar.py	2012-05-16 23:37:23 UTC (rev 46704)
+++ branches/meshdata_transfer/release/scripts/startup/bl_ui/space_view3d_toolbar.py	2012-05-17 01:42:06 UTC (rev 46705)
@@ -986,8 +986,7 @@
 
         col = layout.column()
         col.active = ob.vertex_groups.active is not None
-        col.operator("object.vertex_group_copy_to_selected", text="Transfer weight All")
-        col.operator("object.vertex_group_copy_to_selected_single", text="Transfer weight")
+        col.operator("object.vertex_group_transfer_weight", text="Transfer weight")
         col.operator("object.vertex_group_normalize_all", text="Normalize All")
         col.operator("object.vertex_group_normalize", text="Normalize")
         col.operator("object.vertex_group_mirror", text="Mirror")

Modified: branches/meshdata_transfer/source/blender/editors/object/object_intern.h
===================================================================
--- branches/meshdata_transfer/source/blender/editors/object/object_intern.h	2012-05-16 23:37:23 UTC (rev 46704)
+++ branches/meshdata_transfer/source/blender/editors/object/object_intern.h	2012-05-17 01:42:06 UTC (rev 46705)
@@ -196,6 +196,7 @@
 void OBJECT_OT_vertex_group_select(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_deselect(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_copy_to_linked(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_group_transfer_weight(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_copy_to_selected(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_copy_to_selected_single(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_copy(struct wmOperatorType *ot);

Modified: branches/meshdata_transfer/source/blender/editors/object/object_ops.c
===================================================================
--- branches/meshdata_transfer/source/blender/editors/object/object_ops.c	2012-05-16 23:37:23 UTC (rev 46704)
+++ branches/meshdata_transfer/source/blender/editors/object/object_ops.c	2012-05-17 01:42:06 UTC (rev 46705)
@@ -170,6 +170,7 @@
 	WM_operatortype_append(OBJECT_OT_vertex_group_select);
 	WM_operatortype_append(OBJECT_OT_vertex_group_deselect);
 	WM_operatortype_append(OBJECT_OT_vertex_group_copy_to_linked);
+	WM_operatortype_append(OBJECT_OT_vertex_group_transfer_weight);
 	WM_operatortype_append(OBJECT_OT_vertex_group_copy_to_selected);
 	WM_operatortype_append(OBJECT_OT_vertex_group_copy_to_selected_single);
 	WM_operatortype_append(OBJECT_OT_vertex_group_copy);

Modified: branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c
===================================================================
--- branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c	2012-05-16 23:37:23 UTC (rev 46704)
+++ branches/meshdata_transfer/source/blender/editors/object/object_vgroup.c	2012-05-17 01:42:06 UTC (rev 46705)
@@ -420,9 +420,58 @@
 	return 1;
 }
 
-/*Copy a single vertex group from source to destination with weights by nearest weight*/
-int ED_vgroup_copy_by_nearest_vertex_single(Object *ob_dst, Object *ob_src)
+/********************** Start transfer weight functions *********************/
+
+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;
+	}
+	else return 0;
+}
+
+int ED_vgroup_transfer_weight_by_index_single(Object *ob_dst, Object *ob_src, short mode)
+{
+	/* mode 1 == replace all weights*/
+	if(mode == 1){
+		return ED_vgroup_copy_single(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;
+	}
+	else return 0;
+}
+
+int ED_vgroup_transfer_weight_by_nearest_vertex_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;
+}
+
+int ED_vgroup_transfer_weight_by_nearest_vertex_single(Object *ob_dst, Object *ob_src, short mode)
+{
 	bDeformGroup *dg_src, *dg_dst;
 	MDeformVert **dv_array_src, **dv_array_dst;
 	MDeformWeight *dw_dst, *dw_src;
@@ -434,6 +483,11 @@
 	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));
 
@@ -491,9 +545,18 @@
 	return 1;
 }
 
-/*Copy a single vertex group from source to destination with weights by nearest weight in face*/
-int ED_vgroup_copy_by_nearest_vertex_in_face_single(Object *ob_dst, Object *ob_src)
+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;
+}
+
+int ED_vgroup_transfer_weight_by_nearest_vertex_in_face_single(Object *ob_dst, Object *ob_src, short mode)
+{
 	bDeformGroup *dg_src, *dg_dst;
 	Mesh *me_dst;
 	DerivedMesh *dmesh_src;
@@ -506,6 +569,11 @@
 	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));
 
@@ -589,9 +657,18 @@
 	return 1;
 }
 
-/*Copy a single vertex group from source to destination with weights interpolated over nearest face*/
-int ED_vgroup_copy_by_nearest_face_single(Object *ob_dst, Object *ob_src)
+int ED_vgroup_transfer_weight_by_nearest_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;
+}
+
+int ED_vgroup_transfer_weight_by_nearest_face_single(Object *ob_dst, Object *ob_src, short mode)
+{
 	bDeformGroup *dg_src, *dg_dst;
 	Mesh *me_dst;
 	DerivedMesh *dmesh_src;
@@ -604,6 +681,11 @@
 	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];
 
+	/* 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));
 
@@ -680,6 +762,7 @@
 	return 1;
 }
 
+/********************** End transfer weight functions *********************/
 
 /* for Mesh in Object mode */
 /* allows editmode for Lattice */
@@ -3048,7 +3131,6 @@
 	return OPERATOR_FINISHED;
 }
 
-
 void OBJECT_OT_vertex_group_copy_to_selected(wmOperatorType *ot)
 {
 	/* identifiers */
@@ -3074,12 +3156,8 @@
 	CTX_DATA_BEGIN(C, Object*, obslc, selected_editable_objects)
 	{
 		if(obact != obslc) {
-			/*Try function for matching number of vertices*/
+			/*Try function for matching indices*/
 			if(ED_vgroup_copy_single(obslc, obact)) change++;
-			/*Try function for get weight from closest vertex*/
-			/*TODO: try this function*/
-			/*Try function for get weight from closest face*/
-			else if(ED_vgroup_copy_by_nearest_face_single(obslc, obact)) change++;
 			/*Trigger error message*/
 			else fail++;
 			/*Event notifiers for correct display of data*/
@@ -3093,7 +3171,7 @@
 	/*Report error when task can not be completed with available functions.*/
 	if((change == 0 && fail == 0) || fail) {
 		BKE_reportf(op->reports, RPT_ERROR,
-		            "Copy to VGroups to Selected warning done %d, failed %d, All functions failed!",
+		            "Copy to VGroups to Selected single warning done %d, failed %d, object data must have matching indices",
 		            change, fail);
 	}
 
@@ -3116,6 +3194,110 @@
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 }
 
+static int vertex_group_transfer_weight_exec(bContext *C, wmOperator *op)
+{
+	Object *obact= CTX_data_active_object(C);
+	int change= 0;
+	int fail= 0;
+
+	/*TODO: get this parameter*/
+	short option= 2;
+	/* option 1 == single*/
+	/* option 2 == all*/
+
+	/*TODO: get this parameter*/
+	short method= 1;
+	/*method 1 == by matching indices*/
+	/*method 2 == by nearest vertex*/
+	/*method 3 == by nearest vertex in face*/
+	/*method 4 == by nearest face*/
+
+	/*TODO: get this parameter*/
+	short mode= 1;
+	/* mode is passed on to lower funtions*/
+
+	/*Macro to loop through selected objects and perform operation*/
+	CTX_DATA_BEGIN(C, Object*, obslc, selected_editable_objects)
+	{
+		/*check if object is the same*/
+		if(obact != obslc) {
+			/*apply option*/
+			if(option == 1){
+				/*apply method*/
+				if(method == 1){
+					/*Try function with mode*/
+					if(ED_vgroup_transfer_weight_by_index_single(obslc, obact, mode)) change++; /*(tmp dev info remove) tested and working*/
+					else fail++;
+				}
+				else if(method == 2){
+					if(ED_vgroup_transfer_weight_by_nearest_vertex_single(obslc, obact, mode)) change++;
+					else fail++;
+				}
+				else if(method == 3){
+					if(ED_vgroup_transfer_weight_by_nearest_vertex_in_face_single(obslc, obact, mode)) change++;
+					else fail++;
+				}
+				else if(method == 4){
+					if(ED_vgroup_transfer_weight_by_nearest_face_single(obslc, obact, mode)) change++;
+					else fail++;
+				}
+				else fail++;
+			}
+			else if(option == 2){
+				if(method == 1){
+					if(ED_vgroup_transfer_weight_by_index_all(obslc, obact, mode)) change++; /*(tmp dev info remove) tested and working*/
+					else fail++;
+				}
+				else if(method == 2){
+					if(ED_vgroup_transfer_weight_by_nearest_vertex_all(obslc, obact, mode)) change++;
+					else fail++;
+				}
+				else if(method == 3){
+					if(ED_vgroup_transfer_weight_by_nearest_vertex_in_face_all(obslc, obact, mode)) change++;
+					else fail++;
+				}
+				else if(method == 4){

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list