Add generic fractal noise

This commit is contained in:
Nikita Lisitsa 2020-09-30 07:29:29 +03:00
parent 15de7a88d5
commit 0073b8bfc9

View 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;
}
}