11#ifndef PBAT_GEOMETRY_TETRAHEDRALAABBHIERARCHY_H
12#define PBAT_GEOMETRY_TETRAHEDRALAABBHIERARCHY_H
18#include "PhysicsBasedAnimationToolkitExport.h"
24#include <tbb/parallel_for.h>
34 TetrahedralAabbHierarchy,
35 AxisAlignedBoundingBox<3>,
40 static auto constexpr kDims = 3;
55 Eigen::Ref<MatrixX const>
const&
V,
56 Eigen::Ref<IndexMatrixX const>
const&
C,
57 Index maxPointsInLeaf = 10);
77 template <
class RPrimitiveIndices>
101 template <
class TDerivedP,
class FCull>
103 Eigen::MatrixBase<TDerivedP>
const& P,
105 bool bParallelize =
true)
const;
113 template <
class TDerivedP>
115 Eigen::MatrixBase<TDerivedP>
const& P,
116 bool bParallelize =
true)
const;
124 template <
class TDerivedP>
138 template <
class TDerivedP>
139 void SetV(Eigen::MatrixBase<TDerivedP>
const& P)
147 [[maybe_unused]]
auto GetV()
const {
return V; }
152 [[maybe_unused]]
auto GetC()
const {
return C; }
154 Eigen::Ref<MatrixX const>
V;
155 Eigen::Ref<IndexMatrixX const>
C;
158template <
class RPrimitiveIndices>
162 auto vertices =
C(Eigen::placeholders::all,
common::Slice(pinds)).reshaped();
166template <
class TDerivedP,
class FCull>
168 Eigen::MatrixBase<TDerivedP>
const& P,
170 bool bParallelize)
const
172 PBAT_PROFILE_NAMED_SCOPE(
"pbat.geometry.TetrahedralAabbHierarchy.PrimitivesContainingPoints");
173 using math::linalg::mini::FromEigen;
176 auto const FindContainingPrimitive = [&](
Index i) {
182 auto const VT =
V(Eigen::placeholders::all, T);
184 FromEigen(P.col(i).template head<kDims>()),
185 FromEigen(VT.col(0).head<
kDims>()),
186 FromEigen(VT.col(1).head<
kDims>()),
187 FromEigen(VT.col(2).head<
kDims>()),
188 FromEigen(VT.col(3).head<
kDims>()));
190 if (not intersectingPrimitives.empty())
192 p(i) = intersectingPrimitives.front();
197 tbb::parallel_for(
Index{0},
Index{P.cols()}, FindContainingPrimitive);
201 for (
auto i = 0; i < P.cols(); ++i)
202 FindContainingPrimitive(i);
207template <
class TDerivedP>
209 Eigen::MatrixBase<TDerivedP>
const& P,
210 bool bParallelize)
const
215template <
class TDerivedP>
217 Eigen::MatrixBase<TDerivedP>
const& P,
218 bool bParallelize)
const -> std::pair<IndexVectorX, VectorX>
220 PBAT_PROFILE_NAMED_SCOPE(
"pbat.geometry.TetrahedralAabbHierarchy.NearestPrimitivesToPoints");
221 using math::linalg::mini::FromEigen;
225 d.setConstant(std::numeric_limits<Scalar>::max());
226 auto const FindNearestPrimitive = [&](
Index i) {
227 std::size_t
constexpr K{1};
230 return bv.squaredExteriorDistance(P.col(i));
233 auto const VT =
V(Eigen::placeholders::all, T);
235 FromEigen(P.col(i).template head<kDims>()),
236 FromEigen(VT.col(0).head<
kDims>()),
237 FromEigen(VT.col(1).head<
kDims>()),
238 FromEigen(VT.col(2).head<
kDims>()),
239 FromEigen(VT.col(3).head<
kDims>()));
242 p(i) = nearestPrimitives.front();
243 d(i) = distances.front();
247 tbb::parallel_for(
Index{0},
Index{P.cols()}, FindNearestPrimitive);
251 for (
auto i = 0; i < P.cols(); ++i)
252 FindNearestPrimitive(i);
Axis-aligned bounding box class.
Bounding volume hierarchy (BVH) implementation for spatial partitioning of primitives.
This file contains functions to answer distance queries.
This file contains functions to answer overlap queries.
Axis-aligned bounding box class.
Definition AxisAlignedBoundingBox.h:29
IndexVector< 4 > PrimitiveType
Definition BoundingVolumeHierarchy.h:41
std::vector< Index > PrimitivesIntersecting(FIntersectsBoundingVolume &&ibv, FIntersectsPrimitive &&ip, std::size_t reserve=50ULL) const
Definition BoundingVolumeHierarchy.h:223
AxisAlignedBoundingBox< 3 > BoundingVolumeType
Definition BoundingVolumeHierarchy.h:40
auto NearestPrimitivesTo(FDistanceToBoundingVolume &&db, FDistanceToPrimitive &&dp, std::size_t K) const -> std::pair< std::vector< Index >, std::vector< Scalar > >
Definition BoundingVolumeHierarchy.h:259
std::vector< BoundingVolumeType > mBoundingVolumes
Definition BoundingVolumeHierarchy.h:179
PBAT_API Vector< kDims > PrimitiveLocation(PrimitiveType const &primitive) const
Returns the location of the primitive.
Definition TetrahedralAabbHierarchy.cpp:44
auto NearestPrimitivesToPoints(Eigen::MatrixBase< TDerivedP > const &P, bool bParallelize=true) const -> std::pair< IndexVectorX, VectorX >
For each point in P, returns the index of the nearest primitive to it.
Definition TetrahedralAabbHierarchy.h:216
auto GetV() const
Returns this BVH's mesh's vertex positions.
Definition TetrahedralAabbHierarchy.h:147
auto GetC() const
Returns this BVH's mesh's cell indices.
Definition TetrahedralAabbHierarchy.h:152
IndexVectorX PrimitivesContainingPoints(Eigen::MatrixBase< TDerivedP > const &P, FCull fCull, bool bParallelize=true) const
For each point in P, returns the index of the primitive containing it.
Definition TetrahedralAabbHierarchy.h:167
PBAT_API PrimitiveType Primitive(Index p) const
Returns the primitive at index p.
Definition TetrahedralAabbHierarchy.cpp:37
TetrahedralAabbHierarchy SelfType
Type of this class.
Definition TetrahedralAabbHierarchy.h:41
PBAT_API IndexMatrixX OverlappingPrimitives(TetrahedralAabbHierarchy const &bvh, std::size_t reserve=1000ULL) const
Returns the overlapping primitives of this BVH and another BVH.
Definition TetrahedralAabbHierarchy.cpp:55
static auto constexpr kDims
Dimension of the space.
Definition TetrahedralAabbHierarchy.h:40
BoundingVolumeHierarchy< SelfType, AxisAlignedBoundingBox< kDims >, IndexVector< 4 >, kDims > BaseType
Base type.
Definition TetrahedralAabbHierarchy.h:42
PBAT_API void Update()
Updates the AABBs.
Definition TetrahedralAabbHierarchy.cpp:49
Eigen::Ref< MatrixX const > V
|kDims|x|# verts| vertex positions
Definition TetrahedralAabbHierarchy.h:154
PBAT_API TetrahedralAabbHierarchy(Eigen::Ref< MatrixX const > const &V, Eigen::Ref< IndexMatrixX const > const &C, Index maxPointsInLeaf=10)
Construct a TetrahedralAabbHierarchy from a tetrahedral mesh (V,C)
Definition TetrahedralAabbHierarchy.cpp:13
Eigen::Ref< IndexMatrixX const > C
4x|# tetrahedra| cell indices into V
Definition TetrahedralAabbHierarchy.h:155
BoundingVolumeType BoundingVolumeOf(RPrimitiveIndices &&pinds) const
Returns the bounding volume of the primitive.
Definition TetrahedralAabbHierarchy.h:160
auto const & GetBoundingVolumes() const
Returns this BVH's bounding volumes.
Definition TetrahedralAabbHierarchy.h:132
void SetV(Eigen::MatrixBase< TDerivedP > const &P)
Updates this BVH's mesh's vertex positions.
Definition TetrahedralAabbHierarchy.h:139
Eigen adaptors for ranges.
auto Slice(R &&r)
Slice view over a range for Eigen advanced indexing.
Definition Eigen.h:86
PBAT_HOST_DEVICE auto PointTetrahedron(TMatrixP const &P, TMatrixA const &A, TMatrixB const &B, TMatrixC const &C, TMatrixD const &D) -> typename TMatrixP::ScalarType
Obtain squared distance between point P and tetrahedron ABCD.
Definition DistanceQueries.h:230
PBAT_HOST_DEVICE bool PointTetrahedron3D(TMatrixP const &P, TMatrixA const &A, TMatrixB const &B, TMatrixC const &C, TMatrixD const &D)
Checks if point P is contained in tetrahedron ABCD, in at least 3D.
Definition OverlapQueries.h:562
Geometric queries, quantities and data structures.
Definition AabbKdTreeHierarchy.h:23
The main namespace of the library.
Definition Aliases.h:15
Eigen::Vector< Index, N > IndexVector
Fixed-size index vector type.
Definition Aliases.h:40
Eigen::Vector< Index, Eigen::Dynamic > IndexVectorX
Dynamic-size index vector type.
Definition Aliases.h:49
Eigen::Vector< Scalar, N > Vector
Fixed-size vector type.
Definition Aliases.h:24
Eigen::Vector< Scalar, Eigen::Dynamic > VectorX
Dynamic-size vector type.
Definition Aliases.h:33
std::ptrdiff_t Index
Index type.
Definition Aliases.h:17
Eigen::Matrix< Index, Eigen::Dynamic, Eigen::Dynamic > IndexMatrixX
Dynamic-size index matrix type.
Definition Aliases.h:50
double Scalar
Scalar type.
Definition Aliases.h:18
Profiling utilities for the Physics-Based Animation Toolkit (PBAT)