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).
This commit is contained in:
Campbell Barton
2013-07-03 21:29:30 +00:00
parent 75aed60ed8
commit 374383997c

View File

@@ -3749,66 +3749,74 @@ static int vertex_group_transfer_weight_exec(bContext *C, wmOperator *op)
{
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_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;
}
if (ob_act != ob_slc && ob_slc->defbase.first) {
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 @@ void OBJECT_OT_vertex_group_transfer_weight(wmOperatorType *ot)
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)