Skip to content

Commit

Permalink
Add generic coherent noise fractal generation function (#124)
Browse files Browse the repository at this point in the history
  • Loading branch information
otto-link committed Mar 7, 2024
1 parent 95db852 commit 995c210
Show file tree
Hide file tree
Showing 5 changed files with 466 additions and 0 deletions.
7 changes: 7 additions & 0 deletions HighMap/include/highmap/noise_function.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,13 @@ enum NoiseType : int
n_worley_value, ///< Worley (cell value return)
};

enum FractalType : int
{
n_none,
n_fbm,
n_
};

//----------------------------------------
// Base function class
//----------------------------------------
Expand Down
133 changes: 133 additions & 0 deletions HighMap/include/highmap/primitives.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -543,6 +543,24 @@ Array gaussian_pulse(Vec2<int> shape,
Vec2<float> center = {0.5f, 0.5f},
Vec4<float> bbox = {0.f, 1.f, 0.f, 1.f});

/**
* @brief Return an array filled with coherence noise.
*
* @param noise_type Noise type.
* @param shape Array shape.
* @param kw Noise wavenumbers {kx, ky} for each directions.
* @param seed Random seed number.
* @param p_noise_x, p_noise_y Reference to the input noise arrays.
* @param p_stretching Local wavenumber multiplier.
* @param bbox Domain bounding box.
* @return Array Resulting array.
*
* **Example**
* @include ex_noise.cpp
*
* **Result**
* @image html ex_noise.png
*/
Array noise(NoiseType noise_type,
Vec2<int> shape,
Vec2<float> kw,
Expand All @@ -552,6 +570,121 @@ Array noise(NoiseType noise_type,
Array *p_stretching = nullptr,
Vec4<float> bbox = {0.f, 1.f, 0.f, 1.f});

/**
* @brief Return an array filled with coherence fbm noise.
*
* @param noise_type Noise type.
* @param shape Array shape.
* @param kw Noise wavenumbers {kx, ky} for each directions.
* @param seed Random seed number.
* @param ratio Amplitude ratio between each Worley noise.
* @param k Transition smoothing parameter.
* @param octaves Number of octaves.
* @param weigth Octave weighting.
* @param persistence Octave persistence.
* @param lacunarity Defines the wavenumber ratio between each octaves.
* @param p_noise_x, p_noise_y Reference to the input noise arrays.
* @param p_stretching Local wavenumber multiplier.
* @param bbox Domain bounding box.
* @return Array Fractal noise.
*
* **Example**
* @include ex_noise_fbm.cpp
*
* **Result**
* @image html ex_noise_fbm.png
*/
Array noise_fbm(NoiseType noise_type,
Vec2<int> shape,
Vec2<float> kw,
uint seed,
int octaves = 8,
float weight = 0.7f,
float persistence = 0.5f,
float lacunarity = 2.f,
Array *p_base_elevation = nullptr,
Array *p_noise_x = nullptr,
Array *p_noise_y = nullptr,
Array *p_stretching = nullptr,
Vec4<float> bbox = {0.f, 1.f, 0.f, 1.f});

Array noise_iq(NoiseType noise_type,
Vec2<int> shape,
Vec2<float> kw,
uint seed,
int octaves = 8,
float weight = 0.7f,
float persistence = 0.5f,
float lacunarity = 2.f,
float gradient_scale = 0.05f,
Array *p_base_elevation = nullptr,
Array *p_noise_x = nullptr,
Array *p_noise_y = nullptr,
Array *p_stretching = nullptr,
Vec4<float> bbox = {0.f, 1.f, 0.f, 1.f});

Array noise_jordan(NoiseType noise_type,
Vec2<int> shape,
Vec2<float> kw,
uint seed,
int octaves = 8,
float weight = 0.7f,
float persistence = 0.5f,
float lacunarity = 2.f,
float warp0 = 0.4f,
float damp0 = 1.f,
float warp_scale = 0.4f,
float damp_scale = 1.f,
Array *p_base_elevation = nullptr,
Array *p_noise_x = nullptr,
Array *p_noise_y = nullptr,
Array *p_stretching = nullptr,
Vec4<float> bbox = {0.f, 1.f, 0.f, 1.f});

Array noise_pingpong(NoiseType noise_type,
Vec2<int> shape,
Vec2<float> kw,
uint seed,
int octaves = 8,
float weight = 0.7f,
float persistence = 0.5f,
float lacunarity = 2.f,
Array *p_base_elevation = nullptr,
Array *p_noise_x = nullptr,
Array *p_noise_y = nullptr,
Array *p_stretching = nullptr,
Vec4<float> bbox = {0.f, 1.f, 0.f, 1.f});

Array noise_ridged(NoiseType noise_type,
Vec2<int> shape,
Vec2<float> kw,
uint seed,
int octaves = 8,
float weight = 0.7f,
float persistence = 0.5f,
float lacunarity = 2.f,
float k_smoothing = 0.1f,
Array *p_base_elevation = nullptr,
Array *p_noise_x = nullptr,
Array *p_noise_y = nullptr,
Array *p_stretching = nullptr,
Vec4<float> bbox = {0.f, 1.f, 0.f, 1.f});

Array noise_swiss(NoiseType noise_type,
Vec2<int> shape,
Vec2<float> kw,
uint seed,
int octaves = 8,
float weight = 0.7f,
float persistence = 0.5f,
float lacunarity = 2.f,
float warp_scale = 0.1f,
Array *p_base_elevation = nullptr,
Array *p_noise_x = nullptr,
Array *p_noise_y = nullptr,
Array *p_stretching = nullptr,
Vec4<float> bbox = {0.f, 1.f, 0.f, 1.f});

/**
* @brief Return a peak-shaped heightmap.
*
Expand Down
225 changes: 225 additions & 0 deletions HighMap/src/primitives/noise.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,229 @@ Array noise(NoiseType noise_type,
return array;
}

Array noise_fbm(NoiseType noise_type,
Vec2<int> shape,
Vec2<float> kw,
uint seed,
int octaves,
float weight,
float persistence,
float lacunarity,
Array *p_base_elevation,
Array *p_noise_x,
Array *p_noise_y,
Array *p_stretching,
Vec4<float> bbox)
{
Array array = p_base_elevation == nullptr ? Array(shape) : *p_base_elevation;

std::unique_ptr<NoiseFunction> p = create_noise_function_from_type(noise_type,
kw,
seed);

hmap::FbmFunction f = hmap::FbmFunction(p.get()->get_base_ref(),
octaves,
weight,
persistence,
lacunarity);

fill_array_using_xy_function(array,
bbox,
p_noise_x,
p_noise_y,
p_stretching,
f.get_function());
return array;
}

Array noise_iq(NoiseType noise_type,
Vec2<int> shape,
Vec2<float> kw,
uint seed,
int octaves,
float weight,
float persistence,
float lacunarity,
float gradient_scale,
Array *p_base_elevation,
Array *p_noise_x,
Array *p_noise_y,
Array *p_stretching,
Vec4<float> bbox)
{
Array array = p_base_elevation == nullptr ? Array(shape) : *p_base_elevation;

std::unique_ptr<NoiseFunction> p = create_noise_function_from_type(noise_type,
kw,
seed);

hmap::FbmIqFunction f = hmap::FbmIqFunction(p.get()->get_base_ref(),
octaves,
weight,
persistence,
lacunarity,
gradient_scale);

fill_array_using_xy_function(array,
bbox,
p_noise_x,
p_noise_y,
p_stretching,
f.get_function());
return array;
}

Array noise_jordan(NoiseType noise_type,
Vec2<int> shape,
Vec2<float> kw,
uint seed,
int octaves,
float weight,
float persistence,
float lacunarity,
float warp0,
float damp0,
float warp_scale,
float damp_scale,
Array *p_base_elevation,
Array *p_noise_x,
Array *p_noise_y,
Array *p_stretching,
Vec4<float> bbox)
{
Array array = p_base_elevation == nullptr ? Array(shape) : *p_base_elevation;

std::unique_ptr<NoiseFunction> p = create_noise_function_from_type(noise_type,
kw,
seed);

hmap::FbmJordanFunction f = hmap::FbmJordanFunction(p.get()->get_base_ref(),
octaves,
weight,
persistence,
lacunarity,
warp0,
damp0,
warp_scale,
damp_scale);

fill_array_using_xy_function(array,
bbox,
p_noise_x,
p_noise_y,
p_stretching,
f.get_function());
return array;
}

Array noise_pingpong(NoiseType noise_type,
Vec2<int> shape,
Vec2<float> kw,
uint seed,
int octaves,
float weight,
float persistence,
float lacunarity,
Array *p_base_elevation,
Array *p_noise_x,
Array *p_noise_y,
Array *p_stretching,
Vec4<float> bbox)
{
Array array = p_base_elevation == nullptr ? Array(shape) : *p_base_elevation;

std::unique_ptr<NoiseFunction> p = create_noise_function_from_type(noise_type,
kw,
seed);

hmap::FbmPingpongFunction f = hmap::FbmPingpongFunction(
p.get()->get_base_ref(),
octaves,
weight,
persistence,
lacunarity);

fill_array_using_xy_function(array,
bbox,
p_noise_x,
p_noise_y,
p_stretching,
f.get_function());
return array;
}

Array noise_ridged(NoiseType noise_type,
Vec2<int> shape,
Vec2<float> kw,
uint seed,
int octaves,
float weight,
float persistence,
float lacunarity,
float k_smoothing,
Array *p_base_elevation,
Array *p_noise_x,
Array *p_noise_y,
Array *p_stretching,
Vec4<float> bbox)
{
Array array = p_base_elevation == nullptr ? Array(shape) : *p_base_elevation;

std::unique_ptr<NoiseFunction> p = create_noise_function_from_type(noise_type,
kw,
seed);

hmap::FbmRidgedFunction f = hmap::FbmRidgedFunction(p.get()->get_base_ref(),
octaves,
weight,
persistence,
lacunarity,
k_smoothing);

fill_array_using_xy_function(array,
bbox,
p_noise_x,
p_noise_y,
p_stretching,
f.get_function());
return array;
}

Array noise_swiss(NoiseType noise_type,
Vec2<int> shape,
Vec2<float> kw,
uint seed,
int octaves,
float weight,
float persistence,
float lacunarity,
float warp_scale,
Array *p_base_elevation,
Array *p_noise_x,
Array *p_noise_y,
Array *p_stretching,
Vec4<float> bbox)
{
Array array = p_base_elevation == nullptr ? Array(shape) : *p_base_elevation;

std::unique_ptr<NoiseFunction> p = create_noise_function_from_type(noise_type,
kw,
seed);

hmap::FbmSwissFunction f = hmap::FbmSwissFunction(p.get()->get_base_ref(),
octaves,
weight,
persistence,
lacunarity,
warp_scale);

fill_array_using_xy_function(array,
bbox,
p_noise_x,
p_noise_y,
p_stretching,
f.get_function());
return array;
}

} // namespace hmap
2 changes: 2 additions & 0 deletions examples/ex_noise_fbm/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
add_executable(ex_noise_fbm ex_noise_fbm.cpp)
target_link_libraries(ex_noise_fbm highmap)
Loading

0 comments on commit 995c210

Please sign in to comment.