mirror of
https://github.com/storytold/storyteller-bevy.git
synced 2026-10-21 07:55:55 +00:00
Scene storage backend integration (#51)
This PR adds Storyteller.ai API integration for saving and loading Storyteller Studio scenes to/from the backend. ### Known issues * The skybox is not currently stored in the serialized scene format
This commit is contained in:
+57
-30
@@ -27,6 +27,7 @@ mod inspector;
|
||||
mod interaction;
|
||||
pub mod math;
|
||||
mod mixamo;
|
||||
mod path;
|
||||
mod persistance;
|
||||
mod remote;
|
||||
mod scene;
|
||||
@@ -48,7 +49,7 @@ pub use crate::{
|
||||
mixamo::{MixamoImportEvent, MixamoPlugin},
|
||||
persistance::PersistancePlugin,
|
||||
remote::RemoteAssetPlugin,
|
||||
scene::{LoadSceneEvent, ScenePlugin},
|
||||
scene::{LoadLibraryObjectEvent, LoadSceneEvent, ScenePlugin},
|
||||
skybox::{SkyboxId, SkyboxPlugin},
|
||||
ui::UiLayerPlugin,
|
||||
viewport::ViewportSize,
|
||||
@@ -120,8 +121,10 @@ pub fn start_viewer(
|
||||
viewport_size: ViewportSize,
|
||||
) {
|
||||
start_internal(
|
||||
object_id,
|
||||
skybox_id,
|
||||
InitSeed::FromLibrary {
|
||||
object_id: object_id.into(),
|
||||
skybox_id: skybox_id.into(),
|
||||
},
|
||||
canvas_selector,
|
||||
canvas_alt,
|
||||
viewport_size,
|
||||
@@ -132,15 +135,13 @@ pub fn start_viewer(
|
||||
|
||||
#[cfg_attr(feature = "wasm", wasm_bindgen(js_name = startEditor))]
|
||||
pub fn start_editor(
|
||||
object_id: &str,
|
||||
skybox_id: &str,
|
||||
scene_id: &str,
|
||||
canvas_selector: &str,
|
||||
canvas_alt: &str,
|
||||
viewport_size: ViewportSize,
|
||||
) {
|
||||
start_internal(
|
||||
object_id,
|
||||
skybox_id,
|
||||
InitSeed::FromScene(scene_id.into()),
|
||||
canvas_selector,
|
||||
canvas_alt,
|
||||
viewport_size,
|
||||
@@ -158,8 +159,10 @@ pub fn start_bvh_viewer(
|
||||
viewport_size: ViewportSize,
|
||||
) {
|
||||
let mut app = start_internal(
|
||||
"Mannequin.gltf",
|
||||
skybox_id,
|
||||
InitSeed::FromLibrary {
|
||||
object_id: "Mannequin.gltf".into(),
|
||||
skybox_id: skybox_id.into(),
|
||||
},
|
||||
canvas_selector,
|
||||
canvas_alt,
|
||||
viewport_size,
|
||||
@@ -188,8 +191,10 @@ pub fn start_mixamo_viewer(
|
||||
viewport_size: ViewportSize,
|
||||
) {
|
||||
let mut app = start_internal(
|
||||
"Mannequin.gltf",
|
||||
skybox_id,
|
||||
InitSeed::FromLibrary {
|
||||
object_id: "Mannequin.gltf".into(),
|
||||
skybox_id: skybox_id.into(),
|
||||
},
|
||||
canvas_selector,
|
||||
canvas_alt,
|
||||
viewport_size,
|
||||
@@ -216,8 +221,10 @@ pub fn start(
|
||||
studio_mode: StudioMode,
|
||||
) {
|
||||
start_internal(
|
||||
object_id,
|
||||
skybox_id,
|
||||
InitSeed::FromLibrary {
|
||||
object_id: object_id.into(),
|
||||
skybox_id: skybox_id.into(),
|
||||
},
|
||||
canvas_selector,
|
||||
canvas_alt,
|
||||
viewport_size,
|
||||
@@ -226,13 +233,24 @@ pub fn start(
|
||||
.run();
|
||||
}
|
||||
|
||||
// TODO: These `start_` functiions should be refactored to better support the
|
||||
// needs of the "reaodnly viewer" vs "full studio editor" use cases. See
|
||||
// notes in `studio-web/src/lib/viewer.element.ts` for more info.
|
||||
pub enum InitSeed {
|
||||
/// Initialize the application from assets in the "bundled" asset library.
|
||||
FromLibrary {
|
||||
/// A filename, including the extension, that can be found under
|
||||
/// `studio/assets/gltf` (e.g., "Mannequin.gltf")
|
||||
object_id: String,
|
||||
/// A skybox name that corresponds to a matching set of assets under
|
||||
/// `studio/assets/skyboxes`, _not_ including file extensions or
|
||||
/// "diffuse"/"specular" qualifiers (e.g., "gum_trees_4k")
|
||||
skybox_id: String,
|
||||
},
|
||||
/// Initialize the application by loading a previously saved `*.scn.ron`
|
||||
/// scene file.
|
||||
FromScene(String),
|
||||
}
|
||||
|
||||
pub fn start_internal(
|
||||
object_id: &str,
|
||||
skybox_id: &str,
|
||||
seed: InitSeed,
|
||||
canvas_selector: &str,
|
||||
canvas_alt: &str,
|
||||
viewport_size: ViewportSize,
|
||||
@@ -241,9 +259,6 @@ pub fn start_internal(
|
||||
#[cfg(feature = "wasm")]
|
||||
console_error_panic_hook::set_once();
|
||||
|
||||
let object_id = object_id.to_string();
|
||||
let skybox_id = skybox_id.to_string();
|
||||
|
||||
let mut app = App::new();
|
||||
|
||||
app.insert_resource(HeadlessMode::None);
|
||||
@@ -274,13 +289,25 @@ pub fn start_internal(
|
||||
app.auto_reflected_undo::<Transform>();
|
||||
}
|
||||
|
||||
app.add_systems(
|
||||
Startup,
|
||||
move |mut cmd: Commands, mut ew: EventWriter<LoadSceneEvent>| {
|
||||
cmd.insert_resource(SkyboxId(skybox_id.clone()));
|
||||
ew.send(LoadSceneEvent(object_id.clone()));
|
||||
},
|
||||
);
|
||||
match seed {
|
||||
InitSeed::FromLibrary {
|
||||
object_id,
|
||||
skybox_id,
|
||||
} => {
|
||||
app.add_systems(
|
||||
Startup,
|
||||
move |mut cmd: Commands, mut ew: EventWriter<LoadLibraryObjectEvent>| {
|
||||
cmd.insert_resource(SkyboxId(skybox_id.clone()));
|
||||
ew.send(LoadLibraryObjectEvent(object_id.clone()));
|
||||
},
|
||||
);
|
||||
}
|
||||
InitSeed::FromScene(scene) => {
|
||||
app.add_systems(Startup, move |mut ew: EventWriter<LoadSceneEvent>| {
|
||||
ew.send(LoadSceneEvent(scene.clone()));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "wasm")]
|
||||
wasm::initialize();
|
||||
@@ -331,10 +358,10 @@ pub fn start_headless(
|
||||
Startup,
|
||||
move |mut cmd: Commands,
|
||||
asset_server: Res<AssetServer>,
|
||||
mut ew: EventWriter<LoadSceneEvent>| {
|
||||
mut ew: EventWriter<LoadLibraryObjectEvent>| {
|
||||
cmd.insert_resource(SkyboxId(skybox.clone()));
|
||||
cmd.insert_resource(TestBvh(asset_server.load(bvh_dir.clone())));
|
||||
ew.send(LoadSceneEvent("Mannequin.gltf".to_string()));
|
||||
ew.send(LoadLibraryObjectEvent("Mannequin.gltf".to_string()));
|
||||
},
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user