use crate::drawables::RaylibDrawContext;
use crate::renderer::RaylibRender;
use raylib::consts::TextureFilter;
use raylib::prelude::{RaylibTexture2D, Texture2D};
use std::fmt::{Debug, Formatter};
use std::ops::Deref;
use std::sync::Arc;
pub trait RaylibLoadableImage {
fn get_filename(&self) -> &str;
}
impl RaylibRender {
pub fn translate_generic_image(
&mut self,
image: &dyn RaylibLoadableImage,
) -> Box<dyn Texture2DHolder> {
let path = image.get_filename();
if self.image_cache().contains_key(path) {
return Box::new(self.image_cache().get(path).unwrap().clone());
}
let texture: Arc<Texture2D> = {
let mut rl = self.lock_handle();
let res = rl.load_texture(self.thread(), path);
match res {
Ok(tex) => {
tex.set_texture_filter(self.thread(), TextureFilter::TEXTURE_FILTER_POINT);
tex.into()
}
Err(_) => panic!("[Raylib Error]: Failed to load path-based image from: {path}"),
}
};
self.image_cache_mut().insert(path.to_owned(), texture);
Box::new(self.image_cache().get(path).unwrap().clone())
}
}
pub trait Texture2DHolder {
fn texture(&self) -> &Texture2D;
}
impl Texture2DHolder for Texture2D {
fn texture(&self) -> &Texture2D {
self
}
}
impl<T: Texture2DHolder> Texture2DHolder for &T {
fn texture(&self) -> &Texture2D {
(*self).texture()
}
}
impl Deref for dyn Texture2DHolder {
type Target = Texture2D;
fn deref(&self) -> &Self::Target {
self.texture()
}
}
impl Debug for dyn Texture2DHolder {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
f.write_str("dyn Texture2DHolder")
}
}
pub trait GenericCompatibleImage: RaylibLoadableImage {
fn load_texture(&self, ctx: &mut RaylibDrawContext<'_, '_>);
fn get_texture(&self, ctx: &RaylibDrawContext<'_, '_>) -> Arc<Texture2D>;
}