Support generating pcg::lazy_perlin subview
This commit is contained in:
parent
079157f201
commit
06313a0234
1 changed files with 63 additions and 0 deletions
|
|
@ -59,6 +59,28 @@ namespace psemek::pcg
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
struct lazy_perlin_view
|
||||||
|
{
|
||||||
|
using value_type = T;
|
||||||
|
static constexpr auto dimension = N;
|
||||||
|
|
||||||
|
lazy_perlin_view() = default;
|
||||||
|
|
||||||
|
lazy_perlin_view(std::size_t grid_size, geom::vector<int, N> const & view_origin, util::array<geom::vector<T, N>, N> subgrid)
|
||||||
|
: grid_size_(grid_size)
|
||||||
|
, origin_(view_origin)
|
||||||
|
, subgrid_(std::move(subgrid))
|
||||||
|
{}
|
||||||
|
|
||||||
|
T operator()(geom::vector<T, N> p) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int grid_size_;
|
||||||
|
geom::vector<int, N> origin_;
|
||||||
|
util::array<geom::vector<T, N>, N> subgrid_;
|
||||||
|
};
|
||||||
|
|
||||||
template <typename T, std::size_t N>
|
template <typename T, std::size_t N>
|
||||||
struct lazy_perlin
|
struct lazy_perlin
|
||||||
{
|
{
|
||||||
|
|
@ -74,6 +96,8 @@ namespace psemek::pcg
|
||||||
|
|
||||||
T operator()(geom::vector<T, N> p) const;
|
T operator()(geom::vector<T, N> p) const;
|
||||||
|
|
||||||
|
auto subview(geom::box<T, N> const & box) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int const grid_size_;
|
int const grid_size_;
|
||||||
mutable std::unordered_map<geom::vector<int, N>, geom::vector<T, N>> grid_;
|
mutable std::unordered_map<geom::vector<int, N>, geom::vector<T, N>> grid_;
|
||||||
|
|
@ -133,12 +157,51 @@ namespace psemek::pcg
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
T lazy_perlin_view<T, N>::operator()(geom::vector<T, N> p) const
|
||||||
|
{
|
||||||
|
return detail::perlin_impl(p, grid_size_, [this](auto const & c){
|
||||||
|
return subgrid_(c - origin_);
|
||||||
|
}, [this](auto p){
|
||||||
|
for (std::size_t i = 0; i < N; ++i)
|
||||||
|
{
|
||||||
|
p[i] = std::max<int>(p[i], origin_[i]);
|
||||||
|
p[i] = std::min<int>(p[i], origin_[i] + subgrid_.dim(i));
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
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::vector<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; });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
auto lazy_perlin<T, N>::subview(geom::box<T, N> const & box) const
|
||||||
|
{
|
||||||
|
geom::vector<int, N> subgrid_origin;
|
||||||
|
std::array<std::size_t, N> subgrid_dimensions;
|
||||||
|
for (std::size_t i = 0; i < N; ++i)
|
||||||
|
{
|
||||||
|
subgrid_origin[i] = std::floor(box[i].min / grid_size_);
|
||||||
|
int subgrid_max = std::ceil(box[i].max / grid_size_);
|
||||||
|
subgrid_dimensions[i] = subgrid_max - subgrid_origin[i] + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
util::array<geom::vector<T, N>, N> subgrid(subgrid_dimensions);
|
||||||
|
for (auto const idx : subgrid.indices())
|
||||||
|
{
|
||||||
|
geom::vector<int, N> id;
|
||||||
|
for (std::size_t i = 0; i < N; ++i)
|
||||||
|
id[i] = subgrid_origin[i] + idx[i];
|
||||||
|
subgrid(idx) = grid_at(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return lazy_perlin_view<T, N>(grid_size_, subgrid_origin, std::move(subgrid));
|
||||||
|
}
|
||||||
|
|
||||||
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::vector<T, N> p) const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue