[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