use std::collections::HashMap;
use bevy::prelude::*;
use bevy_cobweb::prelude::*;
use serde::{Deserialize, Serialize};
use crate::prelude::*;
fn load_texture_atlas_layouts(
In(mut layouts): In<Vec<LoadedTextureAtlasLayout>>,
mut map: ResMut<TextureAtlasLayoutMap>,
mut layout_assets: ResMut<Assets<TextureAtlasLayout>>,
)
{
for loaded_layout in layouts.drain(..) {
let layout = loaded_layout.get_layout();
map.insert(loaded_layout.texture, loaded_layout.alias, &mut layout_assets, layout);
}
}
#[derive(Resource, Default)]
pub struct TextureAtlasLayoutMap
{
map: HashMap<String, HashMap<String, Handle<TextureAtlasLayout>>>,
}
impl TextureAtlasLayoutMap
{
pub fn insert(
&mut self,
texture: String,
alias: String,
assets: &mut Assets<TextureAtlasLayout>,
layout: TextureAtlasLayout,
)
{
self.map
.entry(texture)
.or_default()
.insert(alias, assets.add(layout));
}
pub fn get(&self, texture: impl AsRef<str>, alias: impl AsRef<str>) -> Handle<TextureAtlasLayout>
{
self.map
.get(texture.as_ref())
.and_then(|l| l.get(alias.as_ref()))
.cloned()
.unwrap_or_default()
}
}
#[derive(Reflect, Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LoadedTextureAtlasLayout
{
pub texture: String,
pub alias: String,
pub tile_size: UVec2,
pub columns: u32,
pub rows: u32,
#[reflect(default)]
pub padding: Option<UVec2>,
#[reflect(default)]
pub offset: Option<UVec2>,
}
impl LoadedTextureAtlasLayout
{
pub fn get_layout(&self) -> TextureAtlasLayout
{
TextureAtlasLayout::from_grid(self.tile_size, self.columns, self.rows, self.padding, self.offset)
}
}
#[derive(Reflect, Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LoadTextureAtlasLayouts(pub Vec<LoadedTextureAtlasLayout>);
impl Command for LoadTextureAtlasLayouts
{
fn apply(self, world: &mut World)
{
world.syscall(self.0, load_texture_atlas_layouts);
}
}
pub(crate) struct TextureAtlasLoadPlugin;
impl Plugin for TextureAtlasLoadPlugin
{
fn build(&self, app: &mut App)
{
app.init_resource::<TextureAtlasLayoutMap>()
.register_command_type::<LoadTextureAtlasLayouts>()
.register_type::<LoadedTextureAtlasLayout>();
}
}