Skip to main content

gizmo_engine/systems/
streaming.rs

1//! Uzaklığa dayalı Doku Akış (Texture Streaming) Sistemi
2//!
3//! Açık dünya oyunlarında VRAM sınırlarını aşmamak için:
4//! Kamera objelere uzaktayken kaplamaların düşük çözünürlüklü versiyonlarını (veya hiç) tutar,
5//! yaklaştıkça asenkron olarak (AsyncAssetLoader) yüksek çözünürlüklü dokuları VRAM'e yazar.
6
7use gizmo_core::World;
8use gizmo_math::Vec3;
9use gizmo_physics_core::Transform;
10use gizmo_renderer::async_assets::AsyncAssetLoader;
11use gizmo_renderer::components::Material;
12
13/// Objelerin kameraya uzaklığına göre asenkron texture yüklemesini yönetir.
14pub 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    // VRAM kilitlenmesini engellemek için her frame max yükleme limiti (Agresif Streaming)
27    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    // Tüm materyalleri döngüye al
36    for e in entities {
37        if hidden.get(e).is_some() {
38            continue; // Gizli objeler stream edilmez
39        }
40
41        let mut mat = if let Some(m) = materials.get_mut(e) {
42            m
43        } else {
44            continue;
45        };
46
47        // Eğer texture tanımlıysa uzaklık kontrolü yap
48        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                // 50 metre içindeki dokuları yüksek çözünürlüklü yükle
53                let is_close = dist_sq < 50.0 * 50.0;
54
55                if is_close && requests_this_frame < MAX_REQUESTS_PER_FRAME {
56                    // Yükleme işlemini asenkron arka plan thread'ine (I/O) gönder
57                    async_loader.request_texture_reload(texture_path.clone(), e as usize);
58                    mat.texture_source = None; // DİKKAT: Tekrar istek atılmasını engelle!
59                    requests_this_frame += 1;
60                }
61            }
62        }
63    }
64}