Patch #8882 - Falloff in the wave modifier

This patch adds the ability to specify a falloff radius in the Wave modifier.
Currently only linear falloff is supported.

Thanks to Michael Fox for the patch!
This commit is contained in:
Ben Batt 2008-06-18 15:22:42 +00:00
parent 3f488f4d70
commit 55433f51d8
3 changed files with 39 additions and 10 deletions

@ -4541,6 +4541,7 @@ static void waveModifier_initData(ModifierData *md)
wmd->narrow= 1.5f; wmd->narrow= 1.5f;
wmd->lifetime= 0.0f; wmd->lifetime= 0.0f;
wmd->damp= 10.0f; wmd->damp= 10.0f;
wmd->falloff= 0.0f;
wmd->texmapping = MOD_WAV_MAP_LOCAL; wmd->texmapping = MOD_WAV_MAP_LOCAL;
wmd->defgrp_name[0] = 0; wmd->defgrp_name[0] = 0;
} }
@ -4560,6 +4561,7 @@ static void waveModifier_copyData(ModifierData *md, ModifierData *target)
twmd->starty = wmd->starty; twmd->starty = wmd->starty;
twmd->timeoffs = wmd->timeoffs; twmd->timeoffs = wmd->timeoffs;
twmd->width = wmd->width; twmd->width = wmd->width;
twmd->falloff = wmd->falloff;
twmd->objectcenter = wmd->objectcenter; twmd->objectcenter = wmd->objectcenter;
twmd->texture = wmd->texture; twmd->texture = wmd->texture;
twmd->map_object = wmd->map_object; twmd->map_object = wmd->map_object;
@ -4791,6 +4793,8 @@ static void waveModifier_do(
float x = co[0] - wmd->startx; float x = co[0] - wmd->startx;
float y = co[1] - wmd->starty; float y = co[1] - wmd->starty;
float amplit= 0.0f; float amplit= 0.0f;
float dist = 0.0f;
float falloff_fac = 0.0f;
TexResult texres; TexResult texres;
MDeformWeight *def_weight = NULL; MDeformWeight *def_weight = NULL;
@ -4813,6 +4817,21 @@ static void waveModifier_do(
get_texture_value(wmd->texture, tex_co[i], &texres); get_texture_value(wmd->texture, tex_co[i], &texres);
} }
/*get dist*/
if(wmd->flag & MOD_WAVE_X) {
if(wmd->flag & MOD_WAVE_Y){
dist = (float)sqrt(x*x + y*y);
}
else{
dist = fabs(x);
}
}
else if(wmd->flag & MOD_WAVE_Y) {
dist = fabs(y);
}
falloff_fac = (1.0-(dist / wmd->falloff));
CLAMP(falloff_fac,0,1);
if(wmd->flag & MOD_WAVE_X) { if(wmd->flag & MOD_WAVE_X) {
if(wmd->flag & MOD_WAVE_Y) amplit = (float)sqrt(x*x + y*y); if(wmd->flag & MOD_WAVE_Y) amplit = (float)sqrt(x*x + y*y);
@ -4833,12 +4852,19 @@ static void waveModifier_do(
if(amplit > -wmd->width && amplit < wmd->width) { if(amplit > -wmd->width && amplit < wmd->width) {
amplit = amplit * wmd->narrow; amplit = amplit * wmd->narrow;
amplit = (float)(1.0 / exp(amplit * amplit) - minfac); amplit = (float)(1.0 / exp(amplit * amplit) - minfac);
/*apply texture*/
if(wmd->texture) if(wmd->texture)
amplit = amplit * texres.tin; amplit = amplit * texres.tin;
/*apply weight*/
if(def_weight) if(def_weight)
amplit = amplit * def_weight->weight; amplit = amplit * def_weight->weight;
/*apply falloff*/
if (wmd->falloff > 0)
amplit = amplit * falloff_fac;
if(mvert) { if(mvert) {
/* move along normals */ /* move along normals */
if(wmd->flag & MOD_WAVE_NORM_X) { if(wmd->flag & MOD_WAVE_NORM_X) {

@ -329,13 +329,14 @@ typedef struct WaveModifierData {
short flag, pad; short flag, pad;
float startx, starty, height, width; float startx, starty, height, width;
float narrow, speed, damp; float narrow, speed, damp, falloff;
int texmapping, uvlayer_tmp; int texmapping, uvlayer_tmp;
char uvlayer_name[32]; char uvlayer_name[32];
float timeoffs, lifetime; float timeoffs, lifetime;
float pad1;
} WaveModifierData; } WaveModifierData;
typedef struct ArmatureModifierData { typedef struct ArmatureModifierData {

@ -1792,7 +1792,7 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
height = 143; height = 143;
} else if (md->type==eModifierType_Wave) { } else if (md->type==eModifierType_Wave) {
WaveModifierData *wmd = (WaveModifierData *)md; WaveModifierData *wmd = (WaveModifierData *)md;
height = 294; height = 315;
if(wmd->texmapping == MOD_WAV_MAP_OBJECT || if(wmd->texmapping == MOD_WAV_MAP_OBJECT ||
wmd->texmapping == MOD_WAV_MAP_UV) wmd->texmapping == MOD_WAV_MAP_UV)
height += 19; height += 19;
@ -2154,6 +2154,8 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
uiDefButF(block, NUM, B_MODIFIER_RECALC, "Time end:", lx,(cy-=19),buttonWidth,19, &wmd->timeoffs, -MAXFRAMEF, MAXFRAMEF, 100, 0, "Specify ending frame of the wave"); uiDefButF(block, NUM, B_MODIFIER_RECALC, "Time end:", lx,(cy-=19),buttonWidth,19, &wmd->timeoffs, -MAXFRAMEF, MAXFRAMEF, 100, 0, "Specify ending frame of the wave");
uiDefButF(block, NUM, B_MODIFIER_RECALC, "Lifetime:", lx,(cy-=19),buttonWidth,19, &wmd->lifetime, -MAXFRAMEF, MAXFRAMEF, 100, 0, "Specify the lifespan of the wave"); uiDefButF(block, NUM, B_MODIFIER_RECALC, "Lifetime:", lx,(cy-=19),buttonWidth,19, &wmd->lifetime, -MAXFRAMEF, MAXFRAMEF, 100, 0, "Specify the lifespan of the wave");
uiDefButF(block, NUM, B_MODIFIER_RECALC, "Damptime:", lx,(cy-=19),buttonWidth,19, &wmd->damp, -MAXFRAMEF, MAXFRAMEF, 100, 0, "Specify the dampingtime of the wave"); uiDefButF(block, NUM, B_MODIFIER_RECALC, "Damptime:", lx,(cy-=19),buttonWidth,19, &wmd->damp, -MAXFRAMEF, MAXFRAMEF, 100, 0, "Specify the dampingtime of the wave");
uiDefButF(block, NUM, B_MODIFIER_RECALC, "Falloff:", lx,(cy-=19),buttonWidth,19, &wmd->falloff, 0, 100, 100, 0, "Specify the falloff radius of the waves");
cy -= 9; cy -= 9;
uiBlockBeginAlign(block); uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_MODIFIER_RECALC, "Sta x:", lx,(cy-=19),113,19, &wmd->startx, -100.0, 100.0, 100, 0, "Starting position for the X axis"); uiDefButF(block, NUM, B_MODIFIER_RECALC, "Sta x:", lx,(cy-=19),113,19, &wmd->startx, -100.0, 100.0, 100, 0, "Starting position for the X axis");