Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Batt <benbatt@gmail.com>2007-04-30 20:49:12 +0400
committerBen Batt <benbatt@gmail.com>2007-04-30 20:49:12 +0400
commit469208a10121e6e859b6fe7025bafe3d9f892fd7 (patch)
treea5e667171d5549f7b64c4b63c09e3de06b9e67e4
parent0b66fe6a4849b3916793cd815ffb8c0d67885cdc (diff)
Patch #6192 - Wave Modifier Option to move verts along normals
This patch adds an option to the wave modifier to displace along the normals of the base mesh, rather than in the local Z direction. Thanks to Michael Fox (mfoxdoggg) for the patch!
-rw-r--r--source/blender/blenkernel/intern/modifier.c48
-rw-r--r--source/blender/makesdna/DNA_effect_types.h5
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h9
-rw-r--r--source/blender/python/api2_2x/Modifier.c2
-rw-r--r--source/blender/src/buttons_editing.c22
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