Skip to content

Commit b675c54

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

File tree

3 files changed

+112
-0
lines changed

3 files changed

+112
-0
lines changed

include/geode/mesh/helpers/aabb_edged_curve_helpers.h

Lines changed: 24 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,26 @@ 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+
: elements_tree_{ create_aabb_tree( mesh ) },
72+
distance_action_{ mesh }
73+
{
74+
}
75+
76+
std::tuple< index_t, Point< dimension >, double > closest_element(
77+
const Point< dimension >& query ) const
78+
{
79+
return this->elements_aabb().closest_element_box(
80+
query, distance_action_ );
81+
}
82+
83+
private:
84+
AABBTree< dimension > elements_tree_;
85+
const DistanceToEdge< dimension > distance_action_;
86+
};
6387
} // namespace geode

include/geode/mesh/helpers/aabb_solid_helpers.h

Lines changed: 44 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,46 @@ 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+
: 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+
AABBTree< dimension > elements_tree_;
78+
};
79+
80+
template < index_t dimension >
81+
class GenericMeshAABB< TetrahedralSolid< dimension > >
82+
: public GenericMeshAABB< SolidMesh< dimension > >
83+
{
84+
public:
85+
using Base = GenericMeshAABB< SolidMesh< dimension > >;
86+
87+
GenericMeshAABB( const TetrahedralSolid< dimension >& mesh )
88+
: Base{ mesh }, distance_action_{ mesh }
89+
{
90+
}
91+
92+
std::tuple< index_t, Point< dimension >, double > closest_element(
93+
const Point< dimension >& query ) const
94+
{
95+
return this->elements_aabb().closest_element_box(
96+
query, distance_action_ );
97+
}
98+
99+
private:
100+
const DistanceToTetrahedron< dimension > distance_action_;
101+
};
58102
} // namespace geode

include/geode/mesh/helpers/aabb_surface_helpers.h

Lines changed: 44 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,46 @@ 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+
: 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+
AABBTree< dimension > elements_tree_;
84+
};
85+
86+
template < index_t dimension >
87+
class GenericMeshAABB< TriangulatedSurface< dimension > >
88+
: public GenericMeshAABB< SurfaceMesh< dimension > >
89+
{
90+
public:
91+
using Base = GenericMeshAABB< SurfaceMesh< dimension > >;
92+
93+
GenericMeshAABB( const TriangulatedSurface< dimension >& mesh )
94+
: Base{ mesh }, distance_action_{ mesh }
95+
{
96+
}
97+
98+
std::tuple< index_t, Point< dimension >, double > closest_element(
99+
const Point< dimension >& query ) const
100+
{
101+
return this->elements_aabb().closest_element_box(
102+
query, distance_action_ );
103+
}
104+
105+
private:
106+
const DistanceToTriangle< dimension > distance_action_;
107+
};
64108
} // namespace geode

0 commit comments

Comments
 (0)