From 89487e58893a991e27fac9a8c955b3c2c2713f74 Mon Sep 17 00:00:00 2001 From: Lee-Orr Date: Wed, 20 Mar 2024 21:45:09 -0400 Subject: [PATCH] Headless remote assets issues (#94) Co-authored-by: Danny McGee --- Cargo.lock | 14 ++++++++++++++ image-generator-demo/src/app/app.element.scss | 4 ++++ image-generator-demo/src/app/app.element.ts | 3 +++ studio/Cargo.toml | 1 + studio/project.json | 2 +- studio/src/headless.rs | 5 ++++- studio/src/remote/reader.rs | 5 +++-- studio/src/scene.rs | 13 +++++++++++-- vite-multiple-assets/src/lib/server.ts | 1 + 9 files changed, 42 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6959403..8c525ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -305,6 +305,19 @@ dependencies = [ "futures-core", ] +[[package]] +name = "async-compat" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f68a707c1feb095d8c07f8a65b9f506b117d30af431cab89374357de7c11461b" +dependencies = [ + "futures-core", + "futures-io", + "once_cell", + "pin-project-lite", + "tokio", +] + [[package]] name = "async-executor" version = "1.8.0" @@ -4851,6 +4864,7 @@ name = "studio" version = "0.1.0" dependencies = [ "anyhow", + "async-compat", "bevy", "bevy-inspector-egui", "bevy_mod_outline", diff --git a/image-generator-demo/src/app/app.element.scss b/image-generator-demo/src/app/app.element.scss index 4473358..b056665 100644 --- a/image-generator-demo/src/app/app.element.scss +++ b/image-generator-demo/src/app/app.element.scss @@ -5,6 +5,10 @@ background: #242433; } +sts-scene-data-provider { + display: contents; +} + // Layout utilities .v-start, .v-end, .h-start, .h-end, .h-center { position: absolute; diff --git a/image-generator-demo/src/app/app.element.ts b/image-generator-demo/src/app/app.element.ts index 3ea93a9..0283a7d 100644 --- a/image-generator-demo/src/app/app.element.ts +++ b/image-generator-demo/src/app/app.element.ts @@ -18,6 +18,7 @@ import { ImageInfo, LcmClient } from "./lcm-client"; import "@storyteller/studio-web/canvas-provider"; import "@storyteller/studio-web/loading"; +import "@storyteller/studio-web/scene-data-provider"; import "@storyteller/studio-web/scene-hierarchy"; import "@storyteller/studio-web/studio"; import "@storyteller/studio-web/transform-toolbar"; @@ -173,6 +174,7 @@ export class AppElement extends LitElement { protected override render = () => html` +
` : nothing} + ` } diff --git a/studio/Cargo.toml b/studio/Cargo.toml index 2a958e0..6ee14ad 100644 --- a/studio/Cargo.toml +++ b/studio/Cargo.toml @@ -50,6 +50,7 @@ space_editor = {git = "https://github.com/rewin123/space_editor", rev = "ce83f86 anyhow.workspace = true serde_repr = "0.1.18" bevy_tweening = "0.9" +async-compat = "0.2" [dependencies.reqwest] version = "0.11.24" diff --git a/studio/project.json b/studio/project.json index b3b28be..e72cbaf 100644 --- a/studio/project.json +++ b/studio/project.json @@ -41,7 +41,7 @@ "headless": { "executor": "nx:run-commands", "options": { - "command": "cargo run -p studio --bin studio-headless -- {args}" + "command": "cargo run -p studio --bin studio-headless --" } }, "test": { diff --git a/studio/src/headless.rs b/studio/src/headless.rs index 0130553..061ccbf 100644 --- a/studio/src/headless.rs +++ b/studio/src/headless.rs @@ -4,6 +4,7 @@ use bevy::{ app::{AppExit, ScheduleRunnerPlugin}, prelude::*, }; +use bevy_web_asset::WebAssetPlugin; use space_editor::prelude::{EditorEvent, EditorPrefabPath}; use wgpu::Extent3d; @@ -12,7 +13,7 @@ use crate::{ scene::SceneState, screenshot::{ScreenCapture, ScreenShotPlugin}, BvhPlugin, CommonPlugins, LoadLibraryObjectEvent, LoadSceneEvent, MainCamera, - MixamoImportEvent, MixamoPlugin, SkyboxId, StudioMode, WorldGridPlugin, + MixamoImportEvent, MixamoPlugin, RemoteAssetPlugin, SkyboxId, StudioMode, WorldGridPlugin, }; #[derive(Debug, Resource, Clone)] @@ -42,6 +43,8 @@ pub fn start_headless( app.add_plugins(( ScheduleRunnerPlugin::run_loop(Duration::from_secs_f64(1.0 / fps as f64)), + WebAssetPlugin, + RemoteAssetPlugin, DefaultPlugins.set(WindowPlugin { primary_window: None, exit_condition: bevy::window::ExitCondition::DontExit, diff --git a/studio/src/remote/reader.rs b/studio/src/remote/reader.rs index f45d933..812516c 100644 --- a/studio/src/remote/reader.rs +++ b/studio/src/remote/reader.rs @@ -1,5 +1,6 @@ use std::{io::ErrorKind, path::Path}; +use async_compat::Compat; use bevy::{ asset::io::{AssetReader, AssetReaderError, PathStream, Reader, VecReader}, prelude::*, @@ -22,7 +23,7 @@ impl AssetReader for RemoteAssetReader { &'a self, path: &'a Path, ) -> BoxedFuture<'a, Result>, AssetReaderError>> { - Box::pin(async move { + Box::pin(Compat::new(async move { let token = path .ext_file_prefix() .ok_or_else(|| { @@ -82,7 +83,7 @@ impl AssetReader for RemoteAssetReader { let reader: Box = Box::new(VecReader::new(bytes)); Ok(reader) - }) + })) } fn read_meta<'a>( diff --git a/studio/src/scene.rs b/studio/src/scene.rs index 8c73208..4302613 100644 --- a/studio/src/scene.rs +++ b/studio/src/scene.rs @@ -145,8 +145,19 @@ pub struct LoadingQueue { fn check_loading( mut loading_queue: ResMut, mut st_next: ResMut>, + r_scene_state: Res>, asset_server: Res, ) { + // Avoid transitioning from `SceneState::None` directly to `SceneState::Active`. + // We will always be initializing the scene with _something_, so if the + // `LoadingQueue` is empty when we're in `SceneState::None`, it just means + // our startup routine hasn't yet gotten to the point of processing any + // `Handle`s. + if loading_queue.queue.is_empty() && **r_scene_state == SceneState::Loading { + st_next.set(SceneState::Active); + return; + } + if !loading_queue.queue.is_empty() { //filter queue to only include notloaded assets @@ -179,8 +190,6 @@ fn check_loading( } else { st_next.set(SceneState::Loading); } - } else { - st_next.set(SceneState::Active); } } diff --git a/vite-multiple-assets/src/lib/server.ts b/vite-multiple-assets/src/lib/server.ts index 996bd5e..7e1c429 100644 --- a/vite-multiple-assets/src/lib/server.ts +++ b/vite-multiple-assets/src/lib/server.ts @@ -46,6 +46,7 @@ const mimeTypes = { ".otf": "font/otf", ".png": "image/png", ".rar": "application/x-rar-compressed", + ".ron": "text/ron", ".svg": "image/svg+xml", ".tiff": "image/tiff", ".ttf": "font/ttf",