mirror of
https://github.com/storytold/storyteller-bevy.git
synced 2026-10-17 00:13:17 +00:00
fixed some issues, included a quick hack
The first three-ish frames of rendering are gray. We fixed this by not recording the first 3 frames and then adding 3 frames to the render.
This commit is contained in:
+3
-3
@@ -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_ui::tools::gizmo::GizmoHotkey>": "{\"space_editor_core::hotkeys::HotkeySet<space_editor_ui::tools::gizmo::GizmoHotkey>\":(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)}",
|
||||
}
|
||||
+29
-24
@@ -24,6 +24,8 @@ enum Subcommands {
|
||||
scene_dir: String,
|
||||
#[arg(long)]
|
||||
camera_motion: Option<String>,
|
||||
#[arg(long)]
|
||||
camera_motion_speed: Option<f32>,
|
||||
#[arg(long, short)]
|
||||
output_dir: Option<String>,
|
||||
#[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;
|
||||
|
||||
+2
-1
@@ -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),
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
@@ -144,7 +144,9 @@ fn update_screen_capture_on_extract_step(
|
||||
fn extract_screen_capture_components(
|
||||
mut commands: Commands,
|
||||
screen_capure_comps: Extract<Query<(Entity, &ScreenCapture), With<Camera>>>,
|
||||
scene_state : Extract<Res<State<SceneState>>>
|
||||
) {
|
||||
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<Option<u32>>,
|
||||
buffers: Query<(&ScreenCapture, &ScreenCaptureBuffers)>,
|
||||
device: Res<RenderDevice>,
|
||||
) {
|
||||
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!");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user