diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/makesdna/DNA_modifier_types.h | 2 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_modifier.c | 12 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_weightvg_util.c | 3 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_weightvgproximity.c | 24 |
4 files changed, 41 insertions, 0 deletions
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index a693277b786..7f43659d8de 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -921,6 +921,8 @@ typedef struct WeightVGProximityModifierData { int mask_tex_mapping; /* How to map the texture! */ char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */ + float min_dist, max_dist; /* Distances mapping to 0.0/1.0 weights. */ + /* Padding… */ int pad_i2; } WeightVGProximityModifierData; diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index a6ba56cc590..17cf30d390f 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2781,6 +2781,18 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); + prop= RNA_def_property(srna, "min_dist", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_text(prop, "Lowest Dist", "Distance mapping to weight 0.0."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "max_dist", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_text(prop, "Highest Dist", "Distance mapping to weight 1.0."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + /* Common masking properties. */ rna_def_modifier_weightvg_mask(brna, srna); } diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index 1fe1a96c2e5..43cc3081199 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -192,6 +192,9 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, int *indice MDeformVert *dv = &dvert[indices ? indices[i] : i]; MDeformWeight *newdw; + /* Never allow weights out of [0.0, 1.0] range. */ + CLAMP(w, 0.0, 1.0); + /* Let’s first check to see if this vert is already in the weight group – if so * let’s update it, or remove it if needed. */ diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 537c5784d29..7272878b5b5 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -200,6 +200,27 @@ static float get_ob2ob_distance(const Object* ob, const Object* obr) return len_v3v3(ob->obmat[3], obr->obmat[3]); } +/** + * Maps distances to weights. + */ +void do_map(float *weights, const int nidx, const float min_d, const float max_d) +{ + int i; + float b = min_d / (min_d - max_d); + float a = -b / min_d; + for (i = 0; i < nidx; i++) + weights[i] = a * weights[i] + b; +} + +/*a min_d + b = 0.0*/ +/*a max_d + b = 1.0*/ +/*a min_d = -b*/ +/*a = -b / min_d*/ + +/*max_d(-b/min_d) + b = 1.0*/ +/*b((-max_d/min_d)+1.0) = 1.0*/ +/*b = 1.0 / ((min_d-max_d)/min_d)*/ +/*b = min_d/(min_d-max_d)*/ /************************************** * Modifiers functions. * **************************************/ @@ -476,6 +497,9 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel, wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); + /* Map distances to weights. */ + do_map(org_w, numIdx, wmd->min_dist, wmd->max_dist); + /* Update vgroup. Note we never add nor remove vertices from vgroup here. */ weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, 0, 0.0f, 0, 0.0f); |