float perlin_smooth_noise_3d(const int x, const int y, const int z) { const float corners = ( perlin_noise_3d(x - 1, y - 1, z + 1) + perlin_noise_3d(x + 1, y - 1, z + 1) + perlin_noise_3d(x - 1, y + 1, z + 1) + perlin_noise_3d(x + 1, y + 1, z + 1) + perlin_noise_3d(x - 1, y - 1, z - 1) + perlin_noise_3d(x + 1, y - 1, z - 1) + perlin_noise_3d(x - 1, y + 1, z - 1) + perlin_noise_3d(x + 1, y + 1, z - 1) ) / 16; const float sides = ( perlin_noise_3d(x - 1, y, z + 1) + perlin_noise_3d(x + 1, y, z + 1) + perlin_noise_3d(x, y - 1, z + 1) + perlin_noise_3d(x, y + 1, z + 1) + perlin_noise_3d(x - 1, y, z - 1) + perlin_noise_3d(x + 1, y, z - 1) + perlin_noise_3d(x, y - 1, z - 1) + perlin_noise_3d(x, y + 1, z - 1) + perlin_noise_3d(x - 1, y - 1, z) + perlin_noise_3d(x + 1, y - 1, z) + perlin_noise_3d(x + 1, y + 1, z) + perlin_noise_3d(x - 1, y + 1, z) ) / 8; const float center = perlin_noise_2d(x, y) / 12; return corners + sides + center; }
float perlin_smooth_noise_2d(const int x, const int y) { const float corners = ( perlin_noise_2d(x - 1, y - 1) + perlin_noise_2d(x + 1, y - 1) + perlin_noise_2d(x - 1, y + 1) + perlin_noise_2d(x + 1, y + 1) ) / 4; const float sides = ( perlin_noise_2d(x - 1, y) + perlin_noise_2d(x + 1, y) + perlin_noise_2d(x, y - 1) + perlin_noise_2d(x, y + 1) ) / 4; const float center = perlin_noise_2d(x, y) / 4; return corners + sides + center; }
PerlinNoise::PerlinNoise() { for (int x = 0; x < 256;x++) for (int y = 0; y < 256;y++) noise_lq[x][y] = noise(x , y); for (int x = 0; x < 32;x++) for (int y = 0; y < 32;y++) noise_lq_lite[x][y] = noise(4*x,16*y); for (int x = 0; x < 256;x++) for (int y = 0; y < 256;y++) noise_mq[x][y] = InterpolatedNoise((float)x/(float)2.0,(float)y/(float)2.0); for (int x = 0; x < 256;x++) for (int y = 0; y < 256;y++) noise_hq[x][y] = InterpolatedNoise((float)x/(float)3.0,(float)y/(float)3.0); for (int x = 0; x < 32;x++) for (int y = 0; y < 32;y++) for (int z = 0; z < 32;z++) noise_lq_vol[x][y][z] = noise(x,y,z); for (int x = 0; x < 32;x++) for (int y = 0; y < 32;y++) for (int z = 0; z < 32;z++) noise_hq_vol[x][y][z] = noise(x,y,z);//perlin_noise_3d(x,y,z,6121,7,seed3,0.5,64); int seed = rand()%1000; int size = 512; int octaves = sqrt(size); for (int x = 0; x < size;x++) for (int y = 0; y < size;y++) noise_perlin[x][y] = perlin_noise_2d(x,y,6321,octaves,seed,0.5,size/4); }