Beispiel #1
0
float Noise(float x, float y, float z) {
    // Compute noise cell coordinates and offsets
    int ix = Floor2Int(x), iy = Floor2Int(y), iz = Floor2Int(z);
    float dx = x - ix, dy = y - iy, dz = z - iz;

    // Compute gradient weights
    ix &= (NOISE_PERM_SIZE-1);
    iy &= (NOISE_PERM_SIZE-1);
    iz &= (NOISE_PERM_SIZE-1);
    float w000 = Grad(ix,   iy,   iz,   dx,   dy,   dz);
    float w100 = Grad(ix+1, iy,   iz,   dx-1, dy,   dz);
    float w010 = Grad(ix,   iy+1, iz,   dx,   dy-1, dz);
    float w110 = Grad(ix+1, iy+1, iz,   dx-1, dy-1, dz);
    float w001 = Grad(ix,   iy,   iz+1, dx,   dy,   dz-1);
    float w101 = Grad(ix+1, iy,   iz+1, dx-1, dy,   dz-1);
    float w011 = Grad(ix,   iy+1, iz+1, dx,   dy-1, dz-1);
    float w111 = Grad(ix+1, iy+1, iz+1, dx-1, dy-1, dz-1);

    // Compute trilinear interpolation of weights
    float wx = NoiseWeight(dx), wy = NoiseWeight(dy), wz = NoiseWeight(dz);
    float x00 = Lerp(wx, w000, w100);
    float x10 = Lerp(wx, w010, w110);
    float x01 = Lerp(wx, w001, w101);
    float x11 = Lerp(wx, w011, w111);
    float y0 = Lerp(wy, x00, x10);
    float y1 = Lerp(wy, x01, x11);
    return Lerp(wz, y0, y1);
}
Beispiel #2
0
Float Noise(Float x, Float y, Float z) {
    // Compute noise cell coordinates and offsets
    int ix = std::floor(x), iy = std::floor(y), iz = std::floor(z);
    Float dx = x - ix, dy = y - iy, dz = z - iz;

    // Compute gradient weights
    ix &= NoisePermSize - 1;
    iy &= NoisePermSize - 1;
    iz &= NoisePermSize - 1;
    Float w000 = Grad(ix, iy, iz, dx, dy, dz);
    Float w100 = Grad(ix + 1, iy, iz, dx - 1, dy, dz);
    Float w010 = Grad(ix, iy + 1, iz, dx, dy - 1, dz);
    Float w110 = Grad(ix + 1, iy + 1, iz, dx - 1, dy - 1, dz);
    Float w001 = Grad(ix, iy, iz + 1, dx, dy, dz - 1);
    Float w101 = Grad(ix + 1, iy, iz + 1, dx - 1, dy, dz - 1);
    Float w011 = Grad(ix, iy + 1, iz + 1, dx, dy - 1, dz - 1);
    Float w111 = Grad(ix + 1, iy + 1, iz + 1, dx - 1, dy - 1, dz - 1);

    // Compute trilinear interpolation of weights
    Float wx = NoiseWeight(dx), wy = NoiseWeight(dy), wz = NoiseWeight(dz);
    Float x00 = Lerp(wx, w000, w100);
    Float x10 = Lerp(wx, w010, w110);
    Float x01 = Lerp(wx, w001, w101);
    Float x11 = Lerp(wx, w011, w111);
    Float y0 = Lerp(wy, x00, x10);
    Float y1 = Lerp(wy, x01, x11);
    return Lerp(wz, y0, y1);
}
Beispiel #3
0
float perlin::noise(float x, float y, float z, float n) {
    // Transform to voxel space
    float vx = 0.5f + x;
    float vy = 0.5f + y;
    float vz = 0.5f + z;

    // Compute noise cell cooridinates and offsets
    // obtain voxel cooridinates
    // This is to index into the Noise_Perm Array
    int ix = (int) floor(vx * n) % NOISE_PERM_SIZE;
    int iy = (int) floor(vy * n) % NOISE_PERM_SIZE;
    int iz = (int) floor(vz * n) % NOISE_PERM_SIZE;

    // Offset
    float dx = vx * n - ix;
    float dy = vy * n - iy;
    float dz = vz * n - iz;

    // Compute gradient weights
    float w000 = Grad(ix,   iy,   iz,   dx,   dy,   dz);
    float w100 = Grad(ix+1, iy,   iz,   dx-1, dy,   dz);
    float w010 = Grad(ix,   iy+1, iz,   dx,   dy-1, dz);
    float w110 = Grad(ix+1, iy+1, iz,   dx-1, dy-1, dz);
    float w001 = Grad(ix,   iy,   iz+1, dx,   dy,   dz-1);
    float w101 = Grad(ix+1, iy,   iz+1, dx-1, dy,   dz-1);
    float w011 = Grad(ix,   iy+1, iz+1, dx,   dy-1, dz-1);
    float w111 = Grad(ix+1, iy+1, iz+1, dx-1, dy-1, dz-1);

    // Compute interpolation of weights
    float wx = NoiseWeight(dx);
    float wy = NoiseWeight(dy);
    float wz = NoiseWeight(dz);

    // Compute trilinear interpolation of weights
    float x00 = pbrt_lerp(wx, w000, w100);
    float x10 = pbrt_lerp(wx, w010, w110);
    float x01 = pbrt_lerp(wx, w001, w101);
    float x11 = pbrt_lerp(wx, w011, w111);
    float y0 = pbrt_lerp(wy, x00, x10);
    float y1 = pbrt_lerp(wy, x01, x11);

    float result = pbrt_lerp(wz, y0, y1);
    return glm::abs(result);
}
Beispiel #4
0
//*****************************************************************************
//
//
// *
//=============================================================================
float SJCNoise::
Eval(const float x, const float y, const float z)
//=============================================================================
{
  int	  ix = (int)floor(x);
  float   dx = x - ix;
  int	  iy = (int)floor(y);
  float   dy = y - iy;
  int	  iz = (int)floor(z);
  float   dz = z - iz;
  
  ix &= ( PERM_SIZE - 1 );
  iy &= ( PERM_SIZE - 1 );
  iz &= ( PERM_SIZE - 1 );
  
  float   w000 = Grad(ix, iy, iz, dx, dy, dz);
  float   w010 = Grad(ix, iy+1, iz, dx, dy-1.0f, dz);
  float   w100 = Grad(ix+1, iy, iz, dx-1.0f, dy, dz);
  float   w110 = Grad(ix+1, iy+1, iz, dx-1.0f, dy-1.0f, dz);
  float   w001 = Grad(ix, iy, iz+1, dx, dy, dz-1.0f);
  float   w011 = Grad(ix, iy+1, iz+1, dx, dy-1.0f, dz-1.0f);
  float   w101 = Grad(ix+1, iy, iz+1, dx-1.0f, dy, dz-1.0f);
  float   w111 = Grad(ix+1, iy+1, iz+1, dx-1.0f, dy-1.0f, dz-1.0f);
  
  float   ux = NoiseWeight(dx);
  float   uy = NoiseWeight(dy);
  float   uz = NoiseWeight(dz);
  
  float   x00 = ( 1 - ux ) * w000 + ux * w100;
  float   x10 = ( 1 - ux ) * w010 + ux * w110;
  float   x01 = ( 1 - ux ) * w001 + ux * w101;
  float   x11 = ( 1 - ux ) * w011 + ux * w111;
  float   y0 = ( 1 - uy ) * x00 + uy * x10;
  float   y1 = ( 1 - uy ) * x01 + uy * x11;
  return ( 1 - uz ) * y0 + uz * y1;
}