diff options
author | Gaia Clary <gaia.clary@machinimatrix.org> | 2013-06-23 19:37:08 +0400 |
---|---|---|
committer | Gaia Clary <gaia.clary@machinimatrix.org> | 2013-06-23 19:37:08 +0400 |
commit | 70fd2320c8d2d9682ef8dea586e260193596d0e3 (patch) | |
tree | 958618cf6114c989562942731a659fbc62ab88c3 /source/blender/blenkernel | |
parent | 219f3ea85dfd1fa3decbe1abd644c53cc1f8bef0 (diff) |
Added polished Vertex Weights Panel (properties sidebar)
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_deform.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/deform.c | 45 |
2 files changed, 48 insertions, 1 deletions
diff --git a/source/blender/blenkernel/BKE_deform.h b/source/blender/blenkernel/BKE_deform.h index 5e8cd8d90fa..07bdbc1009b 100644 --- a/source/blender/blenkernel/BKE_deform.h +++ b/source/blender/blenkernel/BKE_deform.h @@ -65,6 +65,8 @@ float defvert_find_weight(const struct MDeformVert *dvert, const int defgroup); float defvert_array_find_weight_safe(const struct MDeformVert *dvert, const int index, const int defgroup); void defvert_copy(struct MDeformVert *dvert_dst, const struct MDeformVert *dvert_src); +void defvert_copy_subset(struct MDeformVert *dvert_dst, const struct MDeformVert *dvert_src, + const bool *vgroup_subset, const int vgroup_tot); void defvert_copy_index(struct MDeformVert *dvert_dst, const struct MDeformVert *dvert_src, const int defgroup); void defvert_sync(struct MDeformVert *dvert_dst, const struct MDeformVert *dvert_src, const bool use_verify); void defvert_sync_mapped(struct MDeformVert *dvert_dst, const struct MDeformVert *dvert_src, @@ -73,6 +75,8 @@ void defvert_remap(struct MDeformVert *dvert, int *map, const int map_len); void defvert_flip(struct MDeformVert *dvert, const int *flip_map, const int flip_map_len); void defvert_flip_merged(struct MDeformVert *dvert, const int *flip_map, const int flip_map_len); void defvert_normalize(struct MDeformVert *dvert); +void defvert_normalize_subset(struct MDeformVert *dvert, + const bool *vgroup_subset, const int vgroup_tot); void defvert_normalize_lock_single(struct MDeformVert *dvert, const int def_nr_lock); void defvert_normalize_lock_map(struct MDeformVert *dvert, const bool *lock_flags, const int defbase_tot); diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c index 371f64fd468..edeef26ed58 100644 --- a/source/blender/blenkernel/intern/deform.c +++ b/source/blender/blenkernel/intern/deform.c @@ -80,7 +80,21 @@ bDeformGroup *defgroup_duplicate(bDeformGroup *ingroup) return outgroup; } -/* copy & overwrite weights */ +/* overwrite weights filtered by vgroup_subset + * - do nothing if neither are set. + * - add destination weight if needed + */ +void defvert_copy_subset(MDeformVert *dvert_dst, const MDeformVert *dvert_src, + const bool *vgroup_subset, const int vgroup_tot) +{ + int defgroup; + for (defgroup=0; defgroup < vgroup_tot; defgroup++) { + if (vgroup_subset[defgroup]) { + defvert_copy_index(dvert_dst, dvert_src, defgroup); + } + } +} + void defvert_copy(MDeformVert *dvert_dst, const MDeformVert *dvert_src) { if (dvert_dst->totweight == dvert_src->totweight) { @@ -181,6 +195,35 @@ void defvert_remap(MDeformVert *dvert, int *map, const int map_len) } } +/** + * Same as #defvert_normalize but takes a bool array. + */ +void defvert_normalize_subset(MDeformVert *dvert, + const bool *vgroup_subset, const int vgroup_tot) +{ + MDeformWeight *dw; + unsigned int i; + float tot_weight = 0.0f; + + for (i = dvert->totweight, dw = dvert->dw; i != 0; i--, dw++) { + if ((dw->def_nr < vgroup_tot) && vgroup_subset[dw->def_nr]) { + tot_weight += dw->weight; + } + } + + if (tot_weight > 0.0f) { + float scalar = 1.0f / tot_weight; + for (i = dvert->totweight, dw = dvert->dw; i != 0; i--, dw++) { + if ((dw->def_nr < vgroup_tot) && vgroup_subset[dw->def_nr]) { + dw->weight *= scalar; + + /* in case of division errors with very low weights */ + CLAMP(dw->weight, 0.0f, 1.0f); + } + } + } +} + void defvert_normalize(MDeformVert *dvert) { if (dvert->totweight <= 0) { |