Skip to content

Commit edd9f11

Browse files
committed
fix(Model): manage empty component meshes in creation of model aabbs
1 parent c44769b commit edd9f11

File tree

1 file changed

+40
-10
lines changed

1 file changed

+40
-10
lines changed

src/geode/model/helpers/aabb_model_helpers.cpp

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,45 @@
4343

4444
namespace
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

Comments
 (0)