Display an error when a noise parameter has too many octaves (#9394)

Display an error and throw exception when one or more octaves of
a noise has spread < 1, causing random looking broken noise.
This commit is contained in:
Paramat 2020-02-12 23:15:07 +00:00 committed by GitHub
parent 2d5e0ce5ba
commit c2f48eab4d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -503,23 +503,32 @@ void Noise::setOctaves(int octaves)
void Noise::resizeNoiseBuf(bool is3d) void Noise::resizeNoiseBuf(bool is3d)
{ {
//maximum possible spread value factor // Maximum possible spread value factor
float ofactor = (np.lacunarity > 1.0) ? float ofactor = (np.lacunarity > 1.0) ?
pow(np.lacunarity, np.octaves - 1) : pow(np.lacunarity, np.octaves - 1) :
np.lacunarity; np.lacunarity;
// noise lattice point count // Noise lattice point count
// (int)(sz * spread * ofactor) is # of lattice points crossed due to length // (int)(sz * spread * ofactor) is # of lattice points crossed due to length
float num_noise_points_x = sx * ofactor / np.spread.X; float num_noise_points_x = sx * ofactor / np.spread.X;
float num_noise_points_y = sy * ofactor / np.spread.Y; float num_noise_points_y = sy * ofactor / np.spread.Y;
float num_noise_points_z = sz * ofactor / np.spread.Z; float num_noise_points_z = sz * ofactor / np.spread.Z;
// protect against obviously invalid parameters // Protect against obviously invalid parameters
if (num_noise_points_x > 1000000000.f || if (num_noise_points_x > 1000000000.f ||
num_noise_points_y > 1000000000.f || num_noise_points_y > 1000000000.f ||
num_noise_points_z > 1000000000.f) num_noise_points_z > 1000000000.f)
throw InvalidNoiseParamsException(); throw InvalidNoiseParamsException();
// Protect against an octave having a spread < 1, causing broken noise values
if (np.spread.X / ofactor < 1.0f ||
np.spread.Y / ofactor < 1.0f ||
np.spread.Z / ofactor < 1.0f) {
errorstream << "A noise parameter has too many octaves: "
<< np.octaves << " octaves" << std::endl;
throw InvalidNoiseParamsException("A noise parameter has too many octaves");
}
// + 2 for the two initial endpoints // + 2 for the two initial endpoints
// + 1 for potentially crossing a boundary due to offset // + 1 for potentially crossing a boundary due to offset
size_t nlx = (size_t)std::ceil(num_noise_points_x) + 3; size_t nlx = (size_t)std::ceil(num_noise_points_x) + 3;