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