Skip to content

Commit e08ed84

Browse files
committed
feat(GenericMeshAABB): Created a class to access a mesh AABB generically.
1 parent 0abf6e9 commit e08ed84

File tree

3 files changed

+116
-0
lines changed

3 files changed

+116
-0
lines changed

include/geode/mesh/helpers/aabb_edged_curve_helpers.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ namespace geode
3636
FORWARD_DECLARATION_DIMENSION_CLASS( Point );
3737
FORWARD_DECLARATION_DIMENSION_CLASS( AABBTree );
3838
FORWARD_DECLARATION_DIMENSION_CLASS( EdgedCurve );
39+
template < typename T >
40+
class GenericMeshAABB;
3941
} // namespace geode
4042

4143
namespace geode
@@ -60,4 +62,28 @@ namespace geode
6062
const EdgedCurve< dimension >& mesh_;
6163
};
6264
ALIAS_2D_AND_3D( DistanceToEdge );
65+
66+
template < index_t dimension >
67+
class GenericMeshAABB< EdgedCurve< dimension > >
68+
{
69+
public:
70+
GenericMeshAABB( const EdgedCurve< dimension >& mesh )
71+
: mesh_( mesh ),
72+
elements_tree_{ create_aabb_tree( mesh ) },
73+
distance_action_{ mesh }
74+
{
75+
}
76+
77+
std::tuple< index_t, Point< dimension >, double > closest_element(
78+
const Point< dimension >& query ) const
79+
{
80+
return this->elements_aabb().closest_element_box(
81+
query, distance_action_ );
82+
}
83+
84+
private:
85+
const EdgedCurve< dimension >& mesh_;
86+
AABBTree< dimension > elements_tree_;
87+
const DistanceToEdge< dimension > distance_action_;
88+
};
6389
} // namespace geode

include/geode/mesh/helpers/aabb_solid_helpers.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ namespace geode
3131
FORWARD_DECLARATION_DIMENSION_CLASS( AABBTree );
3232
FORWARD_DECLARATION_DIMENSION_CLASS( SolidMesh );
3333
FORWARD_DECLARATION_DIMENSION_CLASS( TetrahedralSolid );
34+
template < typename T >
35+
class GenericMeshAABB;
3436
} // namespace geode
3537

3638
namespace geode
@@ -55,4 +57,47 @@ namespace geode
5557
const TetrahedralSolid< dimension >& mesh_;
5658
};
5759
ALIAS_3D( DistanceToTetrahedron );
60+
61+
template < index_t dimension >
62+
class GenericMeshAABB< SolidMesh< dimension > >
63+
{
64+
public:
65+
GenericMeshAABB( const SolidMesh< dimension >& mesh )
66+
: mesh_( mesh ), elements_tree_{ create_aabb_tree( mesh ) }
67+
{
68+
}
69+
70+
protected:
71+
const AABBTree< dimension >& elements_aabb() const
72+
{
73+
return elements_tree_;
74+
}
75+
76+
private:
77+
const SolidMesh< dimension >& mesh_;
78+
AABBTree< dimension > elements_tree_;
79+
};
80+
81+
template < index_t dimension >
82+
class GenericMeshAABB< TetrahedralSolid< dimension > >
83+
: public GenericMeshAABB< SolidMesh< dimension > >
84+
{
85+
public:
86+
using Base = GenericMeshAABB< SolidMesh< dimension > >;
87+
88+
GenericMeshAABB( const TetrahedralSolid< dimension >& mesh )
89+
: Base{ mesh }, distance_action_{ mesh }
90+
{
91+
}
92+
93+
std::tuple< index_t, Point< dimension >, double > closest_element(
94+
const Point< dimension >& query ) const
95+
{
96+
return this->elements_aabb().closest_element_box(
97+
query, distance_action_ );
98+
}
99+
100+
private:
101+
const DistanceToTetrahedron< dimension > distance_action_;
102+
};
58103
} // namespace geode

include/geode/mesh/helpers/aabb_surface_helpers.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ namespace geode
3737
FORWARD_DECLARATION_DIMENSION_CLASS( AABBTree );
3838
FORWARD_DECLARATION_DIMENSION_CLASS( SurfaceMesh );
3939
FORWARD_DECLARATION_DIMENSION_CLASS( TriangulatedSurface );
40+
template < typename T >
41+
class GenericMeshAABB;
4042
} // namespace geode
4143

4244
namespace geode
@@ -61,4 +63,47 @@ namespace geode
6163
const TriangulatedSurface< dimension >& mesh_;
6264
};
6365
ALIAS_2D_AND_3D( DistanceToTriangle );
66+
67+
template < index_t dimension >
68+
class GenericMeshAABB< SurfaceMesh< dimension > >
69+
{
70+
public:
71+
GenericMeshAABB( const SurfaceMesh< dimension >& mesh )
72+
: mesh_( mesh ), elements_tree_{ create_aabb_tree( mesh ) }
73+
{
74+
}
75+
76+
protected:
77+
const AABBTree< dimension >& elements_aabb() const
78+
{
79+
return elements_tree_;
80+
}
81+
82+
private:
83+
const SurfaceMesh< dimension >& mesh_;
84+
AABBTree< dimension > elements_tree_;
85+
};
86+
87+
template < index_t dimension >
88+
class GenericMeshAABB< TriangulatedSurface< dimension > >
89+
: public GenericMeshAABB< SurfaceMesh< dimension > >
90+
{
91+
public:
92+
using Base = GenericMeshAABB< SurfaceMesh< dimension > >;
93+
94+
GenericMeshAABB( const TriangulatedSurface< dimension >& mesh )
95+
: Base{ mesh }, distance_action_{ mesh }
96+
{
97+
}
98+
99+
std::tuple< index_t, Point< dimension >, double > closest_element(
100+
const Point< dimension >& query ) const
101+
{
102+
return this->elements_aabb().closest_element_box(
103+
query, distance_action_ );
104+
}
105+
106+
private:
107+
const DistanceToTriangle< dimension > distance_action_;
108+
};
64109
} // namespace geode

0 commit comments

Comments
 (0)