1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use std::path::Path;
use raylib::{texture::Texture2D, RaylibHandle, RaylibThread};
use tempfile::tempdir;
use crate::asset_manager::InternalData;
#[derive(Debug, thiserror::Error)]
pub enum ResourceLoadError {
#[error(transparent)]
Io(#[from] std::io::Error),
#[error("Could not load embedded asset: {0}")]
AssetNotFound(String),
#[error("Generic error: {0}")]
Generic(String),
}
pub fn load_texture_from_internal_data(
raylib_handle: &mut RaylibHandle,
thread: &RaylibThread,
path: &str,
) -> Result<Texture2D, ResourceLoadError> {
let temp_dir = tempdir()?;
debug!(
"Created temporary directory for passing embedded data to Raylib: {}",
temp_dir.path().display()
);
let tmp_path = temp_dir.path().join(Path::new(path).file_name().unwrap());
std::fs::write(
&tmp_path,
&InternalData::get(path)
.ok_or(ResourceLoadError::AssetNotFound(path.to_string()))?
.data,
)?;
let texture = raylib_handle
.load_texture(thread, tmp_path.to_str().unwrap())
.map_err(ResourceLoadError::Generic)?;
debug!(
"Dropping temporary directory: {}",
temp_dir.path().display()
);
temp_dir.close()?;
Ok(texture)
}