27#ifndef EBGEOMETRY_FUSED_HPP
28#define EBGEOMETRY_FUSED_HPP
82template <
class S,
class... Rest>
104template <
size_t I,
class S,
class... Rest>
109 if constexpr (I == 0) {
110 return a_pack.m_head;
113 return get<I - 1>(a_pack.m_tail);
125template <
size_t I,
class S,
class... Rest>
130 if constexpr (I == 0) {
131 return a_pack.m_head;
134 return get<I - 1>(a_pack.m_tail);
143template <
size_t I,
class... Cs>
151template <
class C,
class... Rest>
166template <
size_t I,
class C,
class... Rest>
179template <
class... Cs>
187template <
class... Cs>
196 q = (
static_cast<int>(c) >
static_cast<int>(q)) ? c : q;
206template <
bool Handle>
245template <
class... Cs>
261 static constexpr size_t count =
sizeof...(Cs);
270 template <
size_t I,
class T>
275 using C =
typename TypeAt<I, Cs...>::type;
277 if constexpr (isPoolHandle<C>) {
281 return get<I>(
m_pack).signedDistance(a_point);
295 using C =
typename TypeAt<I, Cs...>::type;
297 return CSGDetail::fromStored<C>(get<I>(
m_pack),
m_location).computeBoundingVolume();
311template <
class Op,
class... Cs>
315 static_assert(
sizeof...(Cs) > 0,
"Fused::Node needs an operand");
316 static_assert((isShape<Cs> && ...),
"Fused::Node: every operand must be a shape (see isShape)");
323 static_assert((std::is_same_v<ShapePrecision<Cs>,
T> && ...),
"Fused::Node: the operands' precisions differ");
361 template <
bool H = isHandle, std::enable_if_t<!H,
int> = 0>
363 explicit Node(
const Layout& a_layout) noexcept : m_layout(a_layout)
371 template <
bool H = isHandle, std::enable_if_t<H,
int> = 0>
397 return m_layout.
m_op.evaluate(this->operands(), a_point);
408 return m_layout.
m_op.box(this->operands());
443 operands() const noexcept
453template <
bool IsUnion>
461 template <
class... Cs>
476 template <
class O,
class T>
481 return this->fold(a_operands, a_point, std::make_index_sequence<O::count - 1>{});
493 box(
const O& a_operands)
const
495 return this->boxes(a_operands, std::make_index_sequence<O::count>{});
508 template <
class O,
class T,
size_t... Is>
511 fold(
const O& a_operands,
const Vec3T<T>& a_point, std::index_sequence<Is...>)
const noexcept
513 T value = a_operands.template value<0>(a_point);
515 if constexpr (IsUnion) {
516 ((value =
Math::min(value, a_operands.template value<Is + 1>(a_point))), ...);
519 ((value =
Math::max(value, a_operands.template value<Is + 1>(a_point))), ...);
532 template <
class O,
size_t... Is>
535 boxes(
const O& a_operands, std::index_sequence<Is...>)
const
537 using Box =
decltype(a_operands.template box<0>());
538 using T = std::decay_t<
decltype(a_operands.template box<0>().getLowCorner()[0])>;
540 Box
box = IsUnion ? Box() : ExprDetail::everywhere<T>();
542 if constexpr (IsUnion) {
543 ((
box =
box.merged(a_operands.template box<Is>())), ...);
546 ((
box = ExprDetail::intersected(
box, a_operands.template box<Is>())), ...);
568template <
class T,
bool IsUnion>
586 template <
class... Cs>
605 return this->blend(a_operands, a_point, std::make_index_sequence<O::count>{});
618 box(
const O& a_operands)
const
622 if constexpr (IsUnion) {
639 template <
class O,
size_t... Is>
642 blend(
const O& a_operands,
const Vec3T<T>& a_point, std::index_sequence<Is...>)
const noexcept
666 return distanceQualityOf<C>;
677 template <
class O,
class T>
682 return -a_operands.template value<0>(a_point);
694 box(
const O& a_operands)
const
696 using T = std::decay_t<
decltype(a_operands.template box<0>().getLowCorner()[0])>;
698 return ExprDetail::everywhere<T>();
734 return distanceQualityOf<C>;
763 box(
const O& a_operands)
const
765 return m_inverse.transform(a_operands.template box<0>());
790 return Detail::worstAndBound<C>();
817 box(
const O& a_operands)
const
819 return ExprDetail::grown(a_operands.template box<0>(),
m_halfLengths);
828template <
class T,
bool IsAnnulus>
846 return IsAnnulus ? distanceQualityOf<C> : Detail::worstAndBound<C>();
861 const T value = a_operands.template value<0>(a_point);
863 if constexpr (IsAnnulus) {
880 box(
const O& a_operands)
const
882 return ExprDetail::grown(a_operands.template box<0>(),
Math::max(
m_amount, T(0)));
908 return Detail::worstAndBound<C>();
923 const auto f = [&a_operands](
const Vec3T<T>& a_x)
noexcept -> T {
return a_operands.template value<0>(a_x); };
937 box(
const O& a_operands)
const;
961 return Detail::worstAndBound<C>();
976 const auto f = [&a_operands](
const Vec3T<T>& a_x)
noexcept -> T {
return a_operands.template value<0>(a_x); };
990 box(
const O& a_operands)
const
992 return ExprDetail::grown(a_operands.template box<0>(), std::sqrt(T(3)) *
m_weights.m_values[0]);
1024 return Detail::worstAndBound<C>();
1040 return a_operands.template value<0>(a_point);
1043 const auto f = [&a_operands](
const Vec3T<T>& a_x)
noexcept -> T {
return a_operands.template value<0>(a_x); };
1057 box(
const O& a_operands)
const
1070template <
class... Cs>
1085template <
class... Cs>
1095template <
class Op,
class... Cs>
1106template <
class C,
class... Cs>
1109Union(
const C& a_first,
const Cs&... a_others);
1119template <
class C,
class... Cs>
1134template <
class A,
class B,
class... Bs>
1137Difference(
const A& a_first,
const B& a_second,
const Bs&... a_others);
1160template <
class A,
class B>
1177template <
class... Cs>
1194template <
class A,
class B>
1210template <
class... Cs>
1227template <
class A,
class B>
1245template <
class A,
class... Bs>
1404#include "EBGeometry_FusedImplem.hpp"
Declaration of Affine3T, an affine map of 3D space (a 3x3 matrix and a shift).
BVH-accelerated unions of many primitives of one type: BVHUnion and BVHSmoothUnion.
Declarations of bounding volume types used in bounding volume hierarchies.
The arithmetic of each CSG operation, shared by the Tape's evaluator and the fused operations.
How far a function's value can be trusted as a distance: DistanceQuality, and the distanceQualityOf t...
The tape's front end: Expr, a host-side value that describes a composed object, and the free function...
GPU portability layer: host/device decoration macros and backend detection.
#define EBGEOMETRY_HOST_DEVICE
Mark a function as callable from both host and device code (no-op on host compilers).
Definition EBGeometry_GPU.hpp:80
#define EBGEOMETRY_HOST
Mark a function as callable from host code only (no-op on host compilers).
Definition EBGeometry_GPU.hpp:83
Utility macros for EBGeometry.
Growable bump arena for the GPU memory foundation.
Declaration of 2D and 3D point/vector classes with templated precision, and free functions on them.
Axis-aligned bounding box (AABB) enclosing a set of 3D points.
Definition EBGeometry_BoundingVolumes.hpp:37
A fused composition: an operation applied to its operands, itself a shape (isShape).
Definition EBGeometry_Fused.hpp:313
ShapePrecision< typename Detail::TypeAt< 0, Cs... >::type > T
Floating-point precision.
Definition EBGeometry_Fused.hpp:321
Node(const Layout &a_layout) noexcept
A node from its layout, for a node with no pool-resident operand.
Definition EBGeometry_Fused.hpp:363
static constexpr DistanceQuality distanceQuality
How far signedDistance() can be trusted as a distance (see DistanceQuality).
Definition EBGeometry_Fused.hpp:333
static constexpr bool isHandle
Whether the node lives in a pool: whether one of its operands does.
Definition EBGeometry_Fused.hpp:328
Node(const Layout &a_layout, const PoolLocation &a_location) noexcept
A node from its layout and the location its pool-resident operands resolve against.
Definition EBGeometry_Fused.hpp:373
BoundingVolumes::AABBT< T > computeBoundingVolume() const
The composition's bounding box, by the rules of the expression builder.
Definition EBGeometry_Fused.hpp:406
Node rebasedView(const Pool &a_pool) const noexcept
The same node resolving against a mirror of its pool (see Pool::mirror()); a node with no pool-reside...
const Layout & layout() const noexcept
The node's layout.
Definition EBGeometry_Fused.hpp:383
T signedDistance(const Vec3T< T > &a_point) const noexcept
The composition's value at a point.
Definition EBGeometry_Fused.hpp:395
Node()=delete
Disallowed: build a node with a Fused:: function.
Node deepCopy(Pool &a_dstPool) const
A copy of the node whose pool-resident operands are copied into another pool; a node with no pool-res...
Base of every pool-resident handle: the one PoolLocation its arrays resolve against.
Definition EBGeometry_Pool.hpp:499
Growable bump arena over a MemoryResource.
Definition EBGeometry_Pool.hpp:183
Three-dimensional vector class with arithmetic operators.
Definition EBGeometry_Vec.hpp:258
Vec3T< T > elongatePoint(const Vec3T< T > &a_halfLengths, const Vec3T< T > &a_point) noexcept
The point an elongation evaluates its operand at: p - clamp(p, -h, h).
Definition EBGeometry_CSGOps.hpp:451
T offset(const T a_value, const T a_offset) noexcept
An offset's value: v - r, computed as v + (-r).
Definition EBGeometry_CSGOps.hpp:468
T annular(const T a_value, const T a_delta) noexcept
An annulus's value: |v| - delta, computed as |v| + (-delta).
Definition EBGeometry_CSGOps.hpp:483
auto mollify(const MollifyGrid< T > &a_grid, const Vec3T< T > &a_point, const F &a_operand) noexcept
A mollification's value: sum_k w_k f(p - o_k) over the grid's taps, each weight divided by the sum of...
Definition EBGeometry_CSGOps.hpp:836
T pairBlend(const Pair< T > &a_pair, const T a_smooth, const bool a_largest, const bool a_exponential) noexcept
The smooth minimum (or maximum) of a pair's two values.
Definition EBGeometry_CSGOps.hpp:603
void pairInsert(Pair< T > &a_pair, const T a_value, const bool a_largest) noexcept
Insert a value into a pair of extreme values.
Definition EBGeometry_CSGOps.hpp:547
Vec3T< T > affinePoint(const T *a_coefficients, const Vec3T< T > &a_point) noexcept
The point an affine map sends a query point to: the point the mapped object's operand sees.
Definition EBGeometry_CSGOps.hpp:415
auto blur(const T *a_weights, const Vec3T< T > &a_point, const F &a_operand) noexcept
A blur's value: the weighted sum of its operand's values at the 27 points p + d (i,...
Definition EBGeometry_CSGOps.hpp:682
constexpr DistanceQuality worstAndBound() noexcept
The worst distance quality among some operand types, and Bound (Exact < Bound < NotADistance).
Definition EBGeometry_Fused.hpp:189
const auto & get(const Pack< S, Rest... > &a_pack) noexcept
Operand I of a pack.
Definition EBGeometry_Fused.hpp:107
constexpr bool anyPoolHandle
Whether any of the operand types lives in a pool.
Definition EBGeometry_Fused.hpp:180
Node< ShiftOp< ShapePrecision< C >, false >, C > Offset(const C &a_operand, const ShapePrecision< C > a_offset)
Offset a shape's surface outward by a distance, v - r.
auto SmoothDifference(const A &a_first, const B &a_second, const ShapePrecision< A > a_smooth, const BlendKind a_blend=BlendKind::Polynomial)
Smooth difference A \ B: the smooth intersection of A and the complement of B.
auto Intersection(const C &a_first, const Cs &... a_others)
Intersection of shapes: the maximum of their values. One shape is returned as is.
Node< SmoothCombineOp< ShapePrecision< A >, false >, A, B > SmoothIntersection(const A &a_first, const B &a_second, const ShapePrecision< A > a_smooth, const BlendKind a_blend=BlendKind::Polynomial)
Smooth intersection of two shapes: a smooth maximum of their values.
auto Reflect(const C &a_operand, const size_t a_axis)
Reflect a shape in a coordinate plane through the origin.
OperandList< Cs... > operands(const Cs &... a_operands)
A list of operands for an n-ary smooth operation.
Node< BlurOp< ShapePrecision< C > >, C > Blur(const C &a_operand, const ShapePrecision< C > a_blur, const ShapePrecision< C > a_alpha=ShapePrecision< C >(0.5))
Blur a shape: a weighted average of its values at the 27 points p + d (i, j, k), i,...
Node< MollifyOp< ShapePrecision< C > >, C > Mollify(const C &a_operand, const ShapePrecision< C > a_dist, const size_t a_samples)
Mollify a shape: convolve it with a smooth bump kernel sampled on an n x n x n grid over [-r,...
Node< RepetitionOp< ShapePrecision< C > >, C > FiniteRepetition(const C &a_operand, const Vec3T< ShapePrecision< C > > &a_period, const Vec3T< ShapePrecision< C > > &a_repeatLo, const Vec3T< ShapePrecision< C > > &a_repeatHi)
Finite repetition: copies of a shape on a grid of tiles, the minimum over all of them (see EBGeometry...
Node< ElongateOp< ShapePrecision< C > >, C > Elongate(const C &a_operand, const Vec3T< ShapePrecision< C > > &a_elongation)
Elongate a shape: stretch it by inserting a box of half-lengths h at the origin.
Node< ComplementOp, C > Complement(const C &a_operand)
Complement: inside and outside swapped, -v.
auto Scale(const C &a_operand, const ShapePrecision< C > a_factor)
Scale a shape uniformly about the origin: |s| times its value at p / s.
Node< SmoothCombineOp< ShapePrecision< A >, true >, A, B > SmoothUnion(const A &a_first, const B &a_second, const ShapePrecision< A > a_smooth, const BlendKind a_blend=BlendKind::Polynomial)
Smooth union of two shapes: a smooth minimum of their values.
auto Translate(const C &a_operand, const Vec3T< ShapePrecision< C > > &a_shift)
Translate a shape by a shift.
auto Difference(const A &a_first, const B &a_second, const Bs &... a_others)
Difference A \ (B1 u B2 u ...): max(A, -min_i Bi).
auto Union(const C &a_first, const Cs &... a_others)
Union of shapes: the minimum of their values. One shape is returned as is.
Node< ShiftOp< ShapePrecision< C >, true >, C > Annular(const C &a_operand, const ShapePrecision< C > a_delta)
A shell around a shape's surface, |v| - delta.
auto Rotate(const C &a_operand, const ShapePrecision< C > a_degrees, const size_t a_axis)
Rotate a shape about a coordinate axis through the origin.
constexpr T max(const T &a_a, const T &a_b) noexcept
The larger of two values.
Definition EBGeometry_Math.hpp:61
constexpr T min(const T &a_a, const T &a_b) noexcept
The smaller of two values.
Definition EBGeometry_Math.hpp:44
Namespace containing all of EBGeometry's functionality.
Definition EBGeometry_Affine.hpp:26
BlendKind
How a smooth union, intersection or difference blends the two extreme values.
Definition EBGeometry_Expr.hpp:42
@ Polynomial
SmoothMinOp/SmoothMaxOp: quadratic blend over a band of width s; deepens by at most s/4.
typename ExprDetail::ShapeInfo< S >::precision ShapePrecision
The precision of a shape type: T for a shape whose box type is AABBT<T>.
Definition EBGeometry_Expr.hpp:158
DistanceQuality
How far the value of a signed distance function can be trusted, from strongest to weakest.
Definition EBGeometry_DistanceQuality.hpp:25
@ Bound
The value's magnitude never exceeds the distance to the surface: it may underestimate,...
An affine map of 3D space, x -> A x + b, with A stored by rows.
Definition EBGeometry_Affine.hpp:37
A blur's distance and weights.
Definition EBGeometry_CSGOps.hpp:640
A mollification's tap grid: n taps per axis over [-r, r]^3, and the sum of their weights.
Definition EBGeometry_CSGOps.hpp:776
The two most extreme values seen so far, for an n-ary smooth union or intersection.
Definition EBGeometry_CSGOps.hpp:496
A finite repetition: copies of an object on a grid of tiles.
Definition EBGeometry_CSGOps.hpp:888
An affine map (translation, rotation, scaling, reflection, or a composition of them): the operand's v...
Definition EBGeometry_Fused.hpp:709
Affine3T< T > m_map
The map from a query point to the point the operand sees.
Definition EBGeometry_Fused.hpp:713
BoundingVolumes::AABBT< T > box(const O &a_operands) const
The box: the operand's, mapped by the inverse.
Definition EBGeometry_Fused.hpp:763
Affine3T< T > m_inverse
Its inverse, which maps the operand's box.
Definition EBGeometry_Fused.hpp:718
T m_valueScale
Value scale: |s| for a scaling by s, which keeps a distance a distance.
Definition EBGeometry_Fused.hpp:723
static constexpr DistanceQuality quality() noexcept
Distance quality: the operand's.
Definition EBGeometry_Fused.hpp:732
T evaluate(const O &a_operands, const Vec3T< T > &a_point) const noexcept
The value.
Definition EBGeometry_Fused.hpp:747
Blur: a weighted average of the operand's values at 27 points (CSGOps::blur()).
Definition EBGeometry_Fused.hpp:946
BoundingVolumes::AABBT< T > box(const O &a_operands) const
The box: the operand's, grown by sqrt(3) d.
Definition EBGeometry_Fused.hpp:990
T evaluate(const O &a_operands, const Vec3T< T > &a_point) const noexcept
The value.
Definition EBGeometry_Fused.hpp:974
static constexpr DistanceQuality quality() noexcept
Distance quality: a bound, unless the operand is not a distance.
Definition EBGeometry_Fused.hpp:959
CSGOps::BlurWeights< T > m_weights
Blur distance and weights.
Definition EBGeometry_Fused.hpp:950
Union or intersection: the minimum or the maximum of the operands' values, in order.
Definition EBGeometry_Fused.hpp:455
auto box(const O &a_operands) const
The box: the union, or the intersection, of the operands' boxes.
Definition EBGeometry_Fused.hpp:493
T evaluate(const O &a_operands, const Vec3T< T > &a_point) const noexcept
The value.
Definition EBGeometry_Fused.hpp:479
static constexpr DistanceQuality quality() noexcept
Distance quality: a bound at best.
Definition EBGeometry_Fused.hpp:463
Complement: -v, inside and outside swapped.
Definition EBGeometry_Fused.hpp:656
auto box(const O &a_operands) const
The box: everywhere.
Definition EBGeometry_Fused.hpp:694
T evaluate(const O &a_operands, const Vec3T< T > &a_point) const noexcept
The value.
Definition EBGeometry_Fused.hpp:680
static constexpr DistanceQuality quality() noexcept
Distance quality: the operand's.
Definition EBGeometry_Fused.hpp:664
Base() noexcept=default
An unset location.
A value node's base: no pool, and an unset location for the code that asks for one.
Definition EBGeometry_Fused.hpp:208
PoolLocation location() const noexcept
An unset location: a value node resolves nothing against a pool.
Definition EBGeometry_Fused.hpp:215
The operands of a node, with the location their pool-resident ones resolve against.
Definition EBGeometry_Fused.hpp:247
static constexpr size_t count
Number of operands.
Definition EBGeometry_Fused.hpp:261
const Pack< CSGDetail::Stored< Cs >... > & m_pack
The operands, as stored.
Definition EBGeometry_Fused.hpp:251
auto box() const
Operand I's bounding box.
Definition EBGeometry_Fused.hpp:293
T value(const Vec3T< T > &a_point) const noexcept
Operand I's value at a point.
Definition EBGeometry_Fused.hpp:273
PoolLocation m_location
The node's location.
Definition EBGeometry_Fused.hpp:256
S m_head
First operand.
Definition EBGeometry_Fused.hpp:88
Pack< Rest... > m_tail
The others.
Definition EBGeometry_Fused.hpp:93
The operands of a fused node, as stored: a recursive aggregate, so that it stays trivially copyable a...
Definition EBGeometry_Fused.hpp:67
C type
The type.
Definition EBGeometry_Fused.hpp:157
typename TypeAt< I - 1, Rest... >::type type
The type.
Definition EBGeometry_Fused.hpp:172
Type I of a list of types.
Definition EBGeometry_Fused.hpp:144
Elongation: the operand's value at p - clamp(p, -h, h).
Definition EBGeometry_Fused.hpp:775
BoundingVolumes::AABBT< T > box(const O &a_operands) const
The box: the operand's, grown by h.
Definition EBGeometry_Fused.hpp:817
T evaluate(const O &a_operands, const Vec3T< T > &a_point) const noexcept
The value.
Definition EBGeometry_Fused.hpp:803
Vec3T< T > m_halfLengths
Half-lengths h of the inserted box.
Definition EBGeometry_Fused.hpp:779
static constexpr DistanceQuality quality() noexcept
Distance quality: a bound at best.
Definition EBGeometry_Fused.hpp:788
Mollification: the operand convolved with a bump kernel sampled on a grid (CSGOps::mollify()).
Definition EBGeometry_Fused.hpp:1004
BoundingVolumes::AABBT< T > box(const O &a_operands) const
The box: the operand's, grown by sqrt(3) r (the operand's own if there is nothing to average).
Definition EBGeometry_Fused.hpp:1057
CSGOps::MollifyGrid< T > m_grid
The tap grid.
Definition EBGeometry_Fused.hpp:1008
T evaluate(const O &a_operands, const Vec3T< T > &a_point) const noexcept
The value.
Definition EBGeometry_Fused.hpp:1037
bool m_identity
Whether there is nothing to average over (one sample per axis, or a zero distance).
Definition EBGeometry_Fused.hpp:1013
static constexpr DistanceQuality quality() noexcept
Distance quality: a bound, unless the operand is not a distance.
Definition EBGeometry_Fused.hpp:1022
Everything the node holds: the operation's parameters and its operands (their layouts for pool-reside...
Definition EBGeometry_Fused.hpp:340
Detail::Pack< CSGDetail::Stored< Cs >... > m_operands
The operands, as stored.
Definition EBGeometry_Fused.hpp:349
Op m_op
The operation.
Definition EBGeometry_Fused.hpp:344
A list of operands, for the n-ary smooth operations (whose smoothing parameters follow the operands):...
Definition EBGeometry_Fused.hpp:1072
Detail::Pack< Cs... > m_items
The operands.
Definition EBGeometry_Fused.hpp:1076
Finite repetition: the minimum of the operand's value over all its copies (CSGOps::repetition()).
Definition EBGeometry_Fused.hpp:893
T evaluate(const O &a_operands, const Vec3T< T > &a_point) const noexcept
The value.
Definition EBGeometry_Fused.hpp:921
BoundingVolumes::AABBT< T > box(const O &a_operands) const
The box: the operand's, swept over the tiles.
CSGOps::Repetition< T > m_repetition
The repetition: period, tile counts and the operand's box.
Definition EBGeometry_Fused.hpp:897
static constexpr DistanceQuality quality() noexcept
Distance quality: a bound at best.
Definition EBGeometry_Fused.hpp:906
Offset (v - r) or annulus (|v| - delta).
Definition EBGeometry_Fused.hpp:830
T m_amount
The offset r, or the half-thickness delta.
Definition EBGeometry_Fused.hpp:834
T evaluate(const O &a_operands, const Vec3T< T > &a_point) const noexcept
The value.
Definition EBGeometry_Fused.hpp:859
BoundingVolumes::AABBT< T > box(const O &a_operands) const
The box: the operand's, grown by max(0, r) or max(0, delta).
Definition EBGeometry_Fused.hpp:880
static constexpr DistanceQuality quality() noexcept
Distance quality. An annulus keeps the operand's; an offset is a bound at best, since a negative offs...
Definition EBGeometry_Fused.hpp:844
Smooth union or intersection: a smooth minimum (maximum) of the two smallest (largest) values.
Definition EBGeometry_Fused.hpp:570
static constexpr DistanceQuality quality() noexcept
Distance quality: a bound at best.
Definition EBGeometry_Fused.hpp:588
bool m_exponential
Whether the blend is exponential (BlendKind::Exponential) rather than polynomial.
Definition EBGeometry_Fused.hpp:579
T m_smooth
Smoothing length.
Definition EBGeometry_Fused.hpp:574
T evaluate(const O &a_operands, const Vec3T< T > &a_point) const noexcept
The value.
Definition EBGeometry_Fused.hpp:603
BoundingVolumes::AABBT< T > box(const O &a_operands) const
The box: as a union or intersection's, a union's grown by how far the blend can move its surface out ...
Definition EBGeometry_Fused.hpp:618
Where a pool-resident descriptor resolves its offsets, and the rules for moving it.
Definition EBGeometry_Pool.hpp:99