forked from Mirrorlandia_minetest/minetest
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:
parent
2d5e0ce5ba
commit
c2f48eab4d
@ -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)
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user