diff options
Diffstat (limited to 'stockton-render/src/draw/texture/resolver.rs')
-rw-r--r-- | stockton-render/src/draw/texture/resolver.rs | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/stockton-render/src/draw/texture/resolver.rs b/stockton-render/src/draw/texture/resolver.rs index 20efa00..1ecb7a0 100644 --- a/stockton-render/src/draw/texture/resolver.rs +++ b/stockton-render/src/draw/texture/resolver.rs @@ -1,33 +1,47 @@ //! Resolves a texture in a BSP File to an image use crate::draw::texture::image::LoadableImage; -use stockton_levels::traits::textures::Texture; +use stockton_levels::prelude::HasTextures; -use std::path::Path; +use std::{ + mem::drop, + path::Path, + sync::{Arc, RwLock}, +}; use image::{io::Reader, RgbaImage}; /// An object that can be used to resolve a texture from a BSP File -pub trait TextureResolver<T: LoadableImage> { +pub trait TextureResolver { + type Image: LoadableImage; + /// Get the given texture, or None if it's corrupt/not there. - fn resolve(&mut self, texture: &Texture) -> Option<T>; + fn resolve(&mut self, texture_id: u32) -> Option<Self::Image>; } -/// A basic filesystem resolver which expects no file extension and guesses the image format -pub struct BasicFsResolver<'a> { +/// A basic filesystem resolver which gets the texture name from any HasTextures Object. +pub struct FsResolver<'a, T: HasTextures> { path: &'a Path, + map_lock: Arc<RwLock<T>>, } -impl<'a> BasicFsResolver<'a> { - pub fn new(path: &'a Path) -> BasicFsResolver<'a> { - BasicFsResolver { path } +impl<'a, T: HasTextures> FsResolver<'a, T> { + pub fn new(path: &'a Path, map_lock: Arc<RwLock<T>>) -> Self { + FsResolver { path, map_lock } } } -impl<'a> TextureResolver<RgbaImage> for BasicFsResolver<'a> { - fn resolve(&mut self, tex: &Texture) -> Option<RgbaImage> { +impl<'a, T: HasTextures> TextureResolver for FsResolver<'a, T> { + type Image = RgbaImage; + + fn resolve(&mut self, tex: u32) -> Option<Self::Image> { + let map = self.map_lock.read().unwrap(); + let tex = map.get_texture(tex)?; let path = self.path.join(&tex.name); + drop(tex); + drop(map); + if let Ok(file) = Reader::open(path) { if let Ok(guessed) = file.with_guessed_format() { if let Ok(decoded) = guessed.decode() { |