diff --git a/editor.ron b/editor.ron index 5ec76bc..06b005a 100644 --- a/editor.ron +++ b/editor.ron @@ -1,6 +1,6 @@ { "space_editor_core::hotkeys::HotkeySet": "{\"space_editor_core::hotkeys::HotkeySet\":(bindings:{Rotate:[R],Translate:[G],Scale:[S],Multiple:[ShiftLeft],Clone:[AltLeft],Delete:[X]},name:\"GizmoHotkey\")}", - "space_undo::ChangeChainSettings": "{\"space_undo::ChangeChainSettings\":(max_change_chain_size:200)}", - "space_persistence::PersistenceSettings": "{\"space_persistence::PersistenceSettings\":(load_on_startup:true,save_on_close:true)}", "space_editor_ui::settings::NewWindowSettings": "{\"space_editor_ui::settings::NewWindowSettings\":(new_tab:SameNode)}", + "space_persistence::PersistenceSettings": "{\"space_persistence::PersistenceSettings\":(load_on_startup:true,save_on_close:true)}", + "space_undo::ChangeChainSettings": "{\"space_undo::ChangeChainSettings\":(max_change_chain_size:200)}", } \ No newline at end of file diff --git a/studio/src/lib.rs b/studio/src/lib.rs index ddc51fb..6eff445 100644 --- a/studio/src/lib.rs +++ b/studio/src/lib.rs @@ -26,7 +26,7 @@ mod mixamo; mod path; mod persistance; mod remote; -mod scene; +pub mod scene; pub mod screenshot; mod skybox; mod ui; diff --git a/studio/src/main-headless.rs b/studio/src/main-headless.rs index 46cb0bd..cedd04f 100644 --- a/studio/src/main-headless.rs +++ b/studio/src/main-headless.rs @@ -1,6 +1,9 @@ use bevy::{prelude::*, render::render_resource::Extent3d, transform::components::Transform}; use clap::{Args, Parser, Subcommand}; -use studio::headless::{start_headless, HeadlessMode}; +use studio::{ + headless::{start_headless, HeadlessMode}, + scene::SceneState, +}; #[derive(Parser)] #[command(name = "StorytellerStudioHeadless")] @@ -20,11 +23,9 @@ enum Subcommands { Scene { scene_dir: String, #[arg(long)] - orbit: bool, - #[arg(long, value_parser = clap::value_parser!(f32))] - orbit_radius: Option, - #[arg(long, value_parser = clap::value_parser!(f32))] - orbit_speed: Option, + camera_motion: Option, + #[arg(long)] + camera_motion_speed: Option, #[arg(long, short)] output_dir: Option, #[arg(long)] @@ -73,9 +74,8 @@ fn main() { let mut app = match args.subcommand { Subcommands::Scene { scene_dir, - orbit, - orbit_speed, - orbit_radius, + camera_motion, + camera_motion_speed, skybox, output_dir, output_resolution, @@ -98,15 +98,29 @@ fn main() { frames, output_res, ); - let orbit_speed = orbit_speed.unwrap_or(1.0); - let orbit_radius = orbit_radius.unwrap_or(8.0); - if orbit { - app.insert_resource(OrbitSettings { - radius: orbit_radius, - speed: orbit_speed, - }) - .add_systems(Update, orbit_scene); + if let Some(camera_motion) = camera_motion { + let camera_motion_speed = camera_motion_speed.unwrap_or(1.0); + match camera_motion.as_str() { + "orbit" => { + app.insert_resource(CameraMotion::Orbit(camera_motion_speed)); + } + "pan" => { + app.insert_resource(CameraMotion::Pan(camera_motion_speed)); + } + "zoom" => { + app.insert_resource(CameraMotion::Zoom(camera_motion_speed)); + } + "static" => { + app.insert_resource(CameraMotion::Static); + } + _ => panic!("Unsupported camera motion type."), + } + + app.add_systems( + Update, + update_camera_motion.run_if(in_state(SceneState::Active)), + ); } app @@ -167,26 +181,73 @@ fn main() { } #[derive(Resource)] -struct OrbitSettings { - radius: f32, - speed: f32, +enum CameraMotion { + Orbit(f32), + Pan(f32), + Zoom(f32), + Static, } -fn orbit_scene( - mut camera: Query<&mut Transform, With>, - orbit_settings: Res, +pub(crate) fn update_camera_motion( + mut camera: Query<&mut Transform, (With, Without)>, + camera_motion: Res, time: Res