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)
|
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user