11#ifndef PBAT_GEOMETRY_TRIANGLEAABBHIERARCHY_H
12#define PBAT_GEOMETRY_TRIANGLEAABBHIERARCHY_H
18#include "PhysicsBasedAnimationToolkitExport.h"
21#include "pbat/math/linalg/mini/Eigen.h"
25#include <tbb/parallel_for.h>
34 TriangleAabbHierarchy3D,
35 AxisAlignedBoundingBox<3>,
40 static auto constexpr kDims = 3;
56 Eigen::Ref<MatrixX const>
const&
V,
57 Eigen::Ref<IndexMatrixX const>
const&
C,
58 Index maxPointsInLeaf = 10);
77 template <
class RPrimitiveIndices>
98 template <
class TDerivedP>
100 Eigen::MatrixBase<TDerivedP>
const& P,
101 bool bParallelize =
true)
const;
111 template <
class TDerivedP,
class FCull>
113 Eigen::MatrixBase<TDerivedP>
const& P,
123 template <class TDerivedP>
137 template <
class TDerivedP>
138 void SetV(Eigen::MatrixBase<TDerivedP>
const& P)
146 [[maybe_unused]]
auto GetV()
const {
return V; }
148 Eigen::Ref<MatrixX const>
V;
149 Eigen::Ref<IndexMatrixX const>
C;
152template <
class RPrimitiveIndices>
156 auto vertices =
C(Eigen::placeholders::all,
common::Slice(pinds)).reshaped();
160template <
class TDerivedP>
162 Eigen::MatrixBase<TDerivedP>
const& P,
163 bool bParallelize)
const
165 PBAT_PROFILE_NAMED_SCOPE(
"pbat.geometry.TriangleAabbHierarchy3D.PrimitivesContainingPoints");
166 using math::linalg::mini::FromEigen;
169 auto const FindContainingPrimitive = [&](
Index i) {
173 auto const VT =
V(Eigen::placeholders::all, T);
175 FromEigen(P.col(i).template head<kDims>()),
176 FromEigen(VT.col(0).head<
kDims>()),
177 FromEigen(VT.col(1).head<
kDims>()),
178 FromEigen(VT.col(2).head<
kDims>()));
179 auto constexpr eps = 1e-15;
182 if (not intersectingPrimitives.empty())
184 p(i) = intersectingPrimitives.front();
189 tbb::parallel_for(
Index{0},
Index{P.cols()}, FindContainingPrimitive);
193 for (
auto i = 0; i < P.cols(); ++i)
194 FindContainingPrimitive(i);
199template <
class TDerivedP,
class FCull>
201 Eigen::MatrixBase<TDerivedP>
const& P,
203 bool bParallelize)
const -> std::pair<IndexVectorX, VectorX>
205 PBAT_PROFILE_NAMED_SCOPE(
"pbat.geometry.TriangleAabbHierarchy3D.NearestPrimitivesToPoints");
206 using math::linalg::mini::FromEigen;
210 d.setConstant(std::numeric_limits<Scalar>::max());
211 auto const FindNearestPrimitive = [&](
Index i) {
212 std::size_t
constexpr K{1};
215 return bv.squaredExteriorDistance(P.col(i));
220 return std::numeric_limits<Scalar>::max();
222 auto const VT =
V(Eigen::placeholders::all, T);
224 FromEigen(P.col(i).template head<kDims>()),
225 FromEigen(VT.col(0).head<
kDims>()),
226 FromEigen(VT.col(1).head<
kDims>()),
227 FromEigen(VT.col(2).head<
kDims>()));
230 p(i) = nearestPrimitives.front();
231 d(i) = distances.front();
235 tbb::parallel_for(
Index{0},
Index{P.cols()}, FindNearestPrimitive);
239 for (
auto i = 0; i < P.cols(); ++i)
240 FindNearestPrimitive(i);
245template <
class TDerivedP>
247 Eigen::MatrixBase<TDerivedP>
const& P,
248 bool bParallelize)
const -> std::pair<IndexVectorX, VectorX>
257 TriangleAabbHierarchy2D,
258 AxisAlignedBoundingBox<2>,
279 Eigen::Ref<MatrixX const>
const&
V,
280 Eigen::Ref<IndexMatrixX const>
const&
C,
281 Index maxPointsInLeaf = 10);
300 template <
class RPrimitiveIndices>
321 template <
class TDerivedP>
323 Eigen::MatrixBase<TDerivedP>
const& P,
324 bool bParallelize =
true)
const;
333 template <
class TDerivedP>
347 template <
class TDerivedP>
348 void SetV(Eigen::MatrixBase<TDerivedP>
const& P)
356 [[maybe_unused]]
auto GetV()
const {
return V; }
358 Eigen::Ref<MatrixX const>
V;
359 Eigen::Ref<IndexMatrixX const>
C;
362template <
class RPrimitiveIndices>
366 auto vertices =
C(Eigen::placeholders::all,
common::Slice(pinds)).reshaped();
370template <
class TDerivedP>
372 Eigen::MatrixBase<TDerivedP>
const& P,
373 bool bParallelize)
const
375 PBAT_PROFILE_NAMED_SCOPE(
"pbat.geometry.TriangleAabbHierarchy2D.PrimitivesContainingPoints");
376 using math::linalg::mini::FromEigen;
379 auto const FindContainingPrimitive = [&](
Index i) {
383 auto const VT =
V(Eigen::placeholders::all, T);
385 FromEigen(P.col(i).template head<kDims>()),
386 FromEigen(VT.col(0).head<
kDims>()),
387 FromEigen(VT.col(1).head<
kDims>()),
388 FromEigen(VT.col(2).head<
kDims>()));
390 if (not intersectingPrimitives.empty())
392 p(i) = intersectingPrimitives.front();
397 tbb::parallel_for(
Index{0},
Index{P.cols()}, FindContainingPrimitive);
401 for (
auto i = 0; i < P.cols(); ++i)
402 FindContainingPrimitive(i);
407template <
class TDerivedP>
409 Eigen::MatrixBase<TDerivedP>
const& P,
410 bool bParallelize)
const -> std::pair<IndexVectorX, VectorX>
412 PBAT_PROFILE_NAMED_SCOPE(
"pbat.geometry.TriangleAabbHierarchy2D.NearestPrimitivesToPoints");
413 using math::linalg::mini::FromEigen;
417 d.setConstant(std::numeric_limits<Scalar>::max());
418 auto const FindNearestPrimitive = [&](
Index i) {
419 std::size_t
constexpr K{1};
422 return bv.squaredExteriorDistance(P.col(i));
425 auto const VT =
V(Eigen::placeholders::all, T);
427 FromEigen(P.col(i).template head<kDims>()),
428 FromEigen(VT.col(0).head<
kDims>()),
429 FromEigen(VT.col(1).head<
kDims>()),
430 FromEigen(VT.col(2).head<
kDims>()));
433 p(i) = nearestPrimitives.front();
434 d(i) = distances.front();
438 tbb::parallel_for(
Index{0},
Index{P.cols()}, FindNearestPrimitive);
442 for (
auto i = 0; i < P.cols(); ++i)
443 FindNearestPrimitive(i);
445 return std::make_pair(p, d);
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< 3 > 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
Eigen::Ref< MatrixX const > V
|kDims|x|# verts| vertex positions
Definition TriangleAabbHierarchy.h:358
auto GetV() const
Returns this BVH's mesh's vertex positions.
Definition TriangleAabbHierarchy.h:356
BoundingVolumeHierarchy< SelfType, AxisAlignedBoundingBox< kDims >, IndexVector< 3 >, kDims > BaseType
Base type.
Definition TriangleAabbHierarchy.h:265
static auto constexpr kDims
Number of dimensions.
Definition TriangleAabbHierarchy.h:263
PBAT_API PrimitiveType Primitive(Index p) const
Returns the primitive at index p.
Definition TriangleAabbHierarchy.cpp:111
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 TriangleAabbHierarchy.h:408
TriangleAabbHierarchy2D SelfType
Self type.
Definition TriangleAabbHierarchy.h:264
BoundingVolumeType BoundingVolumeOf(RPrimitiveIndices &&pinds) const
Returns the bounding volume of the primitive.
Definition TriangleAabbHierarchy.h:364
PBAT_API TriangleAabbHierarchy2D(Eigen::Ref< MatrixX const > const &V, Eigen::Ref< IndexMatrixX const > const &C, Index maxPointsInLeaf=10)
Construct a triangle Aabb BVH from an input mesh (V,C)
Definition TriangleAabbHierarchy.cpp:87
IndexVectorX PrimitivesContainingPoints(Eigen::MatrixBase< TDerivedP > const &P, bool bParallelize=true) const
For each point in P, returns the index of the primitive containing it.
Definition TriangleAabbHierarchy.h:371
auto const & GetBoundingVolumes() const
Returns this BVH's bounding volumes.
Definition TriangleAabbHierarchy.h:341
Eigen::Ref< IndexMatrixX const > C
3x|# triangles| triangle vertex indices into V
Definition TriangleAabbHierarchy.h:359
void SetV(Eigen::MatrixBase< TDerivedP > const &P)
Updates this BVH's mesh's vertex positions.
Definition TriangleAabbHierarchy.h:348
PBAT_API IndexMatrixX OverlappingPrimitives(SelfType const &bvh, std::size_t reserve=1000ULL) const
Returns the overlapping primitives of this BVH and another BVH.
Definition TriangleAabbHierarchy.cpp:130
PBAT_API Vector< kDims > PrimitiveLocation(PrimitiveType const &primitive) const
Returns the location of the primitive.
Definition TriangleAabbHierarchy.cpp:118
PBAT_API void Update()
Updates the AABBs.
Definition TriangleAabbHierarchy.cpp:123
IndexVectorX PrimitivesContainingPoints(Eigen::MatrixBase< TDerivedP > const &P, bool bParallelize=true) const
For each point in P, returns the index of the primitive containing it.
Definition TriangleAabbHierarchy.h:161
Eigen::Ref< IndexMatrixX const > C
3x|# triangles| triangle vertex indices into V
Definition TriangleAabbHierarchy.h:149
PBAT_API TriangleAabbHierarchy3D(Eigen::Ref< MatrixX const > const &V, Eigen::Ref< IndexMatrixX const > const &C, Index maxPointsInLeaf=10)
Construct a triangle Aabb BVH from an input mesh (V,C)
Definition TriangleAabbHierarchy.cpp:7
void SetV(Eigen::MatrixBase< TDerivedP > const &P)
Updates this BVH's mesh's vertex positions.
Definition TriangleAabbHierarchy.h:138
BoundingVolumeType BoundingVolumeOf(RPrimitiveIndices &&pinds) const
Returns the bounding volume of the primitive.
Definition TriangleAabbHierarchy.h:154
TriangleAabbHierarchy3D SelfType
Self type.
Definition TriangleAabbHierarchy.h:41
PBAT_API PrimitiveType Primitive(Index p) const
Returns the primitive at index p.
Definition TriangleAabbHierarchy.cpp:31
PBAT_API IndexMatrixX OverlappingPrimitives(SelfType const &bvh, std::size_t reserve=1000ULL) const
Returns the overlapping primitives of this BVH and another BVH.
Definition TriangleAabbHierarchy.cpp:50
auto const & GetBoundingVolumes() const
Returns this BVH's bounding volumes.
Definition TriangleAabbHierarchy.h:131
BoundingVolumeHierarchy< SelfType, AxisAlignedBoundingBox< kDims >, IndexVector< 3 >, kDims > BaseType
Base type.
Definition TriangleAabbHierarchy.h:42
auto GetV() const
Returns this BVH's mesh's vertex positions.
Definition TriangleAabbHierarchy.h:146
Eigen::Ref< MatrixX const > V
|kDims|x|# verts| vertex positions
Definition TriangleAabbHierarchy.h:148
PBAT_API Vector< kDims > PrimitiveLocation(PrimitiveType const &primitive) const
Returns the location of the primitive.
Definition TriangleAabbHierarchy.cpp:38
PBAT_API void Update()
Updates the AABBs.
Definition TriangleAabbHierarchy.cpp:43
auto NearestPrimitivesToPoints(Eigen::MatrixBase< TDerivedP > const &P, FCull fCull, bool bParallelize=true) const -> std::pair< IndexVectorX, VectorX >
For each point in P, returns the index of the nearest primitive to it.
Definition TriangleAabbHierarchy.h:200
static auto constexpr kDims
Number of dimensions.
Definition TriangleAabbHierarchy.h:40
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 PointTriangle(TMatrixP const &P, TMatrixA const &A, TMatrixB const &B, TMatrixC const &C) -> typename TMatrixP::ScalarType
Obtain squared distance between point P and triangle ABC.
Definition DistanceQueries.h:217
PBAT_HOST_DEVICE bool PointTriangle(TMatrixP const &P, TMatrixA const &A, TMatrixB const &B, TMatrixC const &C)
Tests for overlap between point P and triangle ABC.
Definition OverlapQueries.h:548
Geometric queries, quantities and data structures.
Definition AabbKdTreeHierarchy.h:23
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)