API calls for converting weights to float array

This commit is contained in:
Campbell Barton 2015-06-25 15:59:48 +10:00
parent 42314b32f2
commit ba98e6148b
2 changed files with 47 additions and 0 deletions

@ -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,

@ -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,