From 35adad655690e5bcef417ccba68c925df9415a63 Mon Sep 17 00:00:00 2001 From: Carter Anderson Date: Fri, 15 May 2020 17:22:45 -0700 Subject: [PATCH] Async mesh loading works --- crates/bevy_render/src/mesh.rs | 50 ++++++++++++++++++---------------- examples/3d/load_model.rs | 3 +- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/crates/bevy_render/src/mesh.rs b/crates/bevy_render/src/mesh.rs index 152a517056..6bb3ed422c 100644 --- a/crates/bevy_render/src/mesh.rs +++ b/crates/bevy_render/src/mesh.rs @@ -346,30 +346,34 @@ fn setup_mesh_resource( render_resources.get_asset_resource(handle, INDEX_BUFFER_ASSET_INDEX), ) } else { - let mesh_asset = meshes.get(&handle).unwrap(); - let vertex_bytes = mesh_asset - .get_vertex_buffer_bytes(&vertex_buffer_descriptor) - .unwrap(); - // TODO: use a staging buffer here - let vertex_buffer = render_resources.create_buffer_with_data( - BufferInfo { - buffer_usage: BufferUsage::VERTEX, - ..Default::default() - }, - &vertex_bytes, - ); - let index_bytes = mesh_asset.get_index_buffer_bytes(index_format).unwrap(); - let index_buffer = render_resources.create_buffer_with_data( - BufferInfo { - buffer_usage: BufferUsage::INDEX, - ..Default::default() - }, - &index_bytes, - ); + if let Some(mesh_asset) = meshes.get(&handle) { + let vertex_bytes = mesh_asset + .get_vertex_buffer_bytes(&vertex_buffer_descriptor) + .unwrap(); + // TODO: use a staging buffer here + let vertex_buffer = render_resources.create_buffer_with_data( + BufferInfo { + buffer_usage: BufferUsage::VERTEX, + ..Default::default() + }, + &vertex_bytes, + ); + let index_bytes = mesh_asset.get_index_buffer_bytes(index_format).unwrap(); + let index_buffer = render_resources.create_buffer_with_data( + BufferInfo { + buffer_usage: BufferUsage::INDEX, + ..Default::default() + }, + &index_bytes, + ); - render_resources.set_asset_resource(handle, vertex_buffer, VERTEX_BUFFER_ASSET_INDEX); - render_resources.set_asset_resource(handle, index_buffer, INDEX_BUFFER_ASSET_INDEX); - (vertex_buffer, Some(index_buffer)) + render_resources.set_asset_resource(handle, vertex_buffer, VERTEX_BUFFER_ASSET_INDEX); + render_resources.set_asset_resource(handle, index_buffer, INDEX_BUFFER_ASSET_INDEX); + (vertex_buffer, Some(index_buffer)) + } else { + // mesh doesn't exist. it probably hasn't loaded yet + return; + } }; render_resource_assignments.set_vertex_buffer("Vertex", vertex_buffer, index_buffer); diff --git a/examples/3d/load_model.rs b/examples/3d/load_model.rs index 8e4f6f60b9..47a05c96d9 100644 --- a/examples/3d/load_model.rs +++ b/examples/3d/load_model.rs @@ -11,12 +11,11 @@ fn main() { fn setup( command_buffer: &mut CommandBuffer, asset_server: ResMut, - mut meshes: ResMut>, mut materials: ResMut>, ) { // load the mesh let mesh_handle = asset_server - .load_sync(&mut meshes, "assets/models/monkey/Monkey.gltf") + .load("assets/models/monkey/Monkey.gltf") .unwrap(); // create a material for the mesh