Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-07-04 01:29:30 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-07-04 01:29:30 +0400
commit374383997cc2dc36819eb0ec125d6a2d06809f71 (patch)
tree4dbf0b59e8851281a9c10aea8a4c0770281ecb0c /source/blender/editors/object/object_vgroup.c
parent75aed60ed846acd994121de1d6c47ffb00a5b6c8 (diff)
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).
Diffstat (limited to 'source/blender/editors/object/object_vgroup.c')
-rw-r--r--source/blender/editors/object/object_vgroup.c81
1 files changed, 45 insertions, 36 deletions
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index b0c608a7d7e..da46001bde9 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -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)