Skip to content

Commit 190544a

Browse files
committed
update time in render stage
1 parent ae580e5 commit 190544a

File tree

5 files changed

+64
-8
lines changed

5 files changed

+64
-8
lines changed

crates/bevy_core/src/lib.rs

+8-7
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,14 @@ impl Plugin for CorePlugin {
5353
.register_type::<Entity>()
5454
.register_type::<Name>()
5555
.register_type::<Range<f32>>()
56-
.register_type::<Timer>()
57-
// time system is added as an "exclusive system" to ensure it runs before other systems
58-
// in CoreStage::First
59-
.add_system_to_stage(
60-
CoreStage::First,
61-
time_system.exclusive_system().label(CoreSystem::Time),
62-
);
56+
.register_type::<Timer>();
57+
// TODO: figure out how to add this when we don't have a render sub app
58+
// time system is added as an "exclusive system" to ensure it runs before other systems
59+
// in CoreStage::First
60+
// .add_system_to_stage(
61+
// CoreStage::First,
62+
// time_system.exclusive_system().label(CoreSystem::Time),
63+
// );
6364

6465
register_rust_types(app);
6566
register_math_types(app);

crates/bevy_core_pipeline/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ trace = []
1919
# bevy
2020
bevy_app = { path = "../bevy_app", version = "0.8.0-dev" }
2121
bevy_asset = { path = "../bevy_asset", version = "0.8.0-dev" }
22+
bevy_core = { path = "../bevy_core", version = "0.8.0-dev" }
2223
bevy_ecs = { path = "../bevy_ecs", version = "0.8.0-dev" }
2324
bevy_render = { path = "../bevy_render", version = "0.8.0-dev" }
2425
bevy_utils = { path = "../bevy_utils", version = "0.8.0-dev" }

crates/bevy_core_pipeline/src/lib.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ pub use main_pass_driver::*;
2020
use std::ops::Range;
2121

2222
use bevy_app::{App, Plugin};
23+
use bevy_core::prelude::Time;
2324
use bevy_ecs::prelude::*;
2425
use bevy_render::{
2526
camera::{ActiveCamera, Camera2d, Camera3d, ExtractedCamera, RenderTarget},
@@ -121,6 +122,7 @@ impl Plugin for CorePipelinePlugin {
121122
};
122123

123124
render_app
125+
.init_resource::<Time>()
124126
.init_resource::<DrawFunctions<Transparent2d>>()
125127
.init_resource::<DrawFunctions<Opaque3d>>()
126128
.init_resource::<DrawFunctions<AlphaMask3d>>()
@@ -140,7 +142,8 @@ impl Plugin for CorePipelinePlugin {
140142
)
141143
.add_system_to_stage(RenderStage::PhaseSort, sort_phase_system::<Opaque3d>)
142144
.add_system_to_stage(RenderStage::PhaseSort, sort_phase_system::<AlphaMask3d>)
143-
.add_system_to_stage(RenderStage::PhaseSort, sort_phase_system::<Transparent3d>);
145+
.add_system_to_stage(RenderStage::PhaseSort, sort_phase_system::<Transparent3d>)
146+
.add_system_to_stage(RenderStage::ExtractToApp, extract_time_to_app);
144147

145148
let clear_pass_node = ClearPassNode::new(&mut render_app.world);
146149
let pass_node_2d = MainPass2dNode::new(&mut render_app.world);
@@ -384,6 +387,12 @@ pub fn extract_core_pipeline_camera_phases(
384387
}
385388
}
386389

390+
pub fn extract_time_to_app(mut time: ResMut<Time>, render_world: Res<RenderWorld>) {
391+
if let Some(render_time) = render_world.get_resource::<Time>() {
392+
std::mem::swap(&mut *time, &mut render_time.clone());
393+
}
394+
}
395+
387396
pub fn prepare_core_views_system(
388397
mut commands: Commands,
389398
mut texture_cache: ResMut<TextureCache>,

crates/bevy_render/src/lib.rs

+39
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,12 @@ pub enum RenderStage {
7878

7979
/// Cleanup render resources here.
8080
Cleanup,
81+
82+
/// Extract data from the "render world" and insert it into the "app world".
83+
/// This should be used very sparingly and will be combined with the Extract stage
84+
/// when pipelined rendering is implemented. You will only be able to access resources here
85+
/// entities are cleared in the cleanup stage that runs before this.
86+
ExtractToApp,
8187
}
8288

8389
/// The Render App World. This is only available as a resource during the Extract step.
@@ -170,6 +176,7 @@ impl Plugin for RenderPlugin {
170176
.with_system(render_system.exclusive_system().at_end()),
171177
)
172178
.add_stage(RenderStage::Cleanup, SystemStage::parallel())
179+
.add_stage(RenderStage::ExtractToApp, SystemStage::parallel())
173180
.insert_resource(instance)
174181
.insert_resource(device)
175182
.insert_resource(queue)
@@ -276,6 +283,15 @@ impl Plugin for RenderPlugin {
276283

277284
render_app.world.clear_entities();
278285
}
286+
287+
{
288+
#[cfg(feature = "trace")]
289+
let _stage_span =
290+
bevy_utils::tracing::info_span!("stage", name = "extract to app").entered();
291+
292+
// extract to app
293+
extract_to_app(app_world, render_app);
294+
}
279295
});
280296
}
281297

@@ -311,3 +327,26 @@ fn extract(app_world: &mut World, render_app: &mut App) {
311327

312328
extract.apply_buffers(&mut render_app.world);
313329
}
330+
331+
/// Executes the [`ExtractToApp`](RenderStage::Extract) stage of the renderer.
332+
/// This updates the render world with the extracted ECS data of the current frame.
333+
fn extract_to_app(app_world: &mut World, render_app: &mut App) {
334+
let extract_to_app = render_app
335+
.schedule
336+
.get_stage_mut::<SystemStage>(&RenderStage::ExtractToApp)
337+
.unwrap();
338+
339+
// temporarily add the render world to the app world as a resource
340+
let scratch_world = app_world.remove_resource::<ScratchRenderWorld>().unwrap();
341+
let render_world = std::mem::replace(&mut render_app.world, scratch_world.0);
342+
app_world.insert_resource(RenderWorld(render_world));
343+
344+
extract_to_app.run(app_world);
345+
346+
// add the render world back to the render app
347+
let render_world = app_world.remove_resource::<RenderWorld>().unwrap();
348+
let scratch_world = std::mem::replace(&mut render_app.world, render_world.0);
349+
app_world.insert_resource(ScratchRenderWorld(scratch_world));
350+
351+
extract_to_app.apply_buffers(&mut render_app.world);
352+
}

crates/bevy_render/src/renderer/mod.rs

+6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
mod graph_runner;
22
mod render_device;
33

4+
use bevy_core::Time;
45
use bevy_utils::tracing::{error, info, info_span};
56
pub use graph_runner::*;
67
pub use render_device::*;
@@ -73,6 +74,11 @@ pub fn render_system(world: &mut World) {
7374
}
7475
}
7576
}
77+
78+
// update time after presenting frames
79+
if let Some(mut time) = world.get_resource_mut::<Time>() {
80+
time.update();
81+
}
7682
}
7783

7884
/// This queue is used to enqueue tasks for the GPU to execute asynchronously.

0 commit comments

Comments
 (0)