Patch #5181: Option to use an object to determine the startX&Y in the
Wave Modifier This patch allows the option to use an object to determine the wave modifier's start X & Y, it also allows for animated objects giving a moving wave start X & Y. Thanks to Michael Fox for the patch!
This commit is contained in:
@@ -2846,6 +2846,7 @@ static void waveModifier_initData(ModifierData *md)
|
|||||||
|
|
||||||
wmd->flag |= (WAV_X+WAV_Y+WAV_CYCL);
|
wmd->flag |= (WAV_X+WAV_Y+WAV_CYCL);
|
||||||
|
|
||||||
|
wmd->objectcenter = NULL;
|
||||||
wmd->height= 0.5f;
|
wmd->height= 0.5f;
|
||||||
wmd->width= 1.5f;
|
wmd->width= 1.5f;
|
||||||
wmd->speed= 0.5f;
|
wmd->speed= 0.5f;
|
||||||
@@ -2869,6 +2870,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->objectcenter = wmd->objectcenter;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int waveModifier_dependsOnTime(ModifierData *md)
|
static int waveModifier_dependsOnTime(ModifierData *md)
|
||||||
@@ -2876,6 +2878,29 @@ static int waveModifier_dependsOnTime(ModifierData *md)
|
|||||||
return 1;
|
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(
|
static void waveModifier_deformVerts(
|
||||||
ModifierData *md, Object *ob, DerivedMesh *derivedData,
|
ModifierData *md, Object *ob, DerivedMesh *derivedData,
|
||||||
float (*vertexCos)[3], int numVerts)
|
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)(1.0 / exp(wmd->width * wmd->narrow * wmd->width * wmd->narrow));
|
||||||
float lifefac = wmd->height;
|
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->damp == 0) wmd->damp = 10.0f;
|
||||||
|
|
||||||
if(wmd->lifetime != 0.0) {
|
if(wmd->lifetime != 0.0) {
|
||||||
@@ -3432,6 +3467,8 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
|
|||||||
mti->initData = waveModifier_initData;
|
mti->initData = waveModifier_initData;
|
||||||
mti->copyData = waveModifier_copyData;
|
mti->copyData = waveModifier_copyData;
|
||||||
mti->dependsOnTime = waveModifier_dependsOnTime;
|
mti->dependsOnTime = waveModifier_dependsOnTime;
|
||||||
|
mti->foreachObjectLink = waveModifier_foreachObjectLink;
|
||||||
|
mti->updateDepgraph = waveModifier_updateDepgraph;
|
||||||
mti->deformVerts = waveModifier_deformVerts;
|
mti->deformVerts = waveModifier_deformVerts;
|
||||||
mti->deformVertsEM = waveModifier_deformVertsEM;
|
mti->deformVertsEM = waveModifier_deformVertsEM;
|
||||||
|
|
||||||
|
|||||||
@@ -222,6 +222,8 @@ typedef struct DecimateModifierData {
|
|||||||
typedef struct WaveModifierData {
|
typedef struct WaveModifierData {
|
||||||
ModifierData modifier;
|
ModifierData modifier;
|
||||||
|
|
||||||
|
struct Object *objectcenter;
|
||||||
|
|
||||||
short flag, pad;
|
short flag, pad;
|
||||||
|
|
||||||
float startx, starty, height, width;
|
float startx, starty, height, width;
|
||||||
|
|||||||
@@ -1359,7 +1359,7 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
|
|||||||
} else if (md->type==eModifierType_Decimate) {
|
} else if (md->type==eModifierType_Decimate) {
|
||||||
height = 48;
|
height = 48;
|
||||||
} else if (md->type==eModifierType_Wave) {
|
} else if (md->type==eModifierType_Wave) {
|
||||||
height = 200;
|
height = 248;
|
||||||
} else if (md->type==eModifierType_Armature) {
|
} else if (md->type==eModifierType_Armature) {
|
||||||
height = 67;
|
height = 67;
|
||||||
} else if (md->type==eModifierType_Hook) {
|
} else if (md->type==eModifierType_Hook) {
|
||||||
@@ -1541,6 +1541,8 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
|
|||||||
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");
|
||||||
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");
|
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);
|
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, "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");
|
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");
|
||||||
|
|||||||
Reference in New Issue
Block a user