diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 3b71f3e1bd8..9dee6dc00b9 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -2846,6 +2846,7 @@ static void waveModifier_initData(ModifierData *md) wmd->flag |= (WAV_X+WAV_Y+WAV_CYCL); + wmd->objectcenter = NULL; wmd->height= 0.5f; wmd->width= 1.5f; wmd->speed= 0.5f; @@ -2869,6 +2870,7 @@ static void waveModifier_copyData(ModifierData *md, ModifierData *target) twmd->starty = wmd->starty; twmd->timeoffs = wmd->timeoffs; twmd->width = wmd->width; + twmd->objectcenter = wmd->objectcenter; } static int waveModifier_dependsOnTime(ModifierData *md) @@ -2876,6 +2878,29 @@ static int waveModifier_dependsOnTime(ModifierData *md) return 1; } +static void waveModifier_foreachObjectLink( + ModifierData *md, Object *ob, + void (*walk)(void *userData, Object *ob, Object **obpoin), + void *userData) +{ + WaveModifierData *wmd = (WaveModifierData*) md; + + walk(userData, ob, &wmd->objectcenter); +} + +static void waveModifier_updateDepgraph( + ModifierData *md, DagForest *forest, Object *ob, + DagNode *obNode) +{ + WaveModifierData *wmd = (WaveModifierData*) md; + + if(wmd->objectcenter) { + DagNode *curNode = dag_get_node(forest, wmd->objectcenter); + + dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA); + } +} + static void waveModifier_deformVerts( ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) @@ -2886,6 +2911,16 @@ static void waveModifier_deformVerts( (float)(1.0 / exp(wmd->width * wmd->narrow * wmd->width * wmd->narrow)); float lifefac = wmd->height; + if(wmd->objectcenter){ + float mat[4][4]; + /* get the control object's location in local coordinates */ + Mat4Invert(ob->imat, ob->obmat); + Mat4MulMat4(mat, wmd->objectcenter->obmat, ob->imat); + + wmd->startx = mat[3][0]; + wmd->starty = mat[3][1]; + } + if(wmd->damp == 0) wmd->damp = 10.0f; if(wmd->lifetime != 0.0) { @@ -3432,6 +3467,8 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type) mti->initData = waveModifier_initData; mti->copyData = waveModifier_copyData; mti->dependsOnTime = waveModifier_dependsOnTime; + mti->foreachObjectLink = waveModifier_foreachObjectLink; + mti->updateDepgraph = waveModifier_updateDepgraph; mti->deformVerts = waveModifier_deformVerts; mti->deformVertsEM = waveModifier_deformVertsEM; diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 65b694961bf..6b66ad37b2d 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -222,6 +222,8 @@ typedef struct DecimateModifierData { typedef struct WaveModifierData { ModifierData modifier; + struct Object *objectcenter; + short flag, pad; float startx, starty, height, width; diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c index 36fe274798d..70e20853a26 100644 --- a/source/blender/src/buttons_editing.c +++ b/source/blender/src/buttons_editing.c @@ -1359,7 +1359,7 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco } else if (md->type==eModifierType_Decimate) { height = 48; } else if (md->type==eModifierType_Wave) { - height = 200; + height = 248; } else if (md->type==eModifierType_Armature) { height = 67; } else if (md->type==eModifierType_Hook) { @@ -1541,6 +1541,8 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco 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 y:", lx+115,cy,105,19, &wmd->starty, -100.0, 100.0, 100, 0, "Starting position for the Y axis"); + uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_MODIFIER_RECALC, "Ob: ", lx, (cy-=19), 220,19, &wmd->objectcenter, "Object to use as Starting Position (leave blank to disable)"); + cy -= 19; uiBlockBeginAlign(block); uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Speed:", lx,(cy-=19),220,19, &wmd->speed, -2.0, 2.0, 0, 0, "Specify the wave speed"); uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Heigth:", lx,(cy-=19),220,19, &wmd->height, -2.0, 2.0, 0, 0, "Specify the amplitude of the wave");