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:
authorAlexander Gavrilov <angavrilov@gmail.com>2016-02-08 16:18:45 +0300
committerCampbell Barton <ideasman42@gmail.com>2016-02-08 16:19:28 +0300
commitc6afa36f477573b0c074e6667904ff7d54143f19 (patch)
tree09a43111ad8383ac05daa9fb8292b7655d2b020e /source/blender/blenkernel/intern/deform.c
parent172143d4f8f570068ad7de6f86a2c184b50cf094 (diff)
Fix group flipping when syncing mirror weights
Corrects mirror syncing for invert, levels & smooth. Note that the code changed to process mirroring even if both verts are selected, since group flipping can mean that is still meaningful.
Diffstat (limited to 'source/blender/blenkernel/intern/deform.c')
-rw-r--r--source/blender/blenkernel/intern/deform.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c
index 574aa497d74..7052e0a7d25 100644
--- a/source/blender/blenkernel/intern/deform.c
+++ b/source/blender/blenkernel/intern/deform.c
@@ -119,7 +119,25 @@ void defvert_copy_subset(
int defgroup;
for (defgroup = 0; defgroup < vgroup_tot; defgroup++) {
if (vgroup_subset[defgroup]) {
- defvert_copy_index(dvert_dst, dvert_src, defgroup);
+ defvert_copy_index(dvert_dst, defgroup, dvert_src, defgroup);
+ }
+ }
+}
+
+/**
+ * Overwrite weights filtered by vgroup_subset and with mirroring specified by the flip map
+ * - do nothing if neither are set.
+ * - add destination weight if needed
+ */
+void defvert_mirror_subset(
+ MDeformVert *dvert_dst, const MDeformVert *dvert_src,
+ const bool *vgroup_subset, const int vgroup_tot,
+ const int *flip_map, const int flip_map_len)
+{
+ int defgroup;
+ for (defgroup = 0; defgroup < vgroup_tot && defgroup < flip_map_len; defgroup++) {
+ if (vgroup_subset[defgroup] && (dvert_dst != dvert_src || flip_map[defgroup] != defgroup)) {
+ defvert_copy_index(dvert_dst, flip_map[defgroup], dvert_src, defgroup);
}
}
}
@@ -148,20 +166,22 @@ void defvert_copy(MDeformVert *dvert_dst, const MDeformVert *dvert_src)
* - do nothing if neither are set.
* - add destination weight if needed.
*/
-void defvert_copy_index(MDeformVert *dvert_dst, const MDeformVert *dvert_src, const int defgroup)
+void defvert_copy_index(
+ MDeformVert *dvert_dst, const int defgroup_dst,
+ const MDeformVert *dvert_src, const int defgroup_src)
{
MDeformWeight *dw_src, *dw_dst;
- dw_src = defvert_find_index(dvert_src, defgroup);
+ dw_src = defvert_find_index(dvert_src, defgroup_src);
if (dw_src) {
/* source is valid, verify destination */
- dw_dst = defvert_verify_index(dvert_dst, defgroup);
+ dw_dst = defvert_verify_index(dvert_dst, defgroup_dst);
dw_dst->weight = dw_src->weight;
}
else {
/* source was NULL, assign zero, could also remove */
- dw_dst = defvert_find_index(dvert_dst, defgroup);
+ dw_dst = defvert_find_index(dvert_dst, defgroup_dst);
if (dw_dst) {
dw_dst->weight = 0.0f;