diff options
| author | Arne Dußin | 2021-05-05 23:40:17 +0200 |
|---|---|---|
| committer | Arne Dußin | 2021-05-05 23:40:17 +0200 |
| commit | f3178df0a92fb3b87087e78cad7b9313f947be6a (patch) | |
| tree | a201943ce821f18bbb4e9bba393c87155d68a61a /src/texture_manager.rs | |
| download | pmd_coop-f3178df0a92fb3b87087e78cad7b9313f947be6a.tar.gz pmd_coop-f3178df0a92fb3b87087e78cad7b9313f947be6a.zip | |
Initial commit
Diffstat (limited to 'src/texture_manager.rs')
| -rw-r--r-- | src/texture_manager.rs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/texture_manager.rs b/src/texture_manager.rs new file mode 100644 index 0000000..32a61a0 --- /dev/null +++ b/src/texture_manager.rs @@ -0,0 +1,62 @@ +use std::collections::HashMap; +use std::path::Path; + +use sdl2::image::LoadTexture; +use sdl2::render::{Texture, TextureCreator}; + +pub const ASSET_PATH_STR: &str = "assets"; + +pub struct TextureManager<T> +{ + texture_creator: TextureCreator<T>, + textures: HashMap<String, Texture>, +} + +impl<T> TextureManager<T> +{ + pub fn new(texture_creator: TextureCreator<T>) -> Self + { + Self { + texture_creator, + textures: HashMap::new(), + } + } + + pub fn preload<S>(&mut self, filename: S) -> Result<(), String> + where + S: AsRef<Path>, + { + let filename_str = filename + .as_ref() + .to_str() + .expect("Only filenames with valid Unicode are allowed."); + if self.textures.contains_key(filename_str) { + return Ok(()); + } + + let texture = self + .texture_creator + .load_texture(Path::new(ASSET_PATH_STR).join(&filename))?; + self.textures.insert(filename_str.to_string(), texture); + Ok(()) + } + + pub fn get<S>(&mut self, filename: S) -> Result<&Texture, String> + where + S: AsRef<Path>, + { + self.preload(&filename)?; + + Ok(self + .textures + .get(filename.as_ref().to_str().unwrap()) + .unwrap()) + } + + pub fn get_never_load<S>(&self, filename: S) -> Option<&Texture> + where + S: AsRef<Path>, + { + self.textures.get(filename.as_ref().to_str().unwrap()) + } +} |
