15 #ifndef _NOISEFIELD_H_ 16 #define _NOISEFIELD_H_ 24 #define NOISE_TILE_SIZE 128 32 if(mNoiseTile) {
delete mNoiseTile; mNoiseTile=NULL; }
43 Real*
data() {
return mNoiseTile; }
49 std::string toString();
52 PYTHON(name=posOffset)
Vec3 mPosOffset;
53 PYTHON(name=posScale)
Vec3 mPosScale;
55 PYTHON(name=valOffset) Real mValOffset;
56 PYTHON(name=valScale) Real mValScale;
58 PYTHON(name=clamp)
bool mClamp;
59 PYTHON(name=clampNeg) Real mClampNeg;
60 PYTHON(name=clampPos) Real mClampPos;
62 PYTHON(name=timeAnim) Real mTimeAnim;
66 static inline Real WNoiseDx (
const Vec3& p, Real *
data);
67 static inline Vec3 WNoiseVec(
const Vec3& p, Real *data);
68 static inline Real WNoise (
const Vec3& p, Real *data);
71 static void downsample(Real *from, Real *to,
int n,
int stride);
72 static void upsample (Real *from, Real *to,
int n,
int stride);
75 static void downsampleNeumann(
const Real *from, Real *to,
int n,
int stride);
76 static void upsampleNeumann (
const Real *from, Real *to,
int n,
int stride);
78 static inline int modSlow(
int x,
int n) {
int m = x % n;
return (m<0) ? m+n : m; }
80 #define modFast128(x) ((x) & 127) 82 inline Real getTime() {
return mParent->getTime() * mParent->getDx() * mTimeAnim; }
85 void generateTile(
int loadFromFile );
89 Real mGsInvX, mGsInvY, mGsInvZ;
93 static Real* mNoiseTile;
95 static int randomSeed;
103 #define ADD_WEIGHTED(x,y,z)\ 105 xC = modFast128(midX + (x));\ 106 weight *= w[0][(x) + 1];\ 107 yC = modFast128(midY + (y));\ 108 weight *= w[1][(y) + 1];\ 109 zC = modFast128(midZ + (z));\ 110 weight *= w[2][(z) + 1];\ 111 result += weight * data[(zC * NOISE_TILE_SIZE + yC) * NOISE_TILE_SIZE + xC]; 116 inline Real WaveletNoiseField::WNoiseDx(
const Vec3& p, Real *
data) {
117 Real w[3][3], t, result = 0;
120 int midX = (int)ceil(p[0] - 0.5f);
121 t = midX - (p[0] - 0.5f);
124 w[0][1] = 2.0f * t - 1.0f;
126 int midY = (int)ceil(p[1] - 0.5f);
127 t = midY - (p[1] - 0.5f);
128 w[1][0] = t * t * 0.5f;
129 w[1][2] = (1.f - t) * (1.f - t) *0.5f;
130 w[1][1] = 1.f - w[1][0] - w[1][2];
132 int midZ = (int)ceil(p[2] - 0.5f);
133 t = midZ - (p[2] - 0.5f);
134 w[2][0] = t * t * 0.5f;
135 w[2][2] = (1.f - t) * (1.f - t) *0.5f;
136 w[2][1] = 1.f - w[2][0] - w[2][2];
142 ADD_WEIGHTED(-1,-1, -1); ADD_WEIGHTED( 0,-1, -1); ADD_WEIGHTED( 1,-1, -1);
143 ADD_WEIGHTED(-1, 0, -1); ADD_WEIGHTED( 0, 0, -1); ADD_WEIGHTED( 1, 0, -1);
144 ADD_WEIGHTED(-1, 1, -1); ADD_WEIGHTED( 0, 1, -1); ADD_WEIGHTED( 1, 1, -1);
146 ADD_WEIGHTED(-1,-1, 0); ADD_WEIGHTED( 0,-1, 0); ADD_WEIGHTED( 1,-1, 0);
147 ADD_WEIGHTED(-1, 0, 0); ADD_WEIGHTED( 0, 0, 0); ADD_WEIGHTED( 1, 0, 0);
148 ADD_WEIGHTED(-1, 1, 0); ADD_WEIGHTED( 0, 1, 0); ADD_WEIGHTED( 1, 1, 0);
150 ADD_WEIGHTED(-1,-1, 1); ADD_WEIGHTED( 0,-1, 1); ADD_WEIGHTED( 1,-1, 1);
151 ADD_WEIGHTED(-1, 0, 1); ADD_WEIGHTED( 0, 0, 1); ADD_WEIGHTED( 1, 0, 1);
152 ADD_WEIGHTED(-1, 1, 1); ADD_WEIGHTED( 0, 1, 1); ADD_WEIGHTED( 1, 1, 1);
157 inline Real WaveletNoiseField::WNoise(
const Vec3& p, Real *data) {
158 Real w[3][3], t, result = 0;
161 int midX = (int)ceilf(p[0] - 0.5f);
162 t = midX - (p[0] - 0.5f);
163 w[0][0] = t * t * 0.5f;
164 w[0][2] = (1.f - t) * (1.f - t) *0.5f;
165 w[0][1] = 1.f - w[0][0] - w[0][2];
167 int midY = (int)ceilf(p[1] - 0.5f);
168 t = midY - (p[1] - 0.5f);
169 w[1][0] = t * t * 0.5f;
170 w[1][2] = (1.f - t) * (1.f - t) *0.5f;
171 w[1][1] = 1.f - w[1][0] - w[1][2];
173 int midZ = (int)ceilf(p[2] - 0.5f);
174 t = midZ - (p[2] - 0.5f);
175 w[2][0] = t * t * 0.5f;
176 w[2][2] = (1.f - t) * (1.f - t) *0.5f;
177 w[2][1] = 1.f - w[2][0] - w[2][2];
183 ADD_WEIGHTED(-1,-1, -1); ADD_WEIGHTED( 0,-1, -1); ADD_WEIGHTED( 1,-1, -1);
184 ADD_WEIGHTED(-1, 0, -1); ADD_WEIGHTED( 0, 0, -1); ADD_WEIGHTED( 1, 0, -1);
185 ADD_WEIGHTED(-1, 1, -1); ADD_WEIGHTED( 0, 1, -1); ADD_WEIGHTED( 1, 1, -1);
187 ADD_WEIGHTED(-1,-1, 0); ADD_WEIGHTED( 0,-1, 0); ADD_WEIGHTED( 1,-1, 0);
188 ADD_WEIGHTED(-1, 0, 0); ADD_WEIGHTED( 0, 0, 0); ADD_WEIGHTED( 1, 0, 0);
189 ADD_WEIGHTED(-1, 1, 0); ADD_WEIGHTED( 0, 1, 0); ADD_WEIGHTED( 1, 1, 0);
191 ADD_WEIGHTED(-1,-1, 1); ADD_WEIGHTED( 0,-1, 1); ADD_WEIGHTED( 1,-1, 1);
192 ADD_WEIGHTED(-1, 0, 1); ADD_WEIGHTED( 0, 0, 1); ADD_WEIGHTED( 1, 0, 1);
193 ADD_WEIGHTED(-1, 1, 1); ADD_WEIGHTED( 0, 1, 1); ADD_WEIGHTED( 1, 1, 1);
200 #define ADD_WEIGHTEDX(x,y,z)\ 201 weight = dw[0][(x) + 1] * w[1][(y) + 1] * w[2][(z) + 1];\ 202 result += weight * neighbors[x + 1][y + 1][z + 1]; 204 #define ADD_WEIGHTEDY(x,y,z)\ 205 weight = w[0][(x) + 1] * dw[1][(y) + 1] * w[2][(z) + 1];\ 206 result += weight * neighbors[x + 1][y + 1][z + 1]; 208 #define ADD_WEIGHTEDZ(x,y,z)\ 209 weight = w[0][(x) + 1] * w[1][(y) + 1] * dw[2][(z) + 1];\ 210 result += weight * neighbors[x + 1][y + 1][z + 1]; 215 inline Vec3 WaveletNoiseField::WNoiseVec(
const Vec3& p, Real *data)
224 int midX = (int)ceil(p[0] - 0.5f);
225 int midY = (int)ceil(p[1] - 0.5f);
226 int midZ = (int)ceil(p[2] - 0.5f);
228 Real t0 = midX - (p[0] - 0.5f);
229 Real t1 = midY - (p[1] - 0.5f);
230 Real t2 = midZ - (p[2] - 0.5f);
233 Real neighbors[3][3][3];
234 for (
int z = -1; z <=1; z++)
235 for (
int y = -1; y <= 1; y++)
236 for (
int x = -1; x <= 1; x++)
238 xC = modFast128(midX + (x));
239 yC = modFast128(midY + (y));
240 zC = modFast128(midZ + (z));
241 neighbors[x + 1][y + 1][z + 1] = data[zC * NOISE_TILE_SIZE * NOISE_TILE_SIZE + yC * NOISE_TILE_SIZE + xC];
248 dw[0][2] = (1.f - t0);
249 dw[0][1] = 2.0f * t0 - 1.0f;
252 dw[1][2] = (1.0f - t1);
253 dw[1][1] = 2.0f * t1 - 1.0f;
256 dw[2][2] = (1.0f - t2);
257 dw[2][1] = 2.0f * t2 - 1.0f;
259 w[0][0] = t0 * t0 * 0.5f;
260 w[0][2] = (1.f - t0) * (1.f - t0) *0.5f;
261 w[0][1] = 1.f - w[0][0] - w[0][2];
263 w[1][0] = t1 * t1 * 0.5f;
264 w[1][2] = (1.f - t1) * (1.f - t1) *0.5f;
265 w[1][1] = 1.f - w[1][0] - w[1][2];
267 w[2][0] = t2 * t2 * 0.5f;
268 w[2][2] = (1.f - t2) * (1.f - t2) *0.5f;
269 w[2][1] = 1.f - w[2][0] - w[2][2];
275 ADD_WEIGHTEDX(-1,-1, -1); ADD_WEIGHTEDX( 0,-1, -1); ADD_WEIGHTEDX( 1,-1, -1);
276 ADD_WEIGHTEDX(-1, 0, -1); ADD_WEIGHTEDX( 0, 0, -1); ADD_WEIGHTEDX( 1, 0, -1);
277 ADD_WEIGHTEDX(-1, 1, -1); ADD_WEIGHTEDX( 0, 1, -1); ADD_WEIGHTEDX( 1, 1, -1);
279 ADD_WEIGHTEDX(-1,-1, 0); ADD_WEIGHTEDX( 0,-1, 0); ADD_WEIGHTEDX( 1,-1, 0);
280 ADD_WEIGHTEDX(-1, 0, 0); ADD_WEIGHTEDX( 0, 0, 0); ADD_WEIGHTEDX( 1, 0, 0);
281 ADD_WEIGHTEDX(-1, 1, 0); ADD_WEIGHTEDX( 0, 1, 0); ADD_WEIGHTEDX( 1, 1, 0);
283 ADD_WEIGHTEDX(-1,-1, 1); ADD_WEIGHTEDX( 0,-1, 1); ADD_WEIGHTEDX( 1,-1, 1);
284 ADD_WEIGHTEDX(-1, 0, 1); ADD_WEIGHTEDX( 0, 0, 1); ADD_WEIGHTEDX( 1, 0, 1);
285 ADD_WEIGHTEDX(-1, 1, 1); ADD_WEIGHTEDX( 0, 1, 1); ADD_WEIGHTEDX( 1, 1, 1);
292 ADD_WEIGHTEDY(-1,-1, -1); ADD_WEIGHTEDY( 0,-1, -1); ADD_WEIGHTEDY( 1,-1, -1);
293 ADD_WEIGHTEDY(-1, 0, -1); ADD_WEIGHTEDY( 0, 0, -1); ADD_WEIGHTEDY( 1, 0, -1);
294 ADD_WEIGHTEDY(-1, 1, -1); ADD_WEIGHTEDY( 0, 1, -1); ADD_WEIGHTEDY( 1, 1, -1);
296 ADD_WEIGHTEDY(-1,-1, 0); ADD_WEIGHTEDY( 0,-1, 0); ADD_WEIGHTEDY( 1,-1, 0);
297 ADD_WEIGHTEDY(-1, 0, 0); ADD_WEIGHTEDY( 0, 0, 0); ADD_WEIGHTEDY( 1, 0, 0);
298 ADD_WEIGHTEDY(-1, 1, 0); ADD_WEIGHTEDY( 0, 1, 0); ADD_WEIGHTEDY( 1, 1, 0);
300 ADD_WEIGHTEDY(-1,-1, 1); ADD_WEIGHTEDY( 0,-1, 1); ADD_WEIGHTEDY( 1,-1, 1);
301 ADD_WEIGHTEDY(-1, 0, 1); ADD_WEIGHTEDY( 0, 0, 1); ADD_WEIGHTEDY( 1, 0, 1);
302 ADD_WEIGHTEDY(-1, 1, 1); ADD_WEIGHTEDY( 0, 1, 1); ADD_WEIGHTEDY( 1, 1, 1);
309 ADD_WEIGHTEDZ(-1,-1, -1); ADD_WEIGHTEDZ( 0,-1, -1); ADD_WEIGHTEDZ( 1,-1, -1);
310 ADD_WEIGHTEDZ(-1, 0, -1); ADD_WEIGHTEDZ( 0, 0, -1); ADD_WEIGHTEDZ( 1, 0, -1);
311 ADD_WEIGHTEDZ(-1, 1, -1); ADD_WEIGHTEDZ( 0, 1, -1); ADD_WEIGHTEDZ( 1, 1, -1);
313 ADD_WEIGHTEDZ(-1,-1, 0); ADD_WEIGHTEDZ( 0,-1, 0); ADD_WEIGHTEDZ( 1,-1, 0);
314 ADD_WEIGHTEDZ(-1, 0, 0); ADD_WEIGHTEDZ( 0, 0, 0); ADD_WEIGHTEDZ( 1, 0, 0);
315 ADD_WEIGHTEDZ(-1, 1, 0); ADD_WEIGHTEDZ( 0, 1, 0); ADD_WEIGHTEDZ( 1, 1, 0);
317 ADD_WEIGHTEDZ(-1,-1, 1); ADD_WEIGHTEDZ( 0,-1, 1); ADD_WEIGHTEDZ( 1,-1, 1);
318 ADD_WEIGHTEDZ(-1, 0, 1); ADD_WEIGHTEDZ( 0, 0, 1); ADD_WEIGHTEDZ( 1, 0, 1);
319 ADD_WEIGHTEDZ(-1, 1, 1); ADD_WEIGHTEDZ( 0, 1, 1); ADD_WEIGHTEDZ( 1, 1, 1);
336 pos +=
Vec3(getTime());
338 pos[0] *= mPosScale[0];
339 pos[1] *= mPosScale[1];
340 pos[2] *= mPosScale[2];
343 const int n3 = square(NOISE_TILE_SIZE) * NOISE_TILE_SIZE;
344 Real v = WNoise(pos, &mNoiseTile[tile*n3]);
349 if (v< mClampNeg) v = mClampNeg;
350 if (v> mClampPos) v = mClampPos;
362 pos +=
Vec3(getTime());
364 pos[0] *= mPosScale[0];
365 pos[1] *= mPosScale[1];
366 pos[2] *= mPosScale[2];
369 const int n3 = square(NOISE_TILE_SIZE) * NOISE_TILE_SIZE;
370 Vec3 v = WNoiseVec(pos, &mNoiseTile[tile*n3]);
372 v +=
Vec3(mValOffset);
376 for(
int i=0; i<3; i++) {
377 if (v[i]< mClampNeg) v[i] = mClampNeg;
378 if (v[i]> mClampPos) v[i] = mClampPos;
390 return Vec3(d0.y-d1.z, d2.z-d0.x, d1.x-d2.y);
Definition: commonkernels.h:22
Vec3 evaluateVec(Vec3 pos, int tile=0)
evaluate noise as a vector
Definition: noisefield.h:355
static void computeCoefficients(Grid< Real > &input, Grid< Real > &tempIn1, Grid< Real > &tempIn2)
compute wavelet decomposition of an input grid (stores residual coefficients)
Definition: noisefield.cpp:231
Definition: noisefield.h:28
Vec3 evaluateCurl(Vec3 pos)
evaluate curl noise
Definition: noisefield.h:384
Basic inlined vector class.
Definition: vectorbase.h:71
Real evaluate(Vec3 pos, int tile=0)
evaluate noise
Definition: noisefield.h:329
Real * data()
direct data access
Definition: noisefield.h:43
Definition: fluidsolver.h:28