[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57978] trunk/blender/source/blender/ editors/object/object_vgroup.c: fixes/edits to wright transfer
Campbell Barton
ideasman42 at gmail.com
Wed Jul 3 23:29:30 CEST 2013
Revision: 57978
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57978
Author: campbellbarton
Date: 2013-07-03 21:29:30 +0000 (Wed, 03 Jul 2013)
Log Message:
-----------
fixes/edits to wright transfer
- poll function now checks for a mesh.
- other selected lattices would crash, check for meshes there too.
- better reporting when transfer fails.
- remove feature to sync with active bone after transfer, other tools don't do this (we could make into a generic function if its needed).
Modified Paths:
--------------
trunk/blender/source/blender/editors/object/object_vgroup.c
Modified: trunk/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_vgroup.c 2013-07-03 21:07:41 UTC (rev 57977)
+++ trunk/blender/source/blender/editors/object/object_vgroup.c 2013-07-03 21:29:30 UTC (rev 57978)
@@ -3749,66 +3749,74 @@
{
Scene *scene = CTX_data_scene(C);
Object *ob_act = CTX_data_active_object(C);
- Object *armobj = BKE_object_pose_armature_get(ob_act);
- bDeformGroup *dg_src;
int fail = 0;
+ bool change = false;
- WT_VertexGroupMode vertex_group_mode = RNA_enum_get(op->ptr, "WT_vertex_group_mode");
- WT_Method method = RNA_enum_get(op->ptr, "WT_method");
- WT_ReplaceMode replace_mode = RNA_enum_get(op->ptr, "WT_replace_mode");
+ WT_VertexGroupMode vertex_group_mode = RNA_enum_get(op->ptr, "group_select_mode");
+ WT_Method method = RNA_enum_get(op->ptr, "method");
+ WT_ReplaceMode replace_mode = RNA_enum_get(op->ptr, "replace_mode");
/* Macro to loop through selected objects and perform operation depending on function, option and method.*/
- CTX_DATA_BEGIN (C, Object *, ob_slc, selected_editable_objects)
+ CTX_DATA_BEGIN (C, Object *, ob_src, selected_editable_objects)
{
+ if (ob_act != ob_src) {
- if (ob_act != ob_slc && ob_slc->defbase.first) {
+ if (ob_src->defbase.first == NULL) {
+ BKE_reportf(op->reports, RPT_WARNING,
+ "Skipping object '%s' it has no vertex groups", ob_src->id.name + 2);
+ continue;
+ }
+ else if (ob_src->type != OB_MESH) {
+ BKE_reportf(op->reports, RPT_WARNING,
+ "Skipping object '%s' only copying from meshes is supported", ob_src->id.name + 2);
+ continue;
+ }
+
switch (vertex_group_mode) {
case WT_REPLACE_ACTIVE_VERTEX_GROUP:
- if (!ed_vgroup_transfer_weight(ob_act, ob_slc, BLI_findlink(&ob_slc->defbase, ob_slc->actdef - 1),
- scene, method, replace_mode, op))
- {
+ {
+ bDeformGroup *dg_src;
+ dg_src = BLI_findlink(&ob_src->defbase, ob_src->actdef - 1);
+ if (ed_vgroup_transfer_weight(ob_act, ob_src, dg_src, scene, method, replace_mode, op)) {
+ change = true;
+ }
+ else {
fail++;
}
break;
-
+ }
case WT_REPLACE_ALL_VERTEX_GROUPS:
- for (dg_src = ob_slc->defbase.first; dg_src; dg_src = dg_src->next) {
- if (!ed_vgroup_transfer_weight(ob_act, ob_slc, dg_src, scene, method, replace_mode, op)) {
+ {
+ bDeformGroup *dg_src;
+ for (dg_src = ob_src->defbase.first; dg_src; dg_src = dg_src->next) {
+ if (ed_vgroup_transfer_weight(ob_act, ob_src, dg_src, scene, method, replace_mode, op)) {
+ change = true;
+ }
+ else {
fail++;
}
}
break;
-
+ }
default:
BLI_assert(0);
break;
}
}
}
-
- /* Event notifiers for correct display of data.*/
- DAG_id_tag_update(&ob_slc->id, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob_slc);
- WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob_slc->data);
-
CTX_DATA_END;
- /* Ensure active Weight Group is set to active bone
- * when new groups have been added during Weight Transfer
- */
- if (armobj && (armobj->mode & OB_MODE_POSE)) {
- struct bArmature *arm = armobj->data;
- if (arm->act_bone && (arm->act_bone->layer & arm->layer)) {
- ob_act->actdef = defgroup_name_index(ob_act, arm->act_bone->name)+1;
- }
- }
+ if (change) {
+ /* Event notifiers for correct display of data.*/
+ DAG_id_tag_update(&ob_act->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM | ND_VERTEX_GROUP, ob_act);
- if (fail != 0) {
- return OPERATOR_CANCELLED;
+ return OPERATOR_FINISHED;
}
else {
- return OPERATOR_FINISHED;
+ BKE_report(op->reports, RPT_WARNING, "Failed, no other selected objects with vertex groups found.");
+ return OPERATOR_CANCELLED;
}
}
@@ -3821,16 +3829,17 @@
ot->description = "Transfer weight paint to active from selected mesh";
/* API callbacks.*/
- ot->poll = vertex_group_poll;
+ ot->poll = vertex_group_mesh_poll;
ot->exec = vertex_group_transfer_weight_exec;
/* Flags.*/
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* Properties.*/
- ot->prop = RNA_def_enum(ot->srna, "WT_vertex_group_mode", WT_vertex_group_mode_item, 1, "Group", "");
- ot->prop = RNA_def_enum(ot->srna, "WT_method", WT_method_item, 3, "Method", "");
- ot->prop = RNA_def_enum(ot->srna, "WT_replace_mode", WT_replace_mode_item, 1, "Replace", "");
+ /* TODO, use vgroup_operator_subset_select_props for group_select_mode */
+ ot->prop = RNA_def_enum(ot->srna, "group_select_mode", WT_vertex_group_mode_item, WT_REPLACE_ACTIVE_VERTEX_GROUP, "Group", "");
+ ot->prop = RNA_def_enum(ot->srna, "method", WT_method_item, WT_BY_NEAREST_FACE, "Method", "");
+ ot->prop = RNA_def_enum(ot->srna, "replace_mode", WT_replace_mode_item, WT_REPLACE_ALL_WEIGHTS, "Replace", "");
}
static int set_active_group_exec(bContext *C, wmOperator *op)
More information about the Bf-blender-cvs
mailing list