Add generic fractal noise
This commit is contained in:
parent
15de7a88d5
commit
0073b8bfc9
1 changed files with 47 additions and 0 deletions
47
libs/pcg/include/psemek/pcg/fractal.hpp
Normal file
47
libs/pcg/include/psemek/pcg/fractal.hpp
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <psemek/geom/vector.hpp>
|
||||||
|
#include <psemek/util/assert.hpp>
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace psemek::pcg
|
||||||
|
{
|
||||||
|
|
||||||
|
template <typename Generator>
|
||||||
|
struct fractal
|
||||||
|
{
|
||||||
|
using value_type = typename Generator::value_type;
|
||||||
|
static constexpr std::size_t dimension = Generator::dimension;
|
||||||
|
|
||||||
|
template <typename Arg>
|
||||||
|
fractal(std::vector<Arg> args, std::vector<value_type> weights);
|
||||||
|
|
||||||
|
value_type operator()(geom::vector<value_type, dimension> const & p) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<Generator> octaves;
|
||||||
|
std::vector<float> weights;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename Generator>
|
||||||
|
template <typename Arg>
|
||||||
|
fractal<Generator>::fractal(std::vector<Arg> args, std::vector<value_type> weights)
|
||||||
|
{
|
||||||
|
assert(args.size() == weights.size());
|
||||||
|
this->weights = std::move(weights);
|
||||||
|
octaves.reserve(args.size());
|
||||||
|
for (std::size_t i = 0; i < args.size(); ++i)
|
||||||
|
octaves.emplace_back(std::move(args[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Generator>
|
||||||
|
typename fractal<Generator>::value_type fractal<Generator>::operator()(geom::vector<value_type, dimension> const & p) const
|
||||||
|
{
|
||||||
|
value_type result = value_type{};
|
||||||
|
for (std::size_t i = 0; i < octaves.size(); ++i)
|
||||||
|
result += octaves[i](p) * weights[i];
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue