4343
4444namespace
4545{
46+ template < typename Range >
47+ geode::index_t count_non_empty_elements (
48+ const Range& range, geode::index_t nb_elements )
49+ {
50+ geode::index_t nb_non_empty_elements{ 0 };
51+ for ( const auto & element : range )
52+ {
53+ if ( element.mesh ().nb_vertices () > 0 )
54+ {
55+ nb_non_empty_elements++;
56+ }
57+ }
58+ if ( nb_non_empty_elements < nb_elements )
59+ {
60+ geode::Logger::warn ( absl::StrCat ( " [create_model_aabb] " ,
61+ nb_elements - nb_non_empty_elements, " out of " , nb_elements,
62+ " components have empty meshes, not included in the "
63+ " AABBTree." ) );
64+ }
65+ return nb_non_empty_elements;
66+ }
67+
4668 template < geode::index_t dimension, typename Range >
4769 std::tuple< geode::AABBTree< dimension >, absl::FixedArray< geode::uuid > >
4870 create_aabb ( const Range& range, geode::index_t nb_elements )
4971 {
72+ const auto nb_non_empty_elements =
73+ count_non_empty_elements ( range, nb_elements );
5074 absl::FixedArray< geode::BoundingBox< dimension > > boxes (
51- nb_elements );
52- absl::FixedArray< geode::uuid > mapping ( nb_elements );
53- absl::FixedArray< async::task< void > > tasks ( nb_elements );
75+ nb_non_empty_elements );
76+ absl::FixedArray< geode::uuid > mapping ( nb_non_empty_elements );
77+ absl::FixedArray< async::task< void > > tasks ( nb_non_empty_elements );
5478 geode::index_t id{ 0 };
5579 for ( const auto & element : range )
5680 {
81+ if ( element.mesh ().nb_vertices () == 0 )
82+ {
83+ continue ;
84+ }
5785 tasks[id] = async::spawn ( [id, &mapping, &boxes, &element] {
5886 mapping[id] = element.id ();
5987 boxes[id] = element.mesh ().bounding_box ();
@@ -72,21 +100,23 @@ namespace
72100 geode::ModelMeshesAABBTree< dimension > create_aabbs (
73101 const Range& range, geode::index_t nb_elements )
74102 {
75- geode::ModelMeshesAABBTree< dimension > result{ nb_elements };
103+ const auto nb_non_empty_elements =
104+ count_non_empty_elements ( range, nb_elements );
105+ geode::ModelMeshesAABBTree< dimension > result{ nb_non_empty_elements };
76106 absl::FixedArray< geode::BoundingBox< dimension > > boxes (
77- nb_elements );
78- absl::FixedArray< async::task< void > > tasks ( nb_elements );
107+ nb_non_empty_elements );
108+ absl::FixedArray< async::task< void > > tasks ( nb_non_empty_elements );
79109 geode::index_t id{ 0 };
80110 for ( const auto & element : range )
81111 {
112+ if ( element.mesh ().nb_vertices () == 0 )
113+ {
114+ continue ;
115+ }
82116 tasks[id] = async::spawn ( [id, &result, &boxes, &element] {
83117 result.mesh_trees_ [id] =
84118 geode::create_aabb_tree ( element.mesh () );
85119 result.uuids_ [id] = element.id ();
86- OPENGEODE_EXCEPTION ( result.mesh_trees_ [id].nb_bboxes () != 0 ,
87- " [create_model_meshes_aabbs] Cannot compute the AABBTree "
88- " for this model: " ,
89- element.component_id ().string (), " has an empty mesh." );
90120 boxes[id] = result.mesh_trees_ [id].bounding_box ();
91121 } );
92122 result.mesh_tree_ids_ .emplace ( element.id (), id );
0 commit comments