forked from bartvdbraak/blender
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:
parent
3f488f4d70
commit
55433f51d8
@ -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");
|
||||||
|
Loading…
Reference in New Issue
Block a user