ursus_core/render/extract/
meshes.rs1use crate::render::extract::ExtractSystem;
2use crate::render::world::{ExtractedInstance, ExtractedMeshes, ExtractedRenderSettings, RWorld};
3use ursus_ecs::components::mesh::{MeshHandle, TechniqueHandle};
4use ursus_ecs::components::transform::Transform;
5use ursus_ecs::components::transform_interpolation::TransformInterpolation;
6use ursus_ecs::World;
7use ursus_materials::MaterialHandle;
8
9pub struct MeshExtract;
10impl ExtractSystem for MeshExtract {
11 fn extract(&self, world: &World, r_world: &mut RWorld) {
12 let alpha = r_world.get::<ExtractedRenderSettings>().map(|s| s.interpolation_alpha).unwrap_or(1.0);
13
14 let mut meshes = ExtractedMeshes::default();
15
16 for (mesh, transform, interp, mat, technique, aabb) in world
17 .query::<(
18 &MeshHandle,
19 &Transform,
20 Option<&TransformInterpolation>,
21 Option<&MaterialHandle>,
22 Option<&TechniqueHandle>,
23 Option<&crate::assets::mesh::Aabb>,
24 )>()
25 .iter()
26 {
27 let model = match interp {
28 Some(interp) => interp.interpolate(transform, alpha),
29 None => transform.matrix(),
30 };
31
32 meshes.instances.push(ExtractedInstance {
33 mesh: *mesh,
34 material: mat.copied(),
35 technique: technique.map(|t| t.0.clone()),
36 model,
37 aabb: aabb.copied(),
38 });
39 }
40
41 r_world.insert(meshes);
42 }
43 fn name(&self) -> &'static str {
44 "extract_meshes"
45 }
46}