use std::marker::PhantomData;
use std::path::Path;
use bevy::ecs::system::SystemParam;
use bevy::prelude::{AssetServer, Assets, Handle, Image, Res, ResMut, Resource, Sprite};
use hashbrown::HashMap;
#[derive(Resource)]
pub struct AssetHandleFactory {
emoji_loaders: HashMap<String, Handle<Image>>,
}
impl AssetHandleFactory {
pub fn new() -> AssetHandleFactory {
AssetHandleFactory {
emoji_loaders: HashMap::new(),
}
}
pub fn get_emoji_loader(
&mut self,
emoji_code: String,
asset_server: &Res<AssetServer>,
) -> Sprite {
Sprite::from_image(self.get_material_handle(emoji_code, asset_server))
}
fn load_emoji_sprite(
&mut self,
asset_server: &Res<AssetServer>,
emoji_filename: String,
) -> Handle<Image> {
asset_server.load(Path::new("emojis").join(emoji_filename))
}
pub fn get_material_handle(
&mut self,
emoji_code: String,
asset_server: &Res<AssetServer>,
) -> Handle<Image> {
let emoji_filename = format!("{}.png", emoji_code);
let texture = match self.emoji_loaders.get(&emoji_code) {
Some(handle) => (*handle).clone(),
None => {
let handle = self.load_emoji_sprite(asset_server, emoji_filename);
self.emoji_loaders.insert(emoji_code, handle.clone());
handle
}
};
texture
}
}
#[derive(SystemParam)]
pub struct AssetHandleFactoryResource<'w, 's> {
pub sprite_factory: ResMut<'w, AssetHandleFactory>,
pub asset_server: Res<'w, AssetServer>,
pub assets: ResMut<'w, Assets<Image>>,
marker: PhantomData<&'s ()>,
}
impl<'w, 's> AssetHandleFactoryResource<'w, 's> {
pub fn get_emoji_loader(&mut self, emoji_code: String) -> Sprite {
self.sprite_factory
.get_emoji_loader(emoji_code, &self.asset_server)
}
pub fn get_material_handle(&mut self, emoji_code: String) -> Handle<Image> {
self.sprite_factory
.get_material_handle(emoji_code, &self.asset_server)
}
}