diff options
author | Campbell Barton <ideasman42@gmail.com> | 2015-06-25 08:59:48 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2015-06-25 09:17:24 +0300 |
commit | ba98e6148b7f8ca1b9040c5555b7dfa011c13b90 (patch) | |
tree | 2a2b8fc4837615b1c7695c4e942f5304f5d178c5 /source/blender/editors | |
parent | 42314b32f2bf026b6f2edd4f581ea15ba74be3b1 (diff) |
API calls for converting weights to float array
Diffstat (limited to 'source/blender/editors')
-rw-r--r-- | source/blender/editors/include/ED_mesh.h | 5 | ||||
-rw-r--r-- | source/blender/editors/object/object_vgroup.c | 42 |
2 files changed, 47 insertions, 0 deletions
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index 9534da622fb..8e19ec839d8 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -243,6 +243,11 @@ void ED_vgroup_parray_mirror_assign(struct Object *ob, void ED_vgroup_parray_remove_zero(struct MDeformVert **dvert_array, const int dvert_tot, const bool *vgroup_validmap, const int vgroup_tot, const float epsilon, const bool keep_single); +void ED_vgroup_parray_to_weight_array(const struct MDeformVert **dvert_array, const int dvert_tot, + float *dvert_weights, const int def_nr); +void ED_vgroup_parray_from_weight_array(struct MDeformVert **dvert_array, const int dvert_tot, + const float *dvert_weights, const int def_nr, + const bool remove_zero); void ED_vgroup_mirror(struct Object *ob, const bool mirror_weights, const bool flip_vgroups, const bool all_vgroups, const bool use_topology, diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index c8aa4a1011b..d586e35de18 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -427,6 +427,48 @@ bool ED_vgroup_array_copy(Object *ob, Object *ob_from) return true; } +void ED_vgroup_parray_to_weight_array( + const MDeformVert **dvert_array, const int dvert_tot, + float *dvert_weights, const int def_nr) +{ + int i; + + for (i = 0; i < dvert_tot; i++) { + const MDeformVert *dv = dvert_array[i]; + dvert_weights[i] = dv ? defvert_find_weight(dv, def_nr) : 0.0f; + } +} + +void ED_vgroup_parray_from_weight_array( + MDeformVert **dvert_array, const int dvert_tot, + const float *dvert_weights, const int def_nr, const bool remove_zero) +{ + int i; + + for (i = 0; i < dvert_tot; i++) { + MDeformVert *dv = dvert_array[i]; + if (dv) { + if (dvert_weights[i] > 0.0f) { + MDeformWeight *dw = defvert_verify_index(dv, def_nr); + BLI_assert(IN_RANGE_INCL(dvert_weights[i], 0.0f, 1.0f)); + dw->weight = dvert_weights[i]; + } + else { + MDeformWeight *dw = defvert_find_index(dv, def_nr); + if (dw) { + if (remove_zero) { + defvert_remove_group(dv, dw); + } + else { + dw->weight = 0.0f; + } + } + } + } + } +} + + /* TODO, cache flip data to speedup calls within a loop. */ static void mesh_defvert_mirror_update_internal(Object *ob, MDeformVert *dvert_dst, MDeformVert *dvert_src, |