summaryrefslogtreecommitdiff
path: root/src/texture_manager.rs
diff options
context:
space:
mode:
authorArne Dußin2021-05-05 23:40:17 +0200
committerArne Dußin2021-05-05 23:40:17 +0200
commitf3178df0a92fb3b87087e78cad7b9313f947be6a (patch)
treea201943ce821f18bbb4e9bba393c87155d68a61a /src/texture_manager.rs
downloadpmd_coop-f3178df0a92fb3b87087e78cad7b9313f947be6a.tar.gz
pmd_coop-f3178df0a92fb3b87087e78cad7b9313f947be6a.zip
Initial commit
Diffstat (limited to 'src/texture_manager.rs')
-rw-r--r--src/texture_manager.rs62
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())
+ }
+}