From 6a3b58fce268cd010c49e0718f775a7808891d7e Mon Sep 17 00:00:00 2001 From: Daniel Feather <12731372+danielfeather@users.noreply.github.com> Date: Sat, 10 Aug 2024 15:18:51 +0100 Subject: [PATCH] #7 First iteration of texture loading improvements --- src/systems.rs | 59 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 18 deletions(-) diff --git a/src/systems.rs b/src/systems.rs index 10ced7f..a35597d 100644 --- a/src/systems.rs +++ b/src/systems.rs @@ -1,3 +1,5 @@ +use std::f64::consts::E; + use crate::{format, Frame, SpriteSheet, SpriteSheetOptions}; use bevy::prelude::*; @@ -76,52 +78,73 @@ pub fn setup_texture_atlases< /// System for loading the corresponding textures for the specified SpriteSheetFormat /// if `texture_loading` is enabled and if the sprite sheet format supports it pub fn load_textures( - entities: Query<(Entity, &SpriteSheetOptions, &Handle>)>, + entities: Query<( + Entity, + Option>, + Ref>>, + Option<&Handle>, + )>, sprite_sheets: Res>>, - mut loaded: Local>, mut commands: Commands, - server: Res, + asset_server: Res, + mut sprite_sheet_loads: EventReader>>, ) { if entities.is_empty() { return; } - for (entity, options, sprite_sheet_handle) in entities.iter() { - if !options.texture_loading { + for (entity, options, sprite_sheet_handle, possible_texture) in entities.iter() { + let asset_id = sprite_sheet_handle.id(); + + let sprite_sheet_loaded = sprite_sheet_loads.read().find_map(|event| { + if event.is_loaded_with_dependencies(asset_id) { + Some(asset_id) + } else { + None + } + }); + + if options.is_none() && (!sprite_sheet_handle.is_changed() || sprite_sheet_loaded.is_none()) + { continue; } - let Some(sprite_sheet) = sprite_sheets.get(sprite_sheet_handle) else { + let Some(options) = options else { continue; }; - if loaded.contains(&entity) { + if !options.texture_loading { continue; } + let Some(sprite_sheet) = sprite_sheets.get(asset_id) else { + continue; + }; + let Some(path) = sprite_sheet_handle.path() else { error!("Unable to determine path to sprite sheet"); - loaded.push(entity); continue; }; let Some(image_path) = sprite_sheet.get_texture() else { error!("Unable to determine path to sprite sheet image"); - loaded.push(entity); continue; }; - let image_handle: Handle = match path.resolve_embed(image_path) { - Ok(resolved) => server.load(resolved), - Err(e) => { - error!("Unable to resolve path to sprite sheet image, {}", e); - loaded.push(entity); - continue; - } + let Ok(resolved_path) = path.resolve_embed(image_path) else { + error!("Unable to resolve path to sprite sheet image"); + continue; }; - commands.entity(entity).insert(image_handle); - loaded.push(entity); + if possible_texture + .and_then(|texture| texture.path()) + .map(|path| *path == resolved_path) + .unwrap_or(false) + { + commands + .entity(entity) + .insert(asset_server.load::(resolved_path)); + } } }