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:
-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