use gizmo_core::World;
use gizmo_math::Vec3;
use gizmo_physics_core::Transform;
use gizmo_renderer::async_assets::AsyncAssetLoader;
use gizmo_renderer::components::Material;
pub fn texture_streaming_system(world: &mut World, cam_pos: Vec3) {
let loader_opt = world.get_resource::<AsyncAssetLoader>();
let async_loader = if let Some(loader) = loader_opt {
loader
} else {
return;
};
let transforms = world.borrow::<Transform>();
let materials = world.borrow_mut::<Material>();
let hidden = world.borrow::<gizmo_core::component::IsHidden>();
let mut requests_this_frame = 0;
const MAX_REQUESTS_PER_FRAME: usize = 3;
let mut entities = Vec::new();
for (e, _) in materials.iter() {
entities.push(e);
}
for e in entities {
if hidden.get(e).is_some() {
continue; }
let mut mat = if let Some(m) = materials.get_mut(e) {
m
} else {
continue;
};
if let Some(texture_path) = mat.texture_source.clone() {
if let Some(t) = transforms.get(e) {
let dist_sq = cam_pos.distance_squared(t.position);
let is_close = dist_sq < 50.0 * 50.0;
if is_close && requests_this_frame < MAX_REQUESTS_PER_FRAME {
async_loader.request_texture_reload(texture_path.clone(), e as usize);
mat.texture_source = None; requests_this_frame += 1;
}
}
}
}
}