diff --git a/editor.ron b/editor.ron index 61f692c..06b005a 100644 --- a/editor.ron +++ b/editor.ron @@ -1,6 +1,6 @@ { - "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_undo::ChangeChainSettings": "{\"space_undo::ChangeChainSettings\":(max_change_chain_size:200)}", "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_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/main-headless.rs b/studio/src/main-headless.rs index 2a302bc..cedd04f 100644 --- a/studio/src/main-headless.rs +++ b/studio/src/main-headless.rs @@ -24,6 +24,8 @@ enum Subcommands { scene_dir: String, #[arg(long)] camera_motion: Option, + #[arg(long)] + camera_motion_speed: Option, #[arg(long, short)] output_dir: Option, #[arg(long)] @@ -73,6 +75,7 @@ fn main() { Subcommands::Scene { scene_dir, camera_motion, + camera_motion_speed, skybox, output_dir, output_resolution, @@ -97,15 +100,16 @@ fn main() { ); 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); + app.insert_resource(CameraMotion::Orbit(camera_motion_speed)); } "pan" => { - app.insert_resource(CameraMotion::Pan); + app.insert_resource(CameraMotion::Pan(camera_motion_speed)); } "zoom" => { - app.insert_resource(CameraMotion::Zoom); + app.insert_resource(CameraMotion::Zoom(camera_motion_speed)); } "static" => { app.insert_resource(CameraMotion::Static); @@ -176,13 +180,11 @@ fn main() { app.run(); } -pub const SPEED: f32 = 0.1; - #[derive(Resource)] enum CameraMotion { - Orbit, - Pan, - Zoom, + Orbit(f32), + Pan(f32), + Zoom(f32), Static, } @@ -199,22 +201,25 @@ pub(crate) fn update_camera_motion( println!("Updating camera motion"); match *camera_motion { - CameraMotion::Orbit => { - orbit_camera(&mut main_cam_transform, &time); + CameraMotion::Orbit(speed) => { + orbit_camera(&mut main_cam_transform, &time, speed); } - CameraMotion::Pan => { - pan_camera(&mut main_cam_transform, &time); + CameraMotion::Pan(speed) => { + pan_camera(&mut main_cam_transform, &time, speed); } - CameraMotion::Zoom => { - zoom_camera(&mut main_cam_transform, &time); + CameraMotion::Zoom(speed) => { + zoom_camera(&mut main_cam_transform, &time, speed); + } + CameraMotion::Static => { + main_cam_transform.translation = Vec3::new(0.340, 1.1, -0.5); + main_cam_transform.rotation = Quat::from_euler(EulerRot::XYZ, 0.0, 0.0, 0.0); } - CameraMotion::Static => {} } // main_cam_transform.look_at(Vec3::ZERO, Vec3::Y); } -fn zoom_camera(main_cam_transform: &mut Transform, time: &Time<()>) { - let scaled_time = time.elapsed().as_secs_f32() * SPEED; +fn zoom_camera(main_cam_transform: &mut Transform, time: &Time<()>, speed : f32) { + let scaled_time = time.elapsed().as_secs_f32() * speed; let normalized_cos = (-scaled_time.cos() + 1.0) / 2.0; let start_pos = Vec3::new(0.366, 1.1, 2.5); let end_pos = Vec3::new(0.366, 1.1, -0.5); @@ -223,18 +228,18 @@ fn zoom_camera(main_cam_transform: &mut Transform, time: &Time<()>) { main_cam_transform.rotation = Quat::from_euler(EulerRot::XYZ, 0.0, 0.0, 0.0); } -fn pan_camera(main_cam_transform: &mut Transform, time: &Time<()>) { - let scaled_time = time.elapsed().as_secs_f32() * SPEED; - let normalized_cos = (scaled_time.cos() + 1.0) / 2.0; - let start_pos = Vec3::new(1.617, 0.9, 2.177); - let end_pos = Vec3::new(-0.365, 0.9, 2.323); +fn pan_camera(main_cam_transform: &mut Transform, time: &Time<()>, speed : f32) { + let scaled_time = time.elapsed().as_secs_f32() * speed; + let normalized_cos = (-scaled_time.cos() + 1.0) / 2.0; + let start_pos = Vec3::new(0.676, 1.1, 0.119); + let end_pos = Vec3::new(0.067, 1.1, 0.121); main_cam_transform.translation = start_pos.lerp(end_pos, normalized_cos); main_cam_transform.rotation = Quat::from_euler(EulerRot::XYZ, 0.0, 0.0, 0.0); } -fn orbit_camera(main_cam_transform: &mut Mut<'_, Transform>, time: &Res<'_, Time>) { - let scaled_time = time.elapsed().as_secs_f32() * SPEED; +fn orbit_camera(main_cam_transform: &mut Mut<'_, Transform>, time: &Res<'_, Time>, speed : f32) { + let scaled_time = time.elapsed().as_secs_f32() * speed; let max_angle = std::f32::consts::PI / 2.0; let normalized_cos = (scaled_time.cos() + 1.0) / 2.0; let angle = max_angle * normalized_cos; diff --git a/studio/src/scene.rs b/studio/src/scene.rs index ebd3c9c..8ea8da9 100644 --- a/studio/src/scene.rs +++ b/studio/src/scene.rs @@ -328,7 +328,8 @@ fn initialiaze_headless( }, CameraControllerBundle::new(focus, camera_xform.translation), ScreenCapture::from_out(&headless_settings.output_dir) - .with_max_frames(headless_settings.max_frames), + //Part of quick hack, see screenshot.rs#261 + .with_max_frames(headless_settings.max_frames + 3), )); } diff --git a/studio/src/screenshot.rs b/studio/src/screenshot.rs index 849db65..9569a89 100644 --- a/studio/src/screenshot.rs +++ b/studio/src/screenshot.rs @@ -144,7 +144,9 @@ fn update_screen_capture_on_extract_step( fn extract_screen_capture_components( mut commands: Commands, screen_capure_comps: Extract>>, + scene_state : Extract>> ) { + if scene_state.get() != &SceneState::Active { return }; for (entity, screen_capture) in screen_capure_comps.iter() { if screen_capture.should_capture() { info!( @@ -250,10 +252,25 @@ impl ViewNode for ScreenCaptureNode { //============================================================================== fn save_buffer_to_file( + mut frames_to_skip : Local>, buffers: Query<(&ScreenCapture, &ScreenCaptureBuffers)>, device: Res, ) { for (screen_capture, buffers) in buffers.iter() { + + // ALERT!! ALERT!! Filthy Hack in effect + // Engine does not load scene in time for the first 3 frames + // So we skip them. Oops :( + // TODO: Fix the Race Condition and properly take screenshots. + let frames_skipped = frames_to_skip.unwrap_or(3); + + if frames_skipped > 0 { + println!("Skipping Frame"); + *frames_to_skip = Some(frames_skipped - 1); + return; + } + // Filthy Hack Ends + if buffers.main_bytes_per_row != buffers.main_padded_bytes_per_row { println!("These don't match!"); }