From ba98e6148b7f8ca1b9040c5555b7dfa011c13b90 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 25 Jun 2015 15:59:48 +1000 Subject: API calls for converting weights to float array --- source/blender/editors/include/ED_mesh.h | 5 ++++ source/blender/editors/object/object_vgroup.c | 42 +++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) 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, -- cgit v1.2.3