diff options
-rw-r--r-- | source/blender/blenkernel/intern/modifier.c | 48 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_effect_types.h | 5 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_modifier_types.h | 9 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Modifier.c | 2 | ||||
-rw-r--r-- | source/blender/src/buttons_editing.c | 22 |
5 files changed, 68 insertions, 18 deletions
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index b20e8181d39..b4fd28312b8 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -4128,7 +4128,8 @@ static void waveModifier_initData(ModifierData *md) { WaveModifierData *wmd = (WaveModifierData*) md; // whadya know, moved here from Iraq - wmd->flag |= (WAV_X+WAV_Y+WAV_CYCL); + wmd->flag |= (MOD_WAVE_X | MOD_WAVE_Y | MOD_WAVE_CYCL + | MOD_WAVE_NORM_X | MOD_WAVE_NORM_Y | MOD_WAVE_NORM_Z); wmd->objectcenter = NULL; wmd->texture = NULL; @@ -4319,6 +4320,7 @@ static void waveModifier_do( float (*vertexCos)[3], int numVerts) { WaveModifierData *wmd = (WaveModifierData*) md; + MVert *mvert = NULL; MDeformVert *dvert = NULL; int defgrp_index; float ctime = bsystem_time(ob, 0, (float)G.scene->r.cfra, 0.0); @@ -4327,6 +4329,9 @@ static void waveModifier_do( float lifefac = wmd->height; float (*tex_co)[3]; + if(wmd->flag & MOD_WAVE_NORM && ob->type == OB_MESH) + mvert = dm->getVertArray(dm); + if(wmd->objectcenter){ float mat[4][4]; /* get the control object's location in local coordinates */ @@ -4406,17 +4411,17 @@ static void waveModifier_do( } - if(wmd->flag & WAV_X) { - if(wmd->flag & WAV_Y) amplit = (float)sqrt(x*x + y*y); + if(wmd->flag & MOD_WAVE_X) { + if(wmd->flag & MOD_WAVE_Y) amplit = (float)sqrt(x*x + y*y); else amplit = x; } - else if(wmd->flag & WAV_Y) + else if(wmd->flag & MOD_WAVE_Y) amplit= y; /* this way it makes nice circles */ amplit -= (ctime - wmd->timeoffs) * wmd->speed; - if(wmd->flag & WAV_CYCL) { + if(wmd->flag & MOD_WAVE_CYCL) { amplit = (float)fmod(amplit - wmd->width, 2.0 * wmd->width) + wmd->width; } @@ -4431,7 +4436,22 @@ static void waveModifier_do( if(def_weight) amplit = amplit * def_weight->weight; - co[2] += lifefac * amplit; + if(mvert) { + /* move along normals */ + if(wmd->flag & MOD_WAVE_NORM_X) { + co[0] += (lifefac * amplit) * mvert[i].no[0] / 32767.0f; + } + if(wmd->flag & MOD_WAVE_NORM_Y) { + co[1] += (lifefac * amplit) * mvert[i].no[1] / 32767.0f; + } + if(wmd->flag & MOD_WAVE_NORM_Z) { + co[2] += (lifefac * amplit) * mvert[i].no[2] / 32767.0f; + } + } + else { + /* move along local z axis */ + co[2] += lifefac * amplit; + } } } } @@ -4446,11 +4466,17 @@ static void waveModifier_deformVerts( DerivedMesh *dm; WaveModifierData *wmd = (WaveModifierData *)md; - if(!wmd->texture && !wmd->defgrp_name[0]) dm = derivedData; + if(!wmd->texture && !wmd->defgrp_name[0] && !(wmd->flag & MOD_WAVE_NORM)) + dm = derivedData; else if(derivedData) dm = derivedData; else if(ob->type == OB_MESH) dm = CDDM_from_mesh(ob->data, ob); else return; + if(wmd->flag & MOD_WAVE_NORM) { + CDDM_apply_vert_coords(dm, vertexCos); + CDDM_calc_normals(dm); + } + waveModifier_do(wmd, ob, dm, vertexCos, numVerts); if(dm != derivedData) dm->release(dm); @@ -4463,10 +4489,16 @@ static void waveModifier_deformVertsEM( DerivedMesh *dm; WaveModifierData *wmd = (WaveModifierData *)md; - if(!wmd->texture && !wmd->defgrp_name[0]) dm = derivedData; + if(!wmd->texture && !wmd->defgrp_name[0] && !(wmd->flag & MOD_WAVE_NORM)) + dm = derivedData; else if(derivedData) dm = derivedData; else dm = CDDM_from_editmesh(editData, ob->data); + if(wmd->flag & MOD_WAVE_NORM) { + CDDM_apply_vert_coords(dm, vertexCos); + CDDM_calc_normals(dm); + } + waveModifier_do(wmd, ob, dm, vertexCos, numVerts); if(dm != derivedData) dm->release(dm); diff --git a/source/blender/makesdna/DNA_effect_types.h b/source/blender/makesdna/DNA_effect_types.h index 435a18e5ab2..4d910861acd 100644 --- a/source/blender/makesdna/DNA_effect_types.h +++ b/source/blender/makesdna/DNA_effect_types.h @@ -77,11 +77,6 @@ #define PAF_TEXRGB 1 #define PAF_TEXGRAD 2 - /* wav->flag */ -#define WAV_X 2 -#define WAV_Y 4 -#define WAV_CYCL 8 - typedef struct Effect { struct Effect *next, *prev; short type, flag, buttype, rt; diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index a7b68b09f1a..99f3a65bf43 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -278,6 +278,15 @@ enum { MOD_WAV_MAP_UV, }; +/* WaveModifierData.flag */ +#define MOD_WAVE_X 1<<1 +#define MOD_WAVE_Y 1<<2 +#define MOD_WAVE_CYCL 1<<3 +#define MOD_WAVE_NORM 1<<4 +#define MOD_WAVE_NORM_X 1<<5 +#define MOD_WAVE_NORM_Y 1<<6 +#define MOD_WAVE_NORM_Z 1<<7 + typedef struct WaveModifierData { ModifierData modifier; diff --git a/source/blender/python/api2_2x/Modifier.c b/source/blender/python/api2_2x/Modifier.c index 694a0dbfbfe..a0fb796a4a4 100644 --- a/source/blender/python/api2_2x/Modifier.c +++ b/source/blender/python/api2_2x/Modifier.c @@ -743,7 +743,7 @@ static int wave_setter( BPy_Modifier *self, int type, PyObject *value ) return EXPP_setFloatClamped( value, &md->timeoffs, -1000.0, 1000.0 ); case EXPP_MOD_FLAG: return EXPP_setIValueRange( value, &md->flag, 0, - WAV_X+WAV_Y+WAV_CYCL, 'h' ); + MOD_WAVE_X | MOD_WAVE_Y | MOD_WAVE_CYCL, 'h' ); default: return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); } diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c index 699669675e5..3700dc17980 100644 --- a/source/blender/src/buttons_editing.c +++ b/source/blender/src/buttons_editing.c @@ -1607,10 +1607,12 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco height = 143; } else if (md->type==eModifierType_Wave) { WaveModifierData *wmd = (WaveModifierData *)md; - height = 275; + height = 294; if(wmd->texmapping == MOD_WAV_MAP_OBJECT || wmd->texmapping == MOD_WAV_MAP_UV) height += 19; + if(wmd->flag & MOD_WAVE_NORM) + height += 19; } else if (md->type==eModifierType_Armature) { height = 67; } else if (md->type==eModifierType_Hook) { @@ -1862,9 +1864,21 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco } } else if (md->type==eModifierType_Wave) { WaveModifierData *wmd = (WaveModifierData*) md; - uiDefButBitS(block, TOG, WAV_X, B_MODIFIER_RECALC, "X", lx,(cy-=19),45,19, &wmd->flag, 0, 0, 0, 0, "Enable X axis motion"); - uiDefButBitS(block, TOG, WAV_Y, B_MODIFIER_RECALC, "Y", lx+45,cy,45,19, &wmd->flag, 0, 0, 0, 0, "Enable Y axis motion"); - uiDefButBitS(block, TOG, WAV_CYCL, B_MODIFIER_RECALC, "Cycl", lx+90,cy,buttonWidth-90,19, &wmd->flag, 0, 0, 0, 0, "Enable cyclic wave effect"); + uiDefButBitS(block, TOG, MOD_WAVE_X, B_MODIFIER_RECALC, "X", lx,(cy-=19),45,19, &wmd->flag, 0, 0, 0, 0, "Enable X axis motion"); + uiDefButBitS(block, TOG, MOD_WAVE_Y, B_MODIFIER_RECALC, "Y", lx+45,cy,45,19, &wmd->flag, 0, 0, 0, 0, "Enable Y axis motion"); + uiDefButBitS(block, TOG, MOD_WAVE_CYCL, B_MODIFIER_RECALC, "Cycl", lx+90,cy,buttonWidth-90,19, &wmd->flag, 0, 0, 0, 0, "Enable cyclic wave effect"); + uiDefButBitS(block, TOG, MOD_WAVE_NORM, B_MODIFIER_RECALC, "Normals", lx,(cy-=19),buttonWidth,19, &wmd->flag, 0, 0, 0, 0, "Displace along normals"); + if (wmd->flag & MOD_WAVE_NORM){ + if (ob->type==OB_MESH) { + uiDefButBitS(block, TOG, MOD_WAVE_NORM_X, B_MODIFIER_RECALC, "X", lx,(cy-=19),buttonWidth/3,19, &wmd->flag, 0, 0, 0, 0, "Enable displacement along the X normal"); + uiDefButBitS(block, TOG, MOD_WAVE_NORM_Y, B_MODIFIER_RECALC, "Y", lx+(buttonWidth/3),cy,buttonWidth/3,19, &wmd->flag, 0, 0, 0, 0, "Enable displacement along the Y normal"); + uiDefButBitS(block, TOG, MOD_WAVE_NORM_Z, B_MODIFIER_RECALC, "Z", lx+(buttonWidth/3)*2,cy,buttonWidth/3,19, &wmd->flag, 0, 0, 0, 0, "Enable displacement along the Z normal"); + } + else + uiDefBut(block, LABEL, 1, "Meshes Only", lx, (cy-=19), buttonWidth,19, NULL, 0.0, 0.0, 0, 0, ""); + } + + uiBlockBeginAlign(block); if(wmd->speed >= 0) uiDefButF(block, NUM, B_MODIFIER_RECALC, "Time sta:", lx,(cy-=19),buttonWidth,19, &wmd->timeoffs, -1000.0, 1000.0, 100, 0, "Specify starting frame of the wave"); else |