Exemplo n.º 1
0
float Noise::smoothNoise3(Vec3f &vec)
{
  int bx0, bx1, by0, by1, bz0, bz1, b00, b10, b01, b11;
  float rx0, rx1, ry0, ry1, rz0, rz1, *q, sy, sz, a, b, c, d, t, u, v;
  int i, j;

  SETUP(vec.x(), bx0, bx1, rx0, rx1);
  SETUP(vec.y(), by0, by1, ry0, ry1);
  SETUP(vec.z(), bz0, bz1, rz0, rz1);

  i = p[bx0];
  j = p[bx1];

  b00 = p[i + by0];
  b10 = p[j + by0];
  b01 = p[i + by1];
  b11 = p[j + by1];

  t = SCURVE(rx0);
  sy = SCURVE(ry0);
  sz = SCURVE(rz0);

#define AT3(rx, ry, rz) ((rx)*q[0] + (ry)*q[1] + (rz)*q[2])

  q = g3[b00 + bz0];
  u = AT3(rx0, ry0, rz0);
  q = g3[b10 + bz0];
  v = AT3(rx1, ry0, rz0);
  a = LERP(t, u, v);

  q = g3[b01 + bz0];
  u = AT3(rx0, ry1, rz0);
  q = g3[b11 + bz0];
  v = AT3(rx1, ry1, rz0);
  b = LERP(t, u, v);

  c = LERP(sy, a, b);

  q = g3[b00 + bz1];
  u = AT3(rx0, ry0, rz1);
  q = g3[b10 + bz1];
  v = AT3(rx1, ry0, rz1);
  a = LERP(t, u, v);

  q = g3[b01 + bz1];
  u = AT3(rx0, ry1, rz1);
  q = g3[b11 + bz1];
  v = AT3(rx1, ry1, rz1);
  b = LERP(t, u, v);

  d = LERP(sy, a, b);

#undef AT3

  return LERP(sz, c, d);
}
Exemplo n.º 2
0
float Noise::smoothNoise2(Vec2f &vec)
{
  int bx0, bx1, by0, by1, b00, b10, b01, b11;
  float rx0, rx1, ry0, ry1, *q, sx, sy, a, b, t, u, v;
  int i, j;

  SETUP(vec.x(), bx0, bx1, rx0, rx1);
  SETUP(vec.y(), by0, by1, ry0, ry1);

  i = p[bx0];
  j = p[bx1];

  b00 = p[i + by0];
  b10 = p[j + by0];
  b01 = p[i + by1];
  b11 = p[j + by1];

  sx = SCURVE(rx0);
  sy = SCURVE(ry0);

#define AT2(rx, ry) ((rx)*q[0] + (ry)*q[1])

  q = g2[b00];
  u = AT2(rx0, ry0);
  q = g2[b10];
  v = AT2(rx1, ry0);
  a = LERP(sx, u, v);

  q = g2[b01];
  u = AT2(rx0, ry1);
  q = g2[b11];
  v = AT2(rx1, ry1);
  b = LERP(sx, u, v);

#undef AT2

  return LERP(sy, a, b);
}
Exemplo n.º 3
0
// Noise functions over 1, 2, and 3 dimensions
float Noise::smoothNoise1(float arg)
{
  int bx0, bx1;
  float rx0, rx1, sx, t, u, v, vec;

  vec = arg;
  SETUP(vec, bx0, bx1, rx0, rx1);

  sx = SCURVE(rx0);

  u = rx0 * g1[p[bx0]];
  v = rx1 * g1[p[bx1]];

  return LERP(sx, u, v);
}
Exemplo n.º 4
0
/*************
 * DESCRIPTION:   Vector-valued noise function
 * INPUT:         v        noise position
 *                r        result vector
 * OUTPUT:        none
 *************/
void DNoise(VECTOR *v, VECTOR *r, short *hashTable)
{
	int ix, iy, iz, jx, jy, jz;
	float x, y, z;
	float px, py, pz, s;
	float sx, sy, sz, tx, ty, tz;
	short m;
	float tytz,sxsy,tysz,txsy;
	float *incrsum_tmp;

	/* ensures the values are positive. */
	x = v->x - MINX;
	y = v->y - MINY;
	z = v->z - MINZ;

	/* its equivalent integer lattice point. */
	ix = (int)floor(x);
	iy = (int)floor(y);
	iz = (int)floor(z);
	jx = ix + 1;
	jy = iy + 1;
	jz = iz + 1;

	sx = SCURVE(x - ix);
	sy = SCURVE(y - iy);
	sz = SCURVE(z - iz);

	/* the complement values of sx,sy,sz */
	tx = 1.f - sx;
	ty = 1.f - sy;
	tz = 1.f - sz;

	tytz = ty*tz;
	sxsy = sx*sy;
	tysz = ty*sz;
	txsy = tx*sy;

	/*
	 *  interpolate!
	 */
	m = Hash3d( ix, iy, iz ) & 0xFF;
	px = x-ix;  py = y-iy;  pz = z-iz;
	s = tx*tytz;
	INCRSUM(r->x=, m,  s,px,py,pz);
	INCRSUM(r->y=, m+4,s,px,py,pz);
	INCRSUM(r->z=, m+8,s,px,py,pz);

	m = Hash3d( jx, iy, iz ) & 0xFF;
	px = x-jx;
	s = sx*tytz;
	INCRSUM(r->x+=, m,  s,px,py,pz);
	INCRSUM(r->y+=, m+4,s,px,py,pz);
	INCRSUM(r->z+=, m+8,s,px,py,pz);

	m = Hash3d( jx, jy, iz ) & 0xFF;
	py = y-jy;
	s = sxsy*tz;
	INCRSUM(r->x+=, m,  s,px,py,pz);
	INCRSUM(r->y+=, m+4,s,px,py,pz);
	INCRSUM(r->z+=, m+8,s,px,py,pz);

	m = Hash3d( ix, jy, iz ) & 0xFF;
	px = x-ix;
	s = txsy*tz;
	INCRSUM(r->x+=, m,  s,px,py,pz);
	INCRSUM(r->y+=, m+4,s,px,py,pz);
	INCRSUM(r->z+=, m+8,s,px,py,pz);

	m = Hash3d( ix, jy, jz ) & 0xFF;
	pz = z-jz;
	s = txsy*sz;
	INCRSUM(r->x+=, m,  s,px,py,pz);
	INCRSUM(r->y+=, m+4,s,px,py,pz);
	INCRSUM(r->z+=, m+8,s,px,py,pz);

	m = Hash3d( jx, jy, jz ) & 0xFF;
	px = x-jx;
	s = sxsy*sz;
	INCRSUM(r->x+=, m,  s,px,py,pz);
	INCRSUM(r->y+=, m+4,s,px,py,pz);
	INCRSUM(r->z+=, m+8,s,px,py,pz);

	m = Hash3d( jx, iy, jz ) & 0xFF;
	py = y-iy;
	s = sx*tysz;
	INCRSUM(r->x+=, m,  s,px,py,pz);
	INCRSUM(r->y+=, m+4,s,px,py,pz);
	INCRSUM(r->z+=, m+8,s,px,py,pz);

	m = Hash3d( ix, iy, jz ) & 0xFF;
	px = x-ix;
	s = tx*tysz;
	INCRSUM(r->x+=, m,  s,px,py,pz);
	INCRSUM(r->y+=, m+4,s,px,py,pz);
	INCRSUM(r->z+=, m+8,s,px,py,pz);
}
Exemplo n.º 5
0
/*************
 * DESCRIPTION:   Noise function
 * INPUT:         v        noise position
 * OUTPUT:        noise
 *************/
float Noise(VECTOR *v, short *hashTable)
{
	int ix, iy, iz, jx, jy, jz;
	float x, y, z;
	float sx, sy, sz, tx, ty, tz;
	float sum,sum1,sum2, sumj,sumj1,sumj2, res;
	short m;
	float t,s,ts1,ts2;
	float *incrsum_tmp;

	/* ensures the values are positive. */
	x = v->x - MINX;
	y = v->y - MINY;
	z = v->z - MINZ;

	/* its equivalent integer lattice point. */
	ix = (int)floor(x);
	iy = (int)floor(y);
	iz = (int)floor(z);
	jx = ix + 1;
	jy = iy + 1;
	jz = iz + 1;

	sum = x - ix;
	sumj = x - jx;
	sx = SCURVE(sum);
	sum1 = y - iy;
	sumj1 = y - jy;
	sy = SCURVE(sum1);
	sum2 = z - iz;
	sumj2 = z - jz;
	sz = SCURVE(sum2);

	/* the complement values of sx,sy,sz */
	tx = 1.f - sx;
	ty = 1.f - sy;
	tz = 1.f - sz;

	t = ty*tz;
	s = sx*sy;
	ts1 = ty*sz;
	ts2 = tx*sy;

	m = Hash3d( ix, iy, iz ) & 0xFF;
	INCRSUM(res= , m, (tx*t),   sum,  sum1,  sum2);

	m = Hash3d( jx, iy, iz ) & 0xFF;
	INCRSUM(res+=, m, (sx*t),   sumj, sum1,  sum2);

	m = Hash3d( ix, jy, iz ) & 0xFF;
	INCRSUM(res+=, m, (ts2*tz), sum,  sumj1, sum2);

	m = Hash3d( jx, jy, iz ) & 0xFF;
	INCRSUM(res+=, m, (s*tz),   sumj, sumj1, sum2);

	m = Hash3d( ix, iy, jz ) & 0xFF;
	INCRSUM(res+=, m, (tx*ts1), sum,  sum1,  sumj2);

	m = Hash3d( jx, iy, jz ) & 0xFF;
	INCRSUM(res+=, m, (sx*ts1), sumj, sum1,  sumj2);

	m = Hash3d( ix, jy, jz ) & 0xFF;
	INCRSUM(res+=, m, (ts2*sz), sum,  sumj1, sumj2);

	m = Hash3d( jx, jy, jz ) & 0xFF;
	INCRSUM(res+=, m, (s*sz),   sumj, sumj1, sumj2);

	return res;
}