aboutsummaryrefslogtreecommitdiff
path: root/stockton-render/src/draw/texture/resolver.rs
diff options
context:
space:
mode:
Diffstat (limited to 'stockton-render/src/draw/texture/resolver.rs')
-rw-r--r--stockton-render/src/draw/texture/resolver.rs36
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() {