gizmo_engine/systems/
streaming.rs1use gizmo_core::World;
8use gizmo_math::Vec3;
9use gizmo_physics_core::Transform;
10use gizmo_renderer::async_assets::AsyncAssetLoader;
11use gizmo_renderer::components::Material;
12
13pub fn texture_streaming_system(world: &mut World, cam_pos: Vec3) {
15 let loader_opt = world.get_resource::<AsyncAssetLoader>();
16 let async_loader = if let Some(loader) = loader_opt {
17 loader
18 } else {
19 return;
20 };
21
22 let transforms = world.borrow::<Transform>();
23 let materials = world.borrow_mut::<Material>();
24 let hidden = world.borrow::<gizmo_core::component::IsHidden>();
25
26 let mut requests_this_frame = 0;
28 const MAX_REQUESTS_PER_FRAME: usize = 3;
29
30 let mut entities = Vec::new();
31 for (e, _) in materials.iter() {
32 entities.push(e);
33 }
34
35 for e in entities {
37 if hidden.get(e).is_some() {
38 continue; }
40
41 let mut mat = if let Some(m) = materials.get_mut(e) {
42 m
43 } else {
44 continue;
45 };
46
47 if let Some(texture_path) = mat.texture_source.clone() {
49 if let Some(t) = transforms.get(e) {
50 let dist_sq = cam_pos.distance_squared(t.position);
51
52 let is_close = dist_sq < 50.0 * 50.0;
54
55 if is_close && requests_this_frame < MAX_REQUESTS_PER_FRAME {
56 async_loader.request_texture_reload(texture_path.clone(), e as usize);
58 mat.texture_source = None; requests_this_frame += 1;
60 }
61 }
62 }
63 }
64}