Switch lazy perlin arguments from vectors to points

This commit is contained in:
Nikita Lisitsa 2022-11-19 22:57:22 +03:00
parent 445ac3419e
commit 4e5ed4edad

View file

@ -7,6 +7,7 @@
#include <psemek/geom/box.hpp> #include <psemek/geom/box.hpp>
#include <unordered_map> #include <unordered_map>
#include <optional>
namespace psemek::pcg namespace psemek::pcg
{ {
@ -15,7 +16,7 @@ namespace psemek::pcg
{ {
template <typename T, std::size_t N, typename F, typename G> template <typename T, std::size_t N, typename F, typename G>
T perlin_impl(geom::vector<T, N> p, int grid_size, F && grid_at, G && bound) T perlin_impl(geom::point<T, N> p, int grid_size, F && grid_at, G && bound)
{ {
geom::vector<int, N> ip; geom::vector<int, N> ip;
for (std::size_t i = 0; i < N; ++i) for (std::size_t i = 0; i < N; ++i)
@ -24,7 +25,7 @@ namespace psemek::pcg
} }
ip = bound(ip); ip = bound(ip);
geom::vector<T, N> t = (p - geom::cast<T>(ip) * T(grid_size)) / T(grid_size); geom::vector<T, N> t = (p - p.zero() - geom::cast<T>(ip) * T(grid_size)) / T(grid_size);
T values[1 << N]; T values[1 << N];
@ -73,7 +74,7 @@ namespace psemek::pcg
, subgrid_(std::move(subgrid)) , subgrid_(std::move(subgrid))
{} {}
T operator()(geom::vector<T, N> p) const; T operator()(geom::point<T, N> p) const;
private: private:
int grid_size_; int grid_size_;
@ -94,7 +95,7 @@ namespace psemek::pcg
, gen_(std::move(generator)) , gen_(std::move(generator))
{} {}
T operator()(geom::vector<T, N> p) const; T operator()(geom::point<T, N> p) const;
auto subview(geom::box<T, N> const & box) const; auto subview(geom::box<T, N> const & box) const;
@ -136,7 +137,7 @@ namespace psemek::pcg
grid_.resize(dims); grid_.resize(dims);
} }
T operator()(geom::vector<T, N> p) const; T operator()(geom::point<T, N> p) const;
private: private:
int const grid_size_; int const grid_size_;
@ -158,7 +159,7 @@ namespace psemek::pcg
}; };
template <typename T, std::size_t N> template <typename T, std::size_t N>
T lazy_perlin_view<T, N>::operator()(geom::vector<T, N> p) const T lazy_perlin_view<T, N>::operator()(geom::point<T, N> p) const
{ {
return detail::perlin_impl(p, grid_size_, [this](auto const & c){ return detail::perlin_impl(p, grid_size_, [this](auto const & c){
return subgrid_(c - origin_); return subgrid_(c - origin_);
@ -173,7 +174,7 @@ namespace psemek::pcg
} }
template <typename T, std::size_t N> template <typename T, std::size_t N>
T lazy_perlin<T, N>::operator()(geom::vector<T, N> p) const T lazy_perlin<T, N>::operator()(geom::point<T, N> p) const
{ {
return detail::perlin_impl(p, grid_size_, [this](auto const & c){ return grid_at(c); }, [](auto const & p){ return p; }); return detail::perlin_impl(p, grid_size_, [this](auto const & c){ return grid_at(c); }, [](auto const & p){ return p; });
} }
@ -203,7 +204,7 @@ namespace psemek::pcg
} }
template <typename T, std::size_t N> template <typename T, std::size_t N>
T bounded_lazy_perlin<T, N>::operator()(geom::vector<T, N> p) const T bounded_lazy_perlin<T, N>::operator()(geom::point<T, N> p) const
{ {
return detail::perlin_impl(p, grid_size_, [this](auto const & c){ return grid_at(c); }, [this](auto p){ return detail::perlin_impl(p, grid_size_, [this](auto const & c){ return grid_at(c); }, [this](auto p){
for (std::size_t i = 0; i < N; ++i) for (std::size_t i = 0; i < N; ++i)