Skip to content

Commit 458cb7a

Browse files
committed
Add headless mode (#3439)
# Objective In this PR I added the ability to opt-out graphical backends. Closes #3155. ## Solution I turned backends into `Option` ~~and removed panicking sub app API to force users handle the error (was suggested by `@cart`)~~.
1 parent 2ee38cb commit 458cb7a

File tree

19 files changed

+300
-247
lines changed

19 files changed

+300
-247
lines changed

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,10 @@ path = "examples/app/return_after_run.rs"
249249
name = "thread_pool_resources"
250250
path = "examples/app/thread_pool_resources.rs"
251251

252+
[[example]]
253+
name = "headless_defaults"
254+
path = "examples/app/headless_defaults.rs"
255+
252256
[[example]]
253257
name = "without_winit"
254258
path = "examples/app/without_winit.rs"

crates/bevy_core_pipeline/src/lib.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,11 @@ impl Plugin for CorePipelinePlugin {
9595
fn build(&self, app: &mut App) {
9696
app.init_resource::<ClearColor>();
9797

98-
let render_app = app.sub_app_mut(RenderApp);
98+
let render_app = match app.get_sub_app_mut(RenderApp) {
99+
Ok(render_app) => render_app,
100+
Err(_) => return,
101+
};
102+
99103
render_app
100104
.init_resource::<DrawFunctions<Transparent2d>>()
101105
.init_resource::<DrawFunctions<Opaque3d>>()

crates/bevy_pbr/src/lib.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,11 @@ impl Plugin for PbrPlugin {
138138
},
139139
);
140140

141-
let render_app = app.sub_app_mut(RenderApp);
141+
let render_app = match app.get_sub_app_mut(RenderApp) {
142+
Ok(render_app) => render_app,
143+
Err(_) => return,
144+
};
145+
142146
render_app
143147
.add_system_to_stage(
144148
RenderStage::Extract,

crates/bevy_pbr/src/render/mesh.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,13 @@ impl Plugin for MeshRenderPlugin {
5353

5454
app.add_plugin(UniformComponentPlugin::<MeshUniform>::default());
5555

56-
app.sub_app_mut(RenderApp)
57-
.init_resource::<MeshPipeline>()
58-
.add_system_to_stage(RenderStage::Extract, extract_meshes)
59-
.add_system_to_stage(RenderStage::Queue, queue_mesh_bind_group)
60-
.add_system_to_stage(RenderStage::Queue, queue_mesh_view_bind_groups);
56+
if let Ok(render_app) = app.get_sub_app_mut(RenderApp) {
57+
render_app
58+
.init_resource::<MeshPipeline>()
59+
.add_system_to_stage(RenderStage::Extract, extract_meshes)
60+
.add_system_to_stage(RenderStage::Queue, queue_mesh_bind_group)
61+
.add_system_to_stage(RenderStage::Queue, queue_mesh_view_bind_groups);
62+
}
6163
}
6264
}
6365

crates/bevy_pbr/src/wireframe.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,15 @@ impl Plugin for WireframePlugin {
3131

3232
app.init_resource::<WireframeConfig>();
3333

34-
app.sub_app_mut(RenderApp)
35-
.add_render_command::<Opaque3d, DrawWireframes>()
36-
.init_resource::<WireframePipeline>()
37-
.init_resource::<SpecializedPipelines<WireframePipeline>>()
38-
.add_system_to_stage(RenderStage::Extract, extract_wireframes)
39-
.add_system_to_stage(RenderStage::Extract, extract_wireframe_config)
40-
.add_system_to_stage(RenderStage::Queue, queue_wireframes);
34+
if let Ok(render_app) = app.get_sub_app_mut(RenderApp) {
35+
render_app
36+
.add_render_command::<Opaque3d, DrawWireframes>()
37+
.init_resource::<WireframePipeline>()
38+
.init_resource::<SpecializedPipelines<WireframePipeline>>()
39+
.add_system_to_stage(RenderStage::Extract, extract_wireframes)
40+
.add_system_to_stage(RenderStage::Extract, extract_wireframe_config)
41+
.add_system_to_stage(RenderStage::Queue, queue_wireframes);
42+
}
4143
}
4244
}
4345

crates/bevy_render/src/camera/mod.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,11 @@ impl Plugin for CameraPlugin {
5353
CoreStage::PostUpdate,
5454
crate::camera::camera_system::<PerspectiveProjection>,
5555
);
56-
app.sub_app_mut(RenderApp)
57-
.init_resource::<ExtractedCameraNames>()
58-
.add_system_to_stage(RenderStage::Extract, extract_cameras);
56+
if let Ok(render_app) = app.get_sub_app_mut(RenderApp) {
57+
render_app
58+
.init_resource::<ExtractedCameraNames>()
59+
.add_system_to_stage(RenderStage::Extract, extract_cameras);
60+
}
5961
}
6062
}
6163

0 commit comments

Comments
 (0)