From 0073b8bfc9e5cffa0f224c7f6fd5b49fe19dcd61 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 30 Sep 2020 07:29:29 +0300 Subject: [PATCH] Add generic fractal noise --- libs/pcg/include/psemek/pcg/fractal.hpp | 47 +++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 libs/pcg/include/psemek/pcg/fractal.hpp diff --git a/libs/pcg/include/psemek/pcg/fractal.hpp b/libs/pcg/include/psemek/pcg/fractal.hpp new file mode 100644 index 00000000..31d5113f --- /dev/null +++ b/libs/pcg/include/psemek/pcg/fractal.hpp @@ -0,0 +1,47 @@ +#pragma once + +#include +#include + +#include + +namespace psemek::pcg +{ + + template + struct fractal + { + using value_type = typename Generator::value_type; + static constexpr std::size_t dimension = Generator::dimension; + + template + fractal(std::vector args, std::vector weights); + + value_type operator()(geom::vector const & p) const; + + private: + std::vector octaves; + std::vector weights; + }; + + template + template + fractal::fractal(std::vector args, std::vector 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 fractal::value_type fractal::operator()(geom::vector 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; + } + +}