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 23:34:49 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-07-04 23:34:49 +0400
commitcee5bd4623c4508eaa41cf498b05a54686891ce3 (patch)
treefeda68cf710e4d6dbe3645dcdc44bc37c964730d /source/blender/editors
parent5ad4550f2278f9688a40321998d256438c2417cc (diff)
changes to weight paint transfer
- Use the active group of the active (target) object (not the active group of the other, unselected object) - Ensure the active group doesnt change from the one that was set originally. - defgroup_find_name was doing redundant lookup on its self.
Diffstat (limited to 'source/blender/editors')
-rw-r--r--source/blender/editors/object/object_vgroup.c52
1 files changed, 40 insertions, 12 deletions
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index bda69af3513..9c8e49e873d 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -749,10 +749,12 @@ static bool ed_vgroup_transfer_weight(Object *ob_dst, Object *ob_src, bDeformGro
unsigned int f_index;
float weight, tmp_weight[4], tmp_co[3], normal[3], tmp_mat[4][4], dist_v1, dist_v2, dist_v3, dist_v4;
const int use_vert_sel = vertex_group_use_vert_sel(ob_dst);
+ bool is_dg_dst_new = false;
/* Ensure vertex group on target.*/
if ((dg_dst = defgroup_find_name(ob_dst, dg_src->name)) == NULL) {
dg_dst = BKE_defgroup_new(ob_dst, dg_src->name);
+ is_dg_dst_new = true;
}
/* Get meshes.*/
@@ -804,7 +806,10 @@ static bool ed_vgroup_transfer_weight(Object *ob_dst, Object *ob_src, bDeformGro
if (ob_dst == ob_src || dv_tot_dst == 0 || dv_tot_dst != dv_tot_src ||
dv_array_src == NULL || dv_array_dst == NULL)
{
- ED_vgroup_delete(ob_dst, defgroup_find_name(ob_dst, dg_dst->name));
+ if (is_dg_dst_new) {
+ ED_vgroup_delete(ob_dst, dg_dst);
+ }
+
if (dv_array_src) MEM_freeN(dv_array_src);
if (dv_array_dst) MEM_freeN(dv_array_dst);
dmesh_src->release(dmesh_src);
@@ -901,18 +906,16 @@ static bool ed_vgroup_transfer_weight(Object *ob_dst, Object *ob_src, bDeformGro
project_v3_plane(tmp_co, normal, mv_src[mf->v1].co);
/* Interpolate weights over face.*/
- f_index = mf->v4 ? 3 : 2;
- if (f_index == 3) {
- interp_weights_face_v3(tmp_weight, mv_src[mf->v1].co, mv_src[mf->v2].co,
- mv_src[mf->v3].co, mv_src[mf->v4].co, tmp_co);
- }
- else {
- interp_weights_face_v3(tmp_weight, mv_src[mf->v1].co, mv_src[mf->v2].co,
- mv_src[mf->v3].co, NULL, tmp_co);
- }
+ interp_weights_face_v3(tmp_weight,
+ mv_src[mf->v1].co,
+ mv_src[mf->v2].co,
+ mv_src[mf->v3].co,
+ mf->v4 ? mv_src[mf->v4].co : NULL,
+ tmp_co);
/* Get weights from face.*/
- weight = 0;
+ f_index = mf->v4 ? 3 : 2;
+ weight = 0.0f;
do {
v_index = (&mf->v1)[f_index];
weight += tmp_weight[f_index] * defvert_find_weight(dv_array_src[v_index], index_src);
@@ -920,7 +923,7 @@ static bool ed_vgroup_transfer_weight(Object *ob_dst, Object *ob_src, bDeformGro
/* Copy weight that are not NULL including weight value 0. In relevant cases, existing weights are
* overwritten prior to this. See the "Clear weights." step above.*/
- if (weight > 0) {
+ if (weight > 0.0f) {
dw_dst = defvert_verify_index(*dv_dst, index_dst);
vgroup_transfer_weight(&dw_dst->weight, weight, replace_mode);
}
@@ -3764,6 +3767,10 @@ 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);
+
+ bDeformGroup *dg_act = BLI_findlink(&ob_act->defbase, (ob_act->actdef - 1));
+ char dg_act_name[MAX_VGROUP_NAME]; /* may be freed so copy */
+
int fail = 0;
bool change = false;
@@ -3771,6 +3778,17 @@ static int vertex_group_transfer_weight_exec(bContext *C, wmOperator *op)
WT_Method method = RNA_enum_get(op->ptr, "method");
WT_ReplaceMode replace_mode = RNA_enum_get(op->ptr, "replace_mode");
+ if (vertex_group_mode == WT_REPLACE_ACTIVE_VERTEX_GROUP) {
+ if (!dg_act) {
+ BKE_report(op->reports, RPT_WARNING, "Failed, active object has no active groups");
+ return OPERATOR_CANCELLED;
+ }
+ }
+
+ if (dg_act) {
+ BLI_strncpy(dg_act_name, dg_act->name, sizeof(dg_act_name));
+ }
+
/* Macro to loop through selected objects and perform operation depending on function, option and method.*/
CTX_DATA_BEGIN (C, Object *, ob_src, selected_editable_objects)
{
@@ -3823,8 +3841,18 @@ static int vertex_group_transfer_weight_exec(bContext *C, wmOperator *op)
CTX_DATA_END;
if (change) {
+
+ /* possible the active vertex group changed because of adding/removing */
+ /* note!, dg_act may be realloc'd, only check its not NULL */
+ if (dg_act) {
+ ED_vgroup_select_by_name(ob_act, dg_act_name);
+ }
+
/* Event notifiers for correct display of data.*/
+
+
DAG_id_tag_update(&ob_act->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob_act); /* for buttons */
WM_event_add_notifier(C, NC_GEOM | ND_VERTEX_GROUP, ob_act);
return OPERATOR_FINISHED;
}