diff --git a/crates/bevy_render/Cargo.toml b/crates/bevy_render/Cargo.toml index 8d646a6d6f64a..000c845aca0c2 100644 --- a/crates/bevy_render/Cargo.toml +++ b/crates/bevy_render/Cargo.toml @@ -39,6 +39,7 @@ bevy_math = { path = "../bevy_math", version = "0.8.0-dev" } bevy_mikktspace = { path = "../bevy_mikktspace", version = "0.8.0-dev" } bevy_reflect = { path = "../bevy_reflect", version = "0.8.0-dev", features = ["bevy"] } bevy_render_macros = { path = "macros", version = "0.8.0-dev" } +bevy_time = { path = "../bevy_time", version = "0.8.0-dev" } bevy_transform = { path = "../bevy_transform", version = "0.8.0-dev" } bevy_window = { path = "../bevy_window", version = "0.8.0-dev" } bevy_utils = { path = "../bevy_utils", version = "0.8.0-dev" } diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index f25ef26e36de7..286c979707705 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -200,6 +200,10 @@ impl Plugin for RenderPlugin { .insert_resource(asset_server) .init_resource::(); + let (sender, receiver) = bevy_time::create_time_channels(); + app.insert_resource(receiver); + render_app.insert_resource(sender); + app.add_sub_app(RenderApp, render_app, move |app_world, render_app| { #[cfg(feature = "trace")] let _render_span = bevy_utils::tracing::info_span!("renderer subapp").entered(); diff --git a/crates/bevy_render/src/renderer/mod.rs b/crates/bevy_render/src/renderer/mod.rs index 07667096ac30b..115893d76d673 100644 --- a/crates/bevy_render/src/renderer/mod.rs +++ b/crates/bevy_render/src/renderer/mod.rs @@ -11,6 +11,8 @@ use crate::{ view::{ExtractedWindows, ViewTarget}, }; use bevy_ecs::prelude::*; +use bevy_time::TimeSender; +use bevy_utils::Instant; use std::sync::Arc; use wgpu::{AdapterInfo, CommandEncoder, Instance, Queue, RequestAdapterOptions}; @@ -73,6 +75,12 @@ pub fn render_system(world: &mut World) { tracy.frame_mark = true ); } + + // update the time and send it to the app world + let time_sender = world.resource::(); + time_sender.0.try_send(Instant::now()).expect( + "The TimeSender channel should always be empty during render. You might need to add the bevy::core::time_system to your app.", + ); } /// This queue is used to enqueue tasks for the GPU to execute asynchronously. diff --git a/crates/bevy_time/Cargo.toml b/crates/bevy_time/Cargo.toml index b1b2c03ff8bf7..46f570fffc591 100644 --- a/crates/bevy_time/Cargo.toml +++ b/crates/bevy_time/Cargo.toml @@ -15,3 +15,6 @@ bevy_app = { path = "../bevy_app", version = "0.8.0-dev" } bevy_ecs = { path = "../bevy_ecs", version = "0.8.0-dev", features = ["bevy_reflect"] } bevy_reflect = { path = "../bevy_reflect", version = "0.8.0-dev", features = ["bevy"] } bevy_utils = { path = "../bevy_utils", version = "0.8.0-dev" } + +# other +crossbeam-channel = "0.5.0" diff --git a/crates/bevy_time/src/lib.rs b/crates/bevy_time/src/lib.rs index dc1f48552031c..5982305159766 100644 --- a/crates/bevy_time/src/lib.rs +++ b/crates/bevy_time/src/lib.rs @@ -9,6 +9,10 @@ pub use stopwatch::*; pub use time::*; pub use timer::*; +use bevy_ecs::system::{Local, Res, ResMut}; +use bevy_utils::{tracing::warn, Instant}; +use crossbeam_channel::{Receiver, Sender}; + pub mod prelude { //! The Bevy Time Prelude. #[doc(hidden)] @@ -41,6 +45,35 @@ impl Plugin for TimePlugin { } } -fn time_system(mut time: ResMut