Display an error when a noise parameter has too many octaves (#9394)
authorParamat <paramat@users.noreply.github.com>
Wed, 12 Feb 2020 23:15:07 +0000 (23:15 +0000)
committerGitHub <noreply@github.com>
Wed, 12 Feb 2020 23:15:07 +0000 (23:15 +0000)
Display an error and throw exception when one or more octaves of
a noise has spread < 1, causing random looking broken noise.

src/noise.cpp

index 255d3faee001c5770f0c864434fb738bc5998720..9c91a6df4332974f094df28774e129e0f0861054 100644 (file)
@@ -503,23 +503,32 @@ void Noise::setOctaves(int octaves)
 
 void Noise::resizeNoiseBuf(bool is3d)
 {
-       //maximum possible spread value factor
+       // Maximum possible spread value factor
        float ofactor = (np.lacunarity > 1.0) ?
                pow(np.lacunarity, np.octaves - 1) :
                np.lacunarity;
 
-       // noise lattice point count
+       // Noise lattice point count
        // (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_y = sy * ofactor / np.spread.Y;
        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 ||
-               num_noise_points_y > 1000000000.f ||
-               num_noise_points_z > 1000000000.f)
+                       num_noise_points_y > 1000000000.f ||
+                       num_noise_points_z > 1000000000.f)
                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
        // + 1 for potentially crossing a boundary due to offset
        size_t nlx = (size_t)std::ceil(num_noise_points_x) + 3;