diff options
Diffstat (limited to 'src/gfx/media.rs')
-rw-r--r-- | src/gfx/media.rs | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/gfx/media.rs b/src/gfx/media.rs new file mode 100644 index 0000000..ac5d158 --- /dev/null +++ b/src/gfx/media.rs @@ -0,0 +1,42 @@ +use std::collections::HashMap; + +#[derive(rust_embed::RustEmbed)] +#[folder = "assets/textures"] +pub struct BaseFolder; // copied from github.com/minetest/minetest + +pub struct MediaMgr { + packs: Vec<HashMap<String, Vec<u8>>>, + srv_idx: usize, +} + +impl MediaMgr { + pub fn new() -> Self { + Self { + packs: [ + BaseFolder::iter() + .map(|file| { + ( + file.to_string(), + BaseFolder::get(&file).unwrap().data.into_owned(), + ) + }) + .collect(), + HashMap::new(), + ] + .into(), + srv_idx: 1, + } + } + + pub fn add_server_media(&mut self, files: HashMap<String, Vec<u8>>) { + self.packs[self.srv_idx].extend(files.into_iter()); + } + + pub fn get(&self, file: &str) -> Option<&[u8]> { + self.packs + .iter() + .rev() + .find_map(|pack| pack.get(file)) + .map(Vec::as_slice) + } +} |