bevy_solari/scene/
extract.rs

1use super::RaytracingMesh3d;
2use bevy_asset::{AssetId, Assets};
3use bevy_derive::Deref;
4use bevy_ecs::{
5    resource::Resource,
6    system::{Commands, Query},
7};
8use bevy_pbr::{MeshMaterial3d, StandardMaterial};
9use bevy_platform::collections::HashMap;
10use bevy_render::{extract_resource::ExtractResource, sync_world::RenderEntity, Extract};
11use bevy_transform::components::GlobalTransform;
12
13pub fn extract_raytracing_scene(
14    instances: Extract<
15        Query<(
16            RenderEntity,
17            &RaytracingMesh3d,
18            &MeshMaterial3d<StandardMaterial>,
19            &GlobalTransform,
20        )>,
21    >,
22    mut commands: Commands,
23) {
24    for (render_entity, mesh, material, transform) in &instances {
25        commands
26            .entity(render_entity)
27            .insert((mesh.clone(), material.clone(), *transform));
28    }
29}
30
31#[derive(Resource, Deref, Default)]
32pub struct StandardMaterialAssets(HashMap<AssetId<StandardMaterial>, StandardMaterial>);
33
34impl ExtractResource for StandardMaterialAssets {
35    type Source = Assets<StandardMaterial>;
36
37    fn extract_resource(source: &Self::Source) -> Self {
38        Self(
39            source
40                .iter()
41                .map(|(asset_id, material)| (asset_id, material.clone()))
42                .collect(),
43        )
44    }
45}