From 0a639429be502a0f3a6962f878c8460c478710f8 Mon Sep 17 00:00:00 2001 From: Danny McGee Date: Thu, 16 Nov 2023 02:14:00 -0500 Subject: [PATCH] Getting warmer... --- studio/src/scene/mod.rs | 19 +++++++++--- studio/src/scene/wasm.rs | 67 ++++++++++++++-------------------------- 2 files changed, 37 insertions(+), 49 deletions(-) diff --git a/studio/src/scene/mod.rs b/studio/src/scene/mod.rs index f8eab46..56c7ef5 100644 --- a/studio/src/scene/mod.rs +++ b/studio/src/scene/mod.rs @@ -44,9 +44,9 @@ impl Plugin for ScenePlugin { PostUpdate, ( wasm::notify_entity_spawn_changes.pipe(error), - wasm::save_scene_system - .pipe(error) - .run_if(wasm::scene_download_requested), + wasm::save_scene_system.pipe(error).run_if( + resource_exists::().and_then(wasm::scene_download_requested), + ), ), ); } @@ -62,6 +62,9 @@ struct NewScene { pub gltf: Option>, } +#[derive(Resource, Deref, DerefMut)] +pub struct ActiveScene(pub Handle); + #[derive(Component)] struct Inspectable; @@ -161,7 +164,8 @@ fn scene_inst_ready(r_scene_mgr: Res, q_scene_inst: Query<&SceneIn fn mark_scene_objects( mut cmd: Commands, - r_scene: Res, + r_new_scene: Res, + mut r_active_scene: Option>, r_assets: Res, ra_gltfs: Res>, ra_gltf_nodes: Res>, @@ -212,7 +216,7 @@ fn mark_scene_objects( )); }); - if let Some(gltf) = r_scene + if let Some(gltf) = r_new_scene .gltf .as_ref() .and_then(|handle| ra_gltfs.get(handle)) @@ -273,6 +277,11 @@ fn mark_scene_objects( } } + // Set the new scene as the active scene + match r_active_scene.as_mut() { + Some(active_scene) => ***active_scene = r_new_scene.clone(), + None => cmd.insert_resource(ActiveScene(r_new_scene.clone())), + }; cmd.remove_resource::(); } diff --git a/studio/src/scene/wasm.rs b/studio/src/scene/wasm.rs index ea0f034..a35e603 100644 --- a/studio/src/scene/wasm.rs +++ b/studio/src/scene/wasm.rs @@ -1,8 +1,6 @@ use std::collections::VecDeque; -use bevy::{ - prelude::*, reflect::serde::TypedReflectSerializer, utils::HashSet, window::PrimaryWindow, -}; +use bevy::{prelude::*, scene::SceneInstance, utils::HashSet, window::PrimaryWindow}; use serde::Serialize; use wasm_bindgen::prelude::*; @@ -22,53 +20,34 @@ pub(super) fn scene_download_requested() -> bool { } pub(super) fn save_scene_system(world: &mut World) -> Result<(), String> { - let mut scene = DynamicScene::from_world(world); + let scene_inst = world + .query::<&SceneInstance>() + .get_single(world) + .map_err(|err| format!("{err}"))?; + + let scene_mgr = world.resource::(); + + let mut builder = DynamicSceneBuilder::from_world(world); + builder + .allow_all() + .allow_all_resources() + .deny::() + .deny_resource::