void WorleyNoise::turbulence(float F[4], int fmax, float x, float y, float z) { unsigned long *id = new unsigned long; // (!) for (int i = 0; i < 4; ++i) F[i] = 0; for (float f = 1; f < (2 << fmax); f *= 2) { float tmp[4]; float at[3] = { x*f, y*f, z*f }; float delta[4][3]; noise3D(at, 4, tmp, delta, id); // Normalize on frequency for (int i = 0; i < 4; ++i) F[i] += tmp[i] / f; } }
T smoothNoise3D(const int x, const int y, const int z) { T corners0 = (noise3D(x - 1, y - 1, z - 1) + noise3D(x + 1, y - 1, z - 1) + noise3D(x + 1, y + 1, z - 1) + noise3D(x - 1, y + 1, z - 1)) / 16; T sides0 = (noise3D(x + 1, y, z - 1) + noise3D(x - 1, y, z - 1) + noise3D(x, y + 1, z - 1) + noise3D(x, y - 1, z - 1)) / 8; T center0 = noise3D(x, y, z - 1) / 4; T corners = (noise3D(x - 1, y - 1, z) + noise3D(x + 1, y - 1, z) + noise3D(x + 1, y + 1, z) + noise3D(x - 1, y + 1, z)) / 16; T sides = (noise3D(x + 1, y, z) + noise3D(x - 1, y, z) + noise3D(x, y + 1, z) + noise3D(x, y - 1, z)) / 8; T center = noise3D(x, y, z) / 4; T corners1 = (noise3D(x - 1, y - 1, z + 1) + noise3D(x + 1, y - 1, z + 1) + noise3D(x + 1, y + 1, z + 1) + noise3D(x - 1, y + 1, z + 1)) / 16; T sides1 = (noise3D(x + 1, y, z + 1) + noise3D(x - 1, y, z + 1) + noise3D(x, y + 1, z + 1) + noise3D(x, y - 1, z + 1)) /8; T center1 = noise3D(x, y, z + 1) / 4; T level0 = corners0 + sides0 + center0; T levelCurrent = corners + sides + center; T level1 = corners1 + sides1 + center1; return (( level0 / 3) + (levelCurrent / 3) + (level1 / 3)); }
uint32_t Utils::voxel_extended_value(uint32_t a_x, uint32_t a_y, uint32_t a_z) { return (uint32_t)(noise3D((double)a_x/MAP_SCALE, (double)a_y/MAP_SCALE, (double)a_z)*0xFFFFFFFF); }