From 627ea86a841a289f84c00fce0e6ebf7747193f4a Mon Sep 17 00:00:00 2001 From: Kevin Reid Date: Mon, 11 Dec 2023 13:36:05 -0800 Subject: [PATCH] port: Fix `export_to_path` producing a `!Send` future. --- all-is-cubes-port/src/gltf.rs | 57 ++++++++++++++++++---------------- all-is-cubes-port/src/tests.rs | 17 ++++++++++ 2 files changed, 47 insertions(+), 27 deletions(-) diff --git a/all-is-cubes-port/src/gltf.rs b/all-is-cubes-port/src/gltf.rs index 15d54e141..eccdd2e5a 100644 --- a/all-is-cubes-port/src/gltf.rs +++ b/all-is-cubes-port/src/gltf.rs @@ -395,37 +395,40 @@ pub(crate) async fn export_gltf( let mesh_options = MeshOptions::new(&GraphicsOptions::default()); for (mut p, block_def_ref) in progress.split_evenly(block_defs.len()).zip(block_defs) { - let block_def = block_def_ref.read()?; let name = block_def_ref.name(); p.set_label(&name); p.progress(0.01).await; - let mesh = SpaceMesh::::from(&BlockMesh::new( - &block_def - .evaluate() - .map_err(|eve| ExportError::NotRepresentable { - name: Some(name.clone()), - reason: format!("block evaluation failed: {eve}"), - })?, - &writer.texture_allocator(), - &mesh_options, - )); - - let mesh_index = writer.add_mesh(&name, &mesh); - // TODO: if the mesh is empty/None, should we include the node anyway or not? - let mesh_node = push_and_return_index( - &mut writer.root.nodes, - gltf_json::Node { - mesh: mesh_index, - ..empty_node(Some(name.to_string())) - }, - ); + { + // constrained scope so we don't hold UBorrow over an await + let block_def = block_def_ref.read()?; + let mesh = SpaceMesh::::from(&BlockMesh::new( + &block_def + .evaluate() + .map_err(|eve| ExportError::NotRepresentable { + name: Some(name.clone()), + reason: format!("block evaluation failed: {eve}"), + })?, + &writer.texture_allocator(), + &mesh_options, + )); + + let mesh_index = writer.add_mesh(&name, &mesh); + // TODO: if the mesh is empty/None, should we include the node anyway or not? + let mesh_node = push_and_return_index( + &mut writer.root.nodes, + gltf_json::Node { + mesh: mesh_index, + ..empty_node(Some(name.to_string())) + }, + ); - writer.root.scenes.push(json::Scene { - name: Some(format!("{name} display scene")), - nodes: vec![mesh_node], - extensions: None, - extras: Default::default(), - }); + writer.root.scenes.push(json::Scene { + name: Some(format!("{name} display scene")), + nodes: vec![mesh_node], + extensions: None, + extras: Default::default(), + }); + } p.finish().await; } diff --git a/all-is-cubes-port/src/tests.rs b/all-is-cubes-port/src/tests.rs index 6f53c4f8f..4415ec56e 100644 --- a/all-is-cubes-port/src/tests.rs +++ b/all-is-cubes-port/src/tests.rs @@ -20,6 +20,12 @@ fn errors_are_send_sync() { assert_send_sync::(); } +/// This function won't compile if `load_universe_from_file`'s future isn't Send +fn _load_universe_from_file_future_is_send() { + #![allow(unreachable_code, clippy::diverging_sub_expression)] + tokio::spawn(load_universe_from_file(unreachable!(), unreachable!())); +} + #[tokio::test] async fn import_unknown_format() { let error = load_universe_from_file( @@ -38,6 +44,17 @@ async fn import_unknown_format() { ); } +/// This function won't compile if `export_to_path`'s future isn't Send +fn _export_to_path_future_is_send() { + #![allow(unreachable_code, clippy::diverging_sub_expression)] + tokio::spawn(export_to_path( + unreachable!(), + unreachable!(), + unreachable!(), + unreachable!(), + )); +} + #[test] fn member_export_path() { let mut universe = Universe::new();