11#ifndef PBAT_GEOMETRY_SDF_COMPOSITE_H
12#define PBAT_GEOMETRY_SDF_COMPOSITE_H
15#include "PhysicsBasedAnimationToolkitExport.h"
20#include "pbat/HostDevice.h"
35template <common::CArithmetic TScalar>
93template <common::CArithmetic TScalar>
108 std::span<std::pair<int, int>
const> children,
109 std::span<int const> roots);
144 std::span<Node<ScalarType>
const>
mNodes;
145 std::span<Transform<ScalarType>
const>
147 std::span<std::pair<int, int>
const>
163 -> std::pair<std::vector<int>, std::vector<int>>;
165template <common::CArithmetic TScalar>
169 std::span<std::pair<int, int>
const> children,
170 std::span<int const> roots)
177 std::size_t
const nNodes =
mNodes.size();
178 for (std::size_t n = 0ULL; n < nNodes; ++n)
183 [&](
auto const& node) {
184 using NodeType = std::remove_cvref_t<
decltype(node)>;
185 if constexpr (std::is_base_of_v<Primitive, NodeType>)
190 else if constexpr (std::is_base_of_v<UnaryNode, NodeType>)
197 else if constexpr (std::is_base_of_v<BinaryNode, NodeType>)
207template <common::CArithmetic TScalar>
211 TScalar sd = numeric_limits<TScalar>::max();
213 sd = min(sd,
Eval(root, p));
217template <common::CArithmetic TScalar>
220 std::size_t
const nStl =
static_cast<std::size_t
>(n);
224 [&](
auto const& node) {
225 using NodeType = std::remove_cvref_t<
decltype(node)>;
226 if constexpr (std::is_base_of_v<Primitive, NodeType>)
230 else if constexpr (std::is_base_of_v<UnaryNode, NodeType>)
234 return Eval(child, x);
237 else if constexpr (std::is_base_of_v<BinaryNode, NodeType>)
241 sd = node.Eval(
Eval(ci, q),
Eval(cj, q));
248template <common::CArithmetic TScalar>
255 g = k *
Eval(p + h * k);
257 g += k *
Eval(p + h * k);
259 g += k *
Eval(p + h * k);
261 g += k *
Eval(p + h * k);
This file defines binary nodes for a SDF compositions.
This file defines primitive SDF shapes.
This file defines common type definitions used in the SDF module.
This file defines unary nodes for SDF compositions.
Namespace for signed distance functions (SDFs) and related operations.
Definition BinaryNode.cpp:3
math::linalg::mini::SVector< TScalar, 3 > Vec3
3D vector type
Definition TypeDefs.h:23
ECompositeStatus
Status of the composite SDF.
Definition Composite.h:84
@ InvalidForest
The SDF forest topology is invalid (wrong children/ancestor relations)
Definition Composite.h:86
@ UnexpectedNodeType
An unexpected node type was encountered.
Definition Composite.h:87
@ Valid
The composite SDF can be evaluated.
Definition Composite.h:85
std::variant< Sphere< TScalar >, Box< TScalar >, BoxFrame< TScalar >, Torus< TScalar >, CappedTorus< TScalar >, Link< TScalar >, InfiniteCylinder< TScalar >, Cone< TScalar >, InfiniteCone< TScalar >, Plane< TScalar >, HexagonalPrism< TScalar >, Capsule< TScalar >, VerticalCapsule< TScalar >, CappedCylinder< TScalar >, VerticalCappedCylinder< TScalar >, RoundedCylinder< TScalar >, VerticalCappedCone< TScalar >, CutHollowSphere< TScalar >, VerticalRoundCone< TScalar >, Octahedron< TScalar >, Pyramid< TScalar >, Triangle< TScalar >, Quadrilateral< TScalar >, Scale< TScalar >, Elongate< TScalar >, Round< TScalar >, Onion< TScalar >, Symmetrize< TScalar >, Repeat< TScalar >, RotationalRepeat< TScalar >, Bump< TScalar >, Twist< TScalar >, Bend< TScalar >, Union< TScalar >, Difference< TScalar >, Intersection< TScalar >, ExclusiveOr< TScalar >, SmoothUnion< TScalar >, SmoothDifference< TScalar >, SmoothIntersection< TScalar > > Node
Variant type representing a node in the composite SDF forest.
Definition Composite.h:36
auto FindRootsAndParents(std::span< std::pair< int, int > const > children) -> std::pair< std::vector< int >, std::vector< int > >
Find the roots and parents of a composite SDF forest given its children.
Definition Composite.cpp:5
Bend operation around the z axis.
Definition UnaryNode.h:361
Box frame with half extents and thickness .
Definition Primitive.h:120
Axis-aligned box centered in with half extents .
Definition Primitive.h:81
Wave-like bumpiness operation along the axes.
Definition UnaryNode.h:284
Capped cylinder shape with endpoints and radius .
Definition Primitive.h:563
Capped torus centered in with parameters sc, ra, rb.
Definition Primitive.h:207
Capsule shape with endpoints and radius .
Definition Primitive.h:482
PBAT_HOST_DEVICE Vec3< ScalarType > Grad(Vec3< ScalarType > const &p, ScalarType h) const
Evaluate the (numerical) gradient of the signed distance function at a given point using a central di...
Definition Composite.h:249
std::span< Transform< ScalarType > const > mTransforms
|# nodes| transforms associated to each node
Definition Composite.h:146
std::span< int const > mRoots
|# roots| root indices of the composite SDF
Definition Composite.h:152
TScalar ScalarType
Scalar type.
Definition Composite.h:96
PBAT_HOST_DEVICE ECompositeStatus Status() const
Get the status of the composite SDF.
Definition Composite.h:142
std::span< Node< ScalarType > const > mNodes
|# nodes| nodes in the composite SDF
Definition Composite.h:144
PBAT_HOST_DEVICE ScalarType Eval(Vec3< ScalarType > const &p) const
Evaluate the signed distance function at a given point.
Definition Composite.h:208
std::span< std::pair< int, int > const > mChildren
Definition Composite.h:148
PBAT_HOST_DEVICE Composite(std::span< Node< ScalarType > const > nodes, std::span< Transform< ScalarType > const > transforms, std::span< std::pair< int, int > const > children, std::span< int const > roots)
Construct a composite SDF from nodes, transforms, children, ancestors and roots.
Definition Composite.h:166
ECompositeStatus mStatus
Status of the composite SDF.
Definition Composite.h:153
Cone shape.
Definition Primitive.h:331
Cut hollow sphere shape with radius , cut height and thickness .
Definition Primitive.h:753
Difference operation.
Definition BinaryNode.h:58
Elongation operation along the axes.
Definition UnaryNode.h:72
Exclusive or operation.
Definition BinaryNode.h:100
Hexagonal prism shape.
Definition Primitive.h:436
Infinite cone shape.
Definition Primitive.h:377
Infinite cylinder.
Definition Primitive.h:294
Intersection operation.
Definition BinaryNode.h:79
Link shape as elongated torus with elongation length and minor+major radius .
Definition Primitive.h:254
Octahedron shape.
Definition Primitive.h:848
Onion operation (i.e. carving interior)
Definition UnaryNode.h:139
Plane shape with normal and point on the plane .
Definition Primitive.h:416
Pyramid shape.
Definition Primitive.h:896
Quadrilateral shape with vertices .
Definition Primitive.h:1019
Grid-like repetition operation along the axes.
Definition UnaryNode.h:197
Circular repetition operation around axe.
Definition UnaryNode.h:240
Rounding operation (i.e. positive offset surface)
Definition UnaryNode.h:107
Rounded cylinder shape with height , radius and rounding radius .
Definition Primitive.h:656
Uniform scaling operation.
Definition UnaryNode.h:40
Smooth difference operation.
Definition BinaryNode.h:154
Smooth intersection operation.
Definition BinaryNode.h:186
Smooth union operation.
Definition BinaryNode.h:121
Sphere centered in with radius .
Definition Primitive.h:50
Symmetrization operation along the x axis.
Definition UnaryNode.h:172
Torus centered in with minor+major radius .
Definition Primitive.h:172
Triangle shape.
Definition Primitive.h:955
Twist operation around the y axis.
Definition UnaryNode.h:325
Union operation.
Definition BinaryNode.h:35
Capped cone shape with height and minor+major radius .
Definition Primitive.h:700
Vertical capped cylinder shape with height and radius .
Definition Primitive.h:615
Capsule shape with height and radius .
Definition Primitive.h:525
Vertical round cone shape with height , radii at endpoints.
Definition Primitive.h:798