Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_solari/src/scene/mod.rs
6596 views
1
mod binder;
2
mod blas;
3
mod extract;
4
mod types;
5
6
use bevy_shader::load_shader_library;
7
pub use binder::RaytracingSceneBindings;
8
pub use types::RaytracingMesh3d;
9
10
use crate::SolariPlugins;
11
use bevy_app::{App, Plugin};
12
use bevy_ecs::schedule::IntoScheduleConfigs;
13
use bevy_render::{
14
extract_resource::ExtractResourcePlugin,
15
mesh::{
16
allocator::{allocate_and_free_meshes, MeshAllocator},
17
RenderMesh,
18
},
19
render_asset::prepare_assets,
20
render_resource::BufferUsages,
21
renderer::RenderDevice,
22
ExtractSchedule, Render, RenderApp, RenderSystems,
23
};
24
use binder::prepare_raytracing_scene_bindings;
25
use blas::{compact_raytracing_blas, prepare_raytracing_blas, BlasManager};
26
use extract::{extract_raytracing_scene, StandardMaterialAssets};
27
use tracing::warn;
28
29
/// Creates acceleration structures and binding arrays of resources for raytracing.
30
pub struct RaytracingScenePlugin;
31
32
impl Plugin for RaytracingScenePlugin {
33
fn build(&self, app: &mut App) {
34
load_shader_library!(app, "brdf.wgsl");
35
load_shader_library!(app, "raytracing_scene_bindings.wgsl");
36
load_shader_library!(app, "sampling.wgsl");
37
}
38
39
fn finish(&self, app: &mut App) {
40
let render_app = app.sub_app_mut(RenderApp);
41
let render_device = render_app.world().resource::<RenderDevice>();
42
let features = render_device.features();
43
if !features.contains(SolariPlugins::required_wgpu_features()) {
44
warn!(
45
"RaytracingScenePlugin not loaded. GPU lacks support for required features: {:?}.",
46
SolariPlugins::required_wgpu_features().difference(features)
47
);
48
return;
49
}
50
51
app.add_plugins(ExtractResourcePlugin::<StandardMaterialAssets>::default());
52
53
let render_app = app.sub_app_mut(RenderApp);
54
55
render_app
56
.world_mut()
57
.resource_mut::<MeshAllocator>()
58
.extra_buffer_usages |= BufferUsages::BLAS_INPUT | BufferUsages::STORAGE;
59
60
render_app
61
.init_resource::<BlasManager>()
62
.init_resource::<StandardMaterialAssets>()
63
.init_resource::<RaytracingSceneBindings>()
64
.add_systems(ExtractSchedule, extract_raytracing_scene)
65
.add_systems(
66
Render,
67
(
68
prepare_raytracing_blas
69
.in_set(RenderSystems::PrepareAssets)
70
.before(prepare_assets::<RenderMesh>)
71
.after(allocate_and_free_meshes),
72
compact_raytracing_blas
73
.in_set(RenderSystems::PrepareAssets)
74
.after(prepare_raytracing_blas),
75
prepare_raytracing_scene_bindings.in_set(RenderSystems::PrepareBindGroups),
76
),
77
);
78
}
79
}
80
81