Increase the maximum number of octaves in OpenSimplexNoise to 9

An error message is now printed when trying to set the number of octaves
above the maximum allowed value.

The magic constant was also replaced with a define that can be
easily changed.

This closes #28714.

(cherry picked from commit 13622d40fc)
This commit is contained in:
Hugo Locurcio 2020-01-30 23:49:17 +01:00 committed by Rémi Verschelde
parent cbd4784d14
commit 1898240af8
3 changed files with 14 additions and 5 deletions

View File

@ -117,7 +117,8 @@
Difference in period between [member octaves]. Difference in period between [member octaves].
</member> </member>
<member name="octaves" type="int" setter="set_octaves" getter="get_octaves" default="3"> <member name="octaves" type="int" setter="set_octaves" getter="get_octaves" default="3">
Number of OpenSimplex noise layers that are sampled to get the fractal noise. Number of OpenSimplex noise layers that are sampled to get the fractal noise. Higher values result in more detailed noise but take more time to generate.
[b]Note:[/b] The maximum allowed value is 9.
</member> </member>
<member name="period" type="float" setter="set_period" getter="get_period" default="64.0"> <member name="period" type="float" setter="set_period" getter="get_period" default="64.0">
Period of the base octave. A lower period results in a higher-frequency noise (more value changes across the same distance). Period of the base octave. A lower period results in a higher-frequency noise (more value changes across the same distance).

View File

@ -47,7 +47,7 @@ OpenSimplexNoise::~OpenSimplexNoise() {
} }
void OpenSimplexNoise::_init_seeds() { void OpenSimplexNoise::_init_seeds() {
for (int i = 0; i < 6; ++i) { for (int i = 0; i < MAX_OCTAVES; ++i) {
open_simplex_noise(seed + i * 2, &(contexts[i])); open_simplex_noise(seed + i * 2, &(contexts[i]));
} }
} }
@ -71,7 +71,10 @@ int OpenSimplexNoise::get_seed() {
void OpenSimplexNoise::set_octaves(int p_octaves) { void OpenSimplexNoise::set_octaves(int p_octaves) {
if (p_octaves == octaves) return; if (p_octaves == octaves) return;
octaves = CLAMP(p_octaves, 1, 6);
ERR_FAIL_COND_MSG(p_octaves > MAX_OCTAVES, vformat("The number of OpenSimplexNoise octaves is limited to %d; ignoring the new value.", MAX_OCTAVES));
octaves = CLAMP(p_octaves, 1, MAX_OCTAVES);
emit_changed(); emit_changed();
} }
@ -182,7 +185,7 @@ void OpenSimplexNoise::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_noise_3dv", "pos"), &OpenSimplexNoise::get_noise_3dv); ClassDB::bind_method(D_METHOD("get_noise_3dv", "pos"), &OpenSimplexNoise::get_noise_3dv);
ADD_PROPERTY(PropertyInfo(Variant::INT, "seed"), "set_seed", "get_seed"); ADD_PROPERTY(PropertyInfo(Variant::INT, "seed"), "set_seed", "get_seed");
ADD_PROPERTY(PropertyInfo(Variant::INT, "octaves", PROPERTY_HINT_RANGE, "1,6,1"), "set_octaves", "get_octaves"); ADD_PROPERTY(PropertyInfo(Variant::INT, "octaves", PROPERTY_HINT_RANGE, vformat("1,%d,1", MAX_OCTAVES)), "set_octaves", "get_octaves");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "period", PROPERTY_HINT_RANGE, "0.1,256.0,0.1"), "set_period", "get_period"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "period", PROPERTY_HINT_RANGE, "0.1,256.0,0.1"), "set_period", "get_period");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "persistence", PROPERTY_HINT_RANGE, "0.0,1.0,0.001"), "set_persistence", "get_persistence"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "persistence", PROPERTY_HINT_RANGE, "0.0,1.0,0.001"), "set_persistence", "get_persistence");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "lacunarity", PROPERTY_HINT_RANGE, "0.1,4.0,0.01"), "set_lacunarity", "get_lacunarity"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "lacunarity", PROPERTY_HINT_RANGE, "0.1,4.0,0.01"), "set_lacunarity", "get_lacunarity");

View File

@ -37,11 +37,16 @@
#include "thirdparty/misc/open-simplex-noise.h" #include "thirdparty/misc/open-simplex-noise.h"
// The maximum number of octaves allowed. Note that these are statically allocated.
// Higher values become exponentially slower, so this shouldn't be set too high
// to avoid freezing the editor for long periods of time.
#define MAX_OCTAVES 9
class OpenSimplexNoise : public Resource { class OpenSimplexNoise : public Resource {
GDCLASS(OpenSimplexNoise, Resource); GDCLASS(OpenSimplexNoise, Resource);
OBJ_SAVE_TYPE(OpenSimplexNoise); OBJ_SAVE_TYPE(OpenSimplexNoise);
osn_context contexts[6]; osn_context contexts[MAX_OCTAVES];
int seed; int seed;
float persistence; // Controls details, value in [0,1]. Higher increases grain, lower increases smoothness. float persistence; // Controls details, value in [0,1]. Higher increases grain, lower increases smoothness.