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); }
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); }
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); }
//***************************************************************************** // // // * //============================================================================= 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; }