bevy_capture_media/
lib.rs

1#![feature(doc_auto_cfg)]
2
3#[allow(clippy::type_complexity)]
4pub mod data;
5pub mod formats;
6#[cfg(any(feature = "gif", feature = "png"))]
7mod image_utils;
8mod management;
9mod render;
10#[cfg(target_arch = "wasm32")]
11mod web_utils;
12
13mod plugin {
14	use bevy_app::{App, CoreStage, Plugin};
15	use bevy_render::{RenderApp, RenderStage};
16
17	use super::*;
18
19	pub struct BevyCapturePlugin;
20	impl Plugin for BevyCapturePlugin {
21		fn build(&self, app: &mut App) {
22			let tracking_tracker = data::ActiveRecorders::default();
23			let data_smuggler = data::SharedDataSmuggler::default();
24
25			app.add_event::<data::StartTrackingCamera>()
26				.add_event::<data::StopTrackingCamera>()
27				.insert_resource(tracking_tracker)
28				.insert_resource(data_smuggler.clone())
29				.add_system_to_stage(CoreStage::First, management::clean_cameras)
30				.add_system_to_stage(CoreStage::First, management::move_camera_buffers)
31				.add_system_to_stage(CoreStage::PostUpdate, management::sync_tracking_cameras)
32				.add_system_to_stage(
33					CoreStage::PostUpdate,
34					management::start_tracking_orthographic_camera,
35				);
36
37			#[cfg(feature = "gif")]
38			{
39				app.add_event::<formats::gif::CaptureGifRecording>()
40					.add_system_to_stage(
41						CoreStage::PostUpdate,
42						formats::gif::capture_gif_recording,
43					);
44
45				#[cfg(not(target_arch = "wasm32"))]
46				app.add_system_to_stage(
47					CoreStage::Last,
48					management::clean_unmonitored_tasks::<formats::gif::SaveGifRecording>,
49				);
50			}
51			#[cfg(feature = "png")]
52			{
53				app.add_event::<formats::png::SavePngFile>()
54					.add_system_to_stage(CoreStage::PostUpdate, formats::png::save_single_frame);
55
56				#[cfg(not(target_arch = "wasm32"))]
57				app.add_system_to_stage(
58					CoreStage::Last,
59					management::clean_unmonitored_tasks::<formats::png::SaveFrameTask>,
60				);
61			}
62
63			let render_app = app.get_sub_app_mut(RenderApp)
64				.expect("bevy_capture_media will not work without the render app. Either enable this sub app, or disable bevy_capture_media");
65
66			render_app
67				.insert_resource(data_smuggler)
68				.add_system_to_stage(RenderStage::Render, render::smuggle_frame);
69		}
70	}
71}
72
73pub use data::MediaCapture;
74pub use plugin::BevyCapturePlugin;