bevy_solari/scene/
extract.rs1use 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}