forked from bartvdbraak/blender
Patch #6582 - Weight groups in the wave modifier
This patch adds vertex group functionality to the wave modifier, allowing the user to specify a vertex group with which to modulate the wave deformation. Thanks to Michael Fox (mfoxdoggg) for the patch!
This commit is contained in:
parent
8355326e01
commit
0b66fe6a48
@ -4140,6 +4140,7 @@ static void waveModifier_initData(ModifierData *md)
|
||||
wmd->lifetime= 0.0f;
|
||||
wmd->damp= 10.0f;
|
||||
wmd->texmapping = MOD_WAV_MAP_LOCAL;
|
||||
wmd->defgrp_name[0] = 0;
|
||||
}
|
||||
|
||||
static void waveModifier_copyData(ModifierData *md, ModifierData *target)
|
||||
@ -4161,6 +4162,7 @@ static void waveModifier_copyData(ModifierData *md, ModifierData *target)
|
||||
twmd->texture = wmd->texture;
|
||||
twmd->map_object = wmd->map_object;
|
||||
twmd->texmapping = wmd->texmapping;
|
||||
strncpy(twmd->defgrp_name, wmd->defgrp_name, 32);
|
||||
}
|
||||
|
||||
static int waveModifier_dependsOnTime(ModifierData *md)
|
||||
@ -4217,6 +4219,10 @@ CustomDataMask waveModifier_requiredDataMask(ModifierData *md)
|
||||
if(wmd->texture && wmd->texmapping == MOD_WAV_MAP_UV)
|
||||
dataMask |= (1 << CD_MTFACE);
|
||||
|
||||
/* ask for vertexgroups if we need them */
|
||||
if(wmd->defgrp_name[0])
|
||||
dataMask |= (1 << CD_MDEFORMVERT);
|
||||
|
||||
return dataMask;
|
||||
}
|
||||
|
||||
@ -4313,6 +4319,8 @@ static void waveModifier_do(
|
||||
float (*vertexCos)[3], int numVerts)
|
||||
{
|
||||
WaveModifierData *wmd = (WaveModifierData*) md;
|
||||
MDeformVert *dvert = NULL;
|
||||
int defgrp_index;
|
||||
float ctime = bsystem_time(ob, 0, (float)G.scene->r.cfra, 0.0);
|
||||
float minfac =
|
||||
(float)(1.0 / exp(wmd->width * wmd->narrow * wmd->width * wmd->narrow));
|
||||
@ -4329,6 +4337,24 @@ static void waveModifier_do(
|
||||
wmd->starty = mat[3][1];
|
||||
}
|
||||
|
||||
/* get the index of the deform group */
|
||||
defgrp_index = -1;
|
||||
|
||||
if(wmd->defgrp_name[0]) {
|
||||
int i;
|
||||
bDeformGroup *def;
|
||||
for(i = 0, def = ob->defbase.first; def; def = def->next, i++) {
|
||||
if(!strcmp(def->name, wmd->defgrp_name)) {
|
||||
defgrp_index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(defgrp_index >= 0){
|
||||
dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
|
||||
}
|
||||
|
||||
if(wmd->damp == 0) wmd->damp = 10.0f;
|
||||
|
||||
if(wmd->lifetime != 0.0) {
|
||||
@ -4358,6 +4384,21 @@ static void waveModifier_do(
|
||||
float y = co[1] - wmd->starty;
|
||||
float amplit= 0.0f;
|
||||
TexResult texres;
|
||||
MDeformWeight *def_weight = NULL;
|
||||
|
||||
/* get weights */
|
||||
if(dvert) {
|
||||
int j;
|
||||
for(j = 0; j < dvert[i].totweight; ++j) {
|
||||
if(dvert[i].dw[j].def_nr == defgrp_index) {
|
||||
def_weight = &dvert[i].dw[j];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* if this vert isn't in the vgroup, don't deform it */
|
||||
if(!def_weight) continue;
|
||||
}
|
||||
|
||||
if(wmd->texture) {
|
||||
texres.nor = NULL;
|
||||
@ -4387,6 +4428,9 @@ static void waveModifier_do(
|
||||
if(wmd->texture)
|
||||
amplit = amplit * texres.tin;
|
||||
|
||||
if(def_weight)
|
||||
amplit = amplit * def_weight->weight;
|
||||
|
||||
co[2] += lifefac * amplit;
|
||||
}
|
||||
}
|
||||
@ -4402,7 +4446,8 @@ static void waveModifier_deformVerts(
|
||||
DerivedMesh *dm;
|
||||
WaveModifierData *wmd = (WaveModifierData *)md;
|
||||
|
||||
if(!wmd->texture || derivedData) dm = derivedData;
|
||||
if(!wmd->texture && !wmd->defgrp_name[0]) dm = derivedData;
|
||||
else if(derivedData) dm = derivedData;
|
||||
else if(ob->type == OB_MESH) dm = CDDM_from_mesh(ob->data, ob);
|
||||
else return;
|
||||
|
||||
@ -4418,7 +4463,8 @@ static void waveModifier_deformVertsEM(
|
||||
DerivedMesh *dm;
|
||||
WaveModifierData *wmd = (WaveModifierData *)md;
|
||||
|
||||
if(!wmd->texture || derivedData) dm = derivedData;
|
||||
if(!wmd->texture && !wmd->defgrp_name[0]) dm = derivedData;
|
||||
else if(derivedData) dm = derivedData;
|
||||
else dm = CDDM_from_editmesh(editData, ob->data);
|
||||
|
||||
waveModifier_do(wmd, ob, dm, vertexCos, numVerts);
|
||||
|
@ -282,6 +282,7 @@ typedef struct WaveModifierData {
|
||||
ModifierData modifier;
|
||||
|
||||
struct Object *objectcenter;
|
||||
char defgrp_name[32];
|
||||
struct Tex *texture;
|
||||
struct Object *map_object;
|
||||
|
||||
|
@ -1604,11 +1604,10 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
|
||||
} else if (md->type==eModifierType_Smooth) {
|
||||
height = 86;
|
||||
} else if (md->type==eModifierType_Cast) {
|
||||
height = 124;
|
||||
height += 19;
|
||||
height = 143;
|
||||
} else if (md->type==eModifierType_Wave) {
|
||||
WaveModifierData *wmd = (WaveModifierData *)md;
|
||||
height = 280;
|
||||
height = 275;
|
||||
if(wmd->texmapping == MOD_WAV_MAP_OBJECT ||
|
||||
wmd->texmapping == MOD_WAV_MAP_UV)
|
||||
height += 19;
|
||||
@ -1872,11 +1871,12 @@ 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, -1000.0, 1000.0, 100, 0, "Specify ending frame of the wave");
|
||||
uiDefButF(block, NUM, B_MODIFIER_RECALC, "Lifetime:", lx,(cy-=19),buttonWidth,19, &wmd->lifetime, -1000.0, 1000.0, 100, 0, "Specify the lifespan of the wave");
|
||||
uiDefButF(block, NUM, B_MODIFIER_RECALC, "Damptime:", lx,(cy-=19),buttonWidth,19, &wmd->damp, -1000.0, 1000.0, 100, 0, "Specify the dampingtime of the wave");
|
||||
cy -= 19;
|
||||
cy -= 9;
|
||||
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)");
|
||||
uiDefBut(block, TEX, B_MODIFIER_RECALC, "VGroup: ",lx, (cy -= 19), 220, 19,&wmd->defgrp_name, 0.0, 31.0, 0, 0, "Name of vertex group with which to modulate displacement");
|
||||
uiDefIDPoinBut(block, modifier_testTexture, ID_TE, B_CHANGEDEP,"Texture: ", lx, (cy -= 19), 220, 19, &wmd->texture,"Texture with which to modulate wave");
|
||||
sprintf(str, "Texture Coordinates%%t"
|
||||
"|Local%%x%d|Global%%x%d|Object%%x%d|UV%%x%d",
|
||||
@ -1907,7 +1907,7 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
|
||||
&wmd->map_object,
|
||||
"Object to get texture coordinates from");
|
||||
}
|
||||
cy -= 19;
|
||||
cy -= 9;
|
||||
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, "Height:", lx,(cy-=19),220,19, &wmd->height, -2.0, 2.0, 0, 0, "Specify the amplitude of the wave");
|
||||
|
Loading…
Reference in New Issue
Block a user