bevy_headless_render/
lib.rs

1#![warn(missing_docs)]
2
3//! Plugin for the Bevy game engine which provides the ability to render to an image headlessly.
4
5use bevy::{
6    prelude::*,
7    render::{
8        extract_component::ExtractComponentPlugin, graph::CameraDriverLabel,
9        render_asset::RenderAssetPlugin, render_graph::RenderGraph, Render, RenderApp, RenderSet,
10    },
11};
12use components::HeadlessRenderDestination;
13use nodes::{HeadlessRenderCopyLabel, HeadlessRenderCopyNode};
14use render_assets::{HeadlessRenderSource, GpuHeadlessRenderSource};
15
16/// Components used by this plugin.
17pub mod components;
18/// Render assets used by this plugin.
19pub mod render_assets;
20
21mod nodes;
22mod systems;
23
24/// Plugin which handles headless rendering.
25pub struct HeadlessRenderPlugin;
26
27impl Plugin for HeadlessRenderPlugin {
28    fn build(&self, app: &mut App) {
29        app.register_type::<HeadlessRenderSource>()
30            .init_asset::<HeadlessRenderSource>()
31            .register_asset_reflect::<HeadlessRenderSource>()
32            .add_plugins((
33                RenderAssetPlugin::<GpuHeadlessRenderSource>::default(),
34                ExtractComponentPlugin::<HeadlessRenderDestination>::default(),
35            ));
36
37        let render_app = app.sub_app_mut(RenderApp);
38        render_app.add_systems(
39            Render,
40            systems::copy_buffers
41                .after(RenderSet::Render)
42                .before(RenderSet::Cleanup),
43        );
44        let mut graph = render_app.world_mut().resource_mut::<RenderGraph>();
45        graph.add_node(HeadlessRenderCopyLabel, HeadlessRenderCopyNode);
46        graph.add_node_edge(CameraDriverLabel, HeadlessRenderCopyLabel);
47    }
48}