|
32 | 32 | #include <geode/mesh/core/hybrid_solid.h> |
33 | 33 | #include <geode/mesh/core/light_regular_grid.h> |
34 | 34 | #include <geode/mesh/core/regular_grid_solid.h> |
35 | | -#include <geode/mesh/core/solid_facets.h> |
36 | 35 | #include <geode/mesh/core/tetrahedral_solid.h> |
37 | 36 | #include <geode/mesh/helpers/detail/element_identifier.h> |
38 | 37 | #include <geode/mesh/helpers/detail/solid_merger.h> |
@@ -173,152 +172,132 @@ namespace |
173 | 172 | ordered_vertices[1] = first_polyhedron_facet_vertices[3]; |
174 | 173 | ordered_vertices[2] = first_polyhedron_facet_vertices[2]; |
175 | 174 | ordered_vertices[3] = first_polyhedron_facet_vertices[1]; |
176 | | - geode::index_t already_used_facet{ 0 }; |
177 | | - for( const auto f : |
178 | | - geode::Range( 1, solid.nb_polyhedron_facets( hexahedron_id ) ) ) |
| 175 | + for( const auto f : geode::Range( 1, 6 ) ) |
179 | 176 | { |
180 | 177 | const auto polyhedron_facet_vertices = |
181 | 178 | solid.polyhedron_facet_vertices( { hexahedron_id, f } ); |
182 | | - if( absl::c_find( polyhedron_facet_vertices, ordered_vertices[0] ) |
183 | | - != polyhedron_facet_vertices.end() |
| 179 | + const auto v_id_0 = |
| 180 | + absl::c_find( polyhedron_facet_vertices, ordered_vertices[0] ); |
| 181 | + if( v_id_0 != polyhedron_facet_vertices.end() |
184 | 182 | && absl::c_find( |
185 | 183 | polyhedron_facet_vertices, ordered_vertices[1] ) |
186 | 184 | != polyhedron_facet_vertices.end() ) |
187 | 185 | { |
188 | | - for( const auto v_id : |
189 | | - geode::Indices( polyhedron_facet_vertices ) ) |
190 | | - { |
191 | | - if( polyhedron_facet_vertices.at( v_id ) |
192 | | - == ordered_vertices[0] ) |
193 | | - { |
194 | | - ordered_vertices[4] = |
195 | | - polyhedron_facet_vertices[( v_id + 1 ) % 4]; |
196 | | - ordered_vertices[5] = |
197 | | - polyhedron_facet_vertices[( v_id + 2 ) % 4]; |
198 | | - already_used_facet = f; |
199 | | - break; |
200 | | - } |
201 | | - } |
202 | | - break; |
203 | | - } |
204 | | - } |
205 | | - for( const auto f : |
206 | | - geode::Range( 1, solid.nb_polyhedron_facets( hexahedron_id ) ) ) |
207 | | - { |
208 | | - const auto polyhedron_facet_vertices = |
209 | | - solid.polyhedron_facet_vertices( { hexahedron_id, f } ); |
210 | | - if( f == already_used_facet ) |
211 | | - { |
| 186 | + const auto index_v_id_0 = |
| 187 | + std::distance( polyhedron_facet_vertices.begin(), v_id_0 ); |
| 188 | + ordered_vertices[4] = |
| 189 | + polyhedron_facet_vertices[( index_v_id_0 + 1 ) % 4]; |
| 190 | + ordered_vertices[5] = |
| 191 | + polyhedron_facet_vertices[( index_v_id_0 + 2 ) % 4]; |
212 | 192 | continue; |
213 | 193 | } |
214 | | - if( absl::c_find( polyhedron_facet_vertices, ordered_vertices[4] ) |
215 | | - != polyhedron_facet_vertices.end() |
| 194 | + const auto v_id_2 = |
| 195 | + absl::c_find( polyhedron_facet_vertices, ordered_vertices[2] ); |
| 196 | + if( v_id_2 != polyhedron_facet_vertices.end() |
216 | 197 | && absl::c_find( |
217 | | - polyhedron_facet_vertices, ordered_vertices[5] ) |
| 198 | + polyhedron_facet_vertices, ordered_vertices[3] ) |
218 | 199 | != polyhedron_facet_vertices.end() ) |
219 | 200 | { |
220 | | - for( const auto v_id : |
221 | | - geode::Indices( polyhedron_facet_vertices ) ) |
222 | | - { |
223 | | - if( polyhedron_facet_vertices.at( v_id ) |
224 | | - == ordered_vertices[4] ) |
225 | | - { |
226 | | - ordered_vertices[7] = |
227 | | - polyhedron_facet_vertices[( v_id + 1 ) % 4]; |
228 | | - ordered_vertices[6] = |
229 | | - polyhedron_facet_vertices[( v_id + 2 ) % 4]; |
230 | | - break; |
231 | | - } |
232 | | - } |
233 | | - break; |
| 201 | + const auto index_v_id_2 = |
| 202 | + std::distance( polyhedron_facet_vertices.begin(), v_id_2 ); |
| 203 | + ordered_vertices[6] = |
| 204 | + polyhedron_facet_vertices[( index_v_id_2 + 1 ) % 4]; |
| 205 | + ordered_vertices[7] = |
| 206 | + polyhedron_facet_vertices[( index_v_id_2 + 2 ) % 4]; |
| 207 | + continue; |
234 | 208 | } |
235 | 209 | } |
236 | 210 | return ordered_vertices; |
237 | 211 | } |
238 | 212 |
|
239 | 213 | std::array< geode::index_t, 6 > order_prism_vertices( |
240 | | - const geode::index_t p, const geode::SolidMesh3D& solid ) |
| 214 | + const geode::index_t prism_id, const geode::SolidMesh3D& solid ) |
241 | 215 | { |
242 | 216 | std::array< geode::index_t, 6 > ordered_vertices; |
243 | 217 | geode::index_t already_used_facet{ 0 }; |
244 | | - for( const auto f : geode::Range( 0, solid.nb_polyhedron_facets( p ) ) ) |
| 218 | + for( const auto f : geode::Range{ 5 } ) |
245 | 219 | { |
246 | | - if( solid.nb_polyhedron_facet_vertices( { p, f } ) == 3 ) |
| 220 | + if( solid.nb_polyhedron_facet_vertices( { prism_id, f } ) == 3 ) |
247 | 221 | { |
248 | 222 | const auto vertices = |
249 | | - solid.polyhedron_facet_vertices( { p, f } ); |
| 223 | + solid.polyhedron_facet_vertices( { prism_id, f } ); |
250 | 224 | ordered_vertices[0] = vertices[0]; |
251 | 225 | ordered_vertices[1] = vertices[2]; |
252 | 226 | ordered_vertices[2] = vertices[1]; |
253 | 227 | already_used_facet = f; |
254 | 228 | break; |
255 | 229 | } |
256 | 230 | } |
257 | | - for( const auto f : geode::Range( 0, solid.nb_polyhedron_facets( p ) ) ) |
| 231 | + for( const auto f : geode::Range{ 5 } ) |
258 | 232 | { |
259 | 233 | if( f == already_used_facet ) |
260 | 234 | { |
261 | 235 | continue; |
262 | 236 | } |
263 | 237 | const auto facet_vertices = |
264 | | - solid.polyhedron_facet_vertices( { p, f } ); |
265 | | - if( absl::c_find( facet_vertices, ordered_vertices[0] ) |
266 | | - != facet_vertices.end() |
267 | | - && absl::c_find( facet_vertices, ordered_vertices[2] ) |
268 | | - != facet_vertices.end() ) |
| 238 | + solid.polyhedron_facet_vertices( { prism_id, f } ); |
| 239 | + const auto v_id = |
| 240 | + absl::c_find( facet_vertices, ordered_vertices[0] ); |
| 241 | + if( v_id == facet_vertices.end() |
| 242 | + || absl::c_find( facet_vertices, ordered_vertices[2] ) |
| 243 | + == facet_vertices.end() ) |
269 | 244 | { |
270 | | - for( const auto& v_id : geode::Indices( facet_vertices ) ) |
271 | | - { |
272 | | - if( facet_vertices.at( v_id ) == ordered_vertices[0] ) |
273 | | - { |
274 | | - ordered_vertices[3] = facet_vertices[( v_id + 1 ) % 4]; |
275 | | - ordered_vertices[5] = facet_vertices[( v_id + 2 ) % 4]; |
276 | | - break; |
277 | | - } |
278 | | - } |
279 | | - break; |
| 245 | + continue; |
280 | 246 | } |
| 247 | + const auto index_v_id = |
| 248 | + std::distance( facet_vertices.begin(), v_id ); |
| 249 | + ordered_vertices[3] = facet_vertices[( index_v_id + 1 ) % 4]; |
| 250 | + ordered_vertices[5] = facet_vertices[( index_v_id + 2 ) % 4]; |
| 251 | + break; |
281 | 252 | } |
282 | | - for( const auto v : geode::Range( 6 ) ) |
| 253 | + for( const auto v : geode::Range{ 6 } ) |
283 | 254 | { |
284 | | - if( ordered_vertices[1] == v || ordered_vertices[2] == v |
285 | | - || ordered_vertices[3] == v || ordered_vertices[4] == v |
286 | | - || ordered_vertices[5] == v || ordered_vertices[0] == v ) |
| 255 | + const auto solid_vertex = |
| 256 | + solid.polyhedron_vertex( { prism_id, v } ); |
| 257 | + if( ordered_vertices[1] == solid_vertex |
| 258 | + || ordered_vertices[2] == solid_vertex |
| 259 | + || ordered_vertices[3] == solid_vertex |
| 260 | + || ordered_vertices[5] == solid_vertex |
| 261 | + || ordered_vertices[0] == solid_vertex ) |
287 | 262 | { |
288 | 263 | continue; |
289 | 264 | } |
290 | | - ordered_vertices[4] = v; |
| 265 | + ordered_vertices[4] = solid_vertex; |
291 | 266 | break; |
292 | 267 | } |
293 | 268 | return ordered_vertices; |
294 | 269 | } |
295 | 270 | } // namespace |
296 | 271 |
|
297 | 272 | std::array< geode::index_t, 5 > order_pyramid_vertices( |
298 | | - const geode::index_t p, const geode::SolidMesh3D& solid ) |
| 273 | + const geode::index_t pyramid_id, const geode::SolidMesh3D& solid ) |
299 | 274 | { |
300 | 275 | std::array< geode::index_t, 5 > ordered_vertices; |
301 | 276 |
|
302 | | - for( const auto f : geode::Range( 0, solid.nb_polyhedron_facets( p ) ) ) |
| 277 | + for( const auto f : geode::Range{ 5 } ) |
303 | 278 | { |
304 | | - if( solid.nb_polyhedron_facet_vertices( { p, f } ) == 4 ) |
| 279 | + if( solid.nb_polyhedron_facet_vertices( { pyramid_id, f } ) == 4 ) |
305 | 280 | { |
306 | | - const auto vertices = solid.polyhedron_facet_vertices( { p, f } ); |
| 281 | + const auto vertices = |
| 282 | + solid.polyhedron_facet_vertices( { pyramid_id, f } ); |
307 | 283 | ordered_vertices[0] = vertices[0]; |
308 | 284 | ordered_vertices[1] = vertices[3]; |
309 | 285 | ordered_vertices[2] = vertices[2]; |
310 | 286 | ordered_vertices[3] = vertices[1]; |
311 | 287 | break; |
312 | 288 | } |
313 | 289 | } |
314 | | - for( const auto v : geode::Range( 5 ) ) |
| 290 | + for( const auto v : geode::Range{ 5 } ) |
315 | 291 | { |
316 | | - if( ordered_vertices[1] == v || ordered_vertices[2] == v |
317 | | - || ordered_vertices[3] == v || ordered_vertices[0] == v ) |
| 292 | + const auto solid_vertex = solid.polyhedron_vertex( { pyramid_id, v } ); |
| 293 | + if( ordered_vertices[1] == solid_vertex |
| 294 | + || ordered_vertices[2] == solid_vertex |
| 295 | + || ordered_vertices[3] == solid_vertex |
| 296 | + || ordered_vertices[0] == solid_vertex ) |
318 | 297 | { |
319 | 298 | continue; |
320 | 299 | } |
321 | | - ordered_vertices[4] = v; |
| 300 | + ordered_vertices[4] = solid_vertex; |
322 | 301 | break; |
323 | 302 | } |
324 | 303 | return ordered_vertices; |
@@ -416,27 +395,23 @@ namespace geode |
416 | 395 | { |
417 | 396 | const auto ordered_vertices = |
418 | 397 | order_hexahedron_vertices( p, solid ); |
419 | | - builder->create_hexahedron( |
420 | | - { ordered_vertices[0], ordered_vertices[1], |
421 | | - ordered_vertices[2], ordered_vertices[3], |
422 | | - ordered_vertices[4], ordered_vertices[5], |
423 | | - ordered_vertices[6], ordered_vertices[7] } ); |
| 398 | + for( const auto vertex : ordered_vertices ) |
| 399 | + { |
| 400 | + DEBUG( vertex ); |
| 401 | + SDEBUG( solid.point( vertex ) ); |
| 402 | + } |
| 403 | + builder->create_hexahedron( { ordered_vertices } ); |
424 | 404 | } |
425 | 405 | else if( vertices.size() == 5 ) |
426 | 406 | { |
427 | 407 | const auto ordered_vertices = |
428 | 408 | order_pyramid_vertices( p, solid ); |
429 | | - builder->create_pyramid( { ordered_vertices[0], |
430 | | - ordered_vertices[1], ordered_vertices[2], |
431 | | - ordered_vertices[3], ordered_vertices[4] } ); |
| 409 | + builder->create_pyramid( ordered_vertices ); |
432 | 410 | } |
433 | 411 | else if( vertices.size() == 6 ) |
434 | 412 | { |
435 | 413 | const auto ordered_vertices = order_prism_vertices( p, solid ); |
436 | | - builder->create_prism( |
437 | | - { ordered_vertices[0], ordered_vertices[1], |
438 | | - ordered_vertices[2], ordered_vertices[3], |
439 | | - ordered_vertices[4], ordered_vertices[5] } ); |
| 414 | + builder->create_prism( { ordered_vertices } ); |
440 | 415 | } |
441 | 416 | } |
442 | 417 | for( const auto p : Range{ solid.nb_polyhedra() } ) |
|
0 commit comments