Mercurial > touhou
annotate runners/src/common.rs @ 792:11bc22bad1bf default tip
python: Replace the image crate with png
We weren’t using any of its features anyway, so the png crate is exactly what
we need, without the many heavy dependencies of image.
https://github.com/image-rs/image-png/pull/670 will eventually make it even
faster to build.
| author | Link Mauve <linkmauve@linkmauve.fr> |
|---|---|
| date | Sat, 17 Jan 2026 22:22:25 +0100 |
| parents | 21b186be2590 |
| children |
| rev | line source |
|---|---|
|
745
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
1 use image::{GenericImageView, DynamicImage, GrayImage, ImageError}; |
|
705
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
2 use luminance::pixel::{NormRGB8UI, NormRGBA8UI}; |
|
753
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
3 use luminance::texture::{Dim2, Dim2Array, Sampler, Texture, GenMipmaps}; |
|
707
987409d48991
Switch to versioned luminance now that it got released, not hardcoded paths.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
706
diff
changeset
|
4 use luminance_glfw::GlfwSurface; |
|
757
21b186be2590
Split the Rust version into multiple crates.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
753
diff
changeset
|
5 use touhou_formats::th06::anm0::Anm0; |
|
705
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
6 use std::fs::File; |
|
752
5e5e7136ac92
examples: Return a Result for load_file_into_vec()
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
749
diff
changeset
|
7 use std::io::{self, BufReader, Read}; |
|
705
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
8 use std::path::Path; |
|
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
9 |
|
752
5e5e7136ac92
examples: Return a Result for load_file_into_vec()
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
749
diff
changeset
|
10 pub fn load_file_into_vec<P: AsRef<Path>>(filename: P) -> io::Result<Vec<u8>> { |
|
5e5e7136ac92
examples: Return a Result for load_file_into_vec()
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
749
diff
changeset
|
11 let file = File::open(filename)?; |
|
705
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
12 let mut file = BufReader::new(file); |
|
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
13 let mut buf = vec![]; |
|
752
5e5e7136ac92
examples: Return a Result for load_file_into_vec()
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
749
diff
changeset
|
14 file.read_to_end(&mut buf)?; |
|
5e5e7136ac92
examples: Return a Result for load_file_into_vec()
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
749
diff
changeset
|
15 Ok(buf) |
|
705
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
16 } |
|
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
17 |
|
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
18 pub enum LoadedTexture { |
|
753
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
19 Rgba(Texture<Dim2, NormRGBA8UI>), |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
20 Rgb(Texture<Dim2, NormRGB8UI>), |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
21 RgbaArray(Texture<Dim2Array, NormRGBA8UI>), |
|
705
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
22 } |
|
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
23 |
|
717
d5d5496e4e53
examples: Propagate image loading errors.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
715
diff
changeset
|
24 #[derive(Debug)] |
|
d5d5496e4e53
examples: Propagate image loading errors.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
715
diff
changeset
|
25 pub enum TextureLoadError { |
|
d5d5496e4e53
examples: Propagate image loading errors.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
715
diff
changeset
|
26 CannotOpenRgb(String, ImageError), |
|
d5d5496e4e53
examples: Propagate image loading errors.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
715
diff
changeset
|
27 CannotOpenAlpha(String, ImageError), |
|
d5d5496e4e53
examples: Propagate image loading errors.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
715
diff
changeset
|
28 AlphaToGrayscale(String), |
|
d5d5496e4e53
examples: Propagate image loading errors.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
715
diff
changeset
|
29 } |
|
d5d5496e4e53
examples: Propagate image loading errors.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
715
diff
changeset
|
30 |
|
745
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
31 fn open_rgb_png(path: &Path) -> Result<DynamicImage, TextureLoadError> { |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
32 // load the texture into memory as a whole bloc (i.e. no streaming) |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
33 image::open(&path).map_err(|e| TextureLoadError::CannotOpenRgb(path.to_str().unwrap().to_owned(), e)) |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
34 } |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
35 |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
36 fn open_alpha_png(path: &Path) -> Result<DynamicImage, TextureLoadError> { |
|
705
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
37 // load the texture into memory as a whole bloc (i.e. no streaming) |
|
745
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
38 image::open(&path).map_err(|e| TextureLoadError::CannotOpenAlpha(path.to_str().unwrap().to_owned(), e)) |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
39 } |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
40 |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
41 fn merge_rgb_alpha(rgb: &DynamicImage, alpha: &GrayImage) -> Vec<(u8, u8, u8, u8)> { |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
42 rgb |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
43 .pixels() |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
44 .zip(alpha.pixels()) |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
45 .map(|((_x, _y, rgb), luma)| (rgb[0], rgb[1], rgb[2], luma[0])) |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
46 .collect::<Vec<_>>() |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
47 } |
|
705
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
48 |
|
746
0ebf6467e4ff
examples: Add a menu example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
745
diff
changeset
|
49 pub fn load_from_data(data: &[u8]) -> Result<DynamicImage, ImageError> { |
|
0ebf6467e4ff
examples: Add a menu example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
745
diff
changeset
|
50 image::load_from_memory(data) |
|
0ebf6467e4ff
examples: Add a menu example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
745
diff
changeset
|
51 } |
|
0ebf6467e4ff
examples: Add a menu example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
745
diff
changeset
|
52 |
|
753
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
53 pub fn reupload_texture_from_rgb_image(tex: &mut Texture<Dim2, NormRGB8UI>, img: DynamicImage) -> Result<(), TextureLoadError> { |
|
745
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
54 let texels = img |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
55 .pixels() |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
56 .map(|(_x, _y, rgb)| (rgb[0], rgb[1], rgb[2])) |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
57 .collect::<Vec<_>>(); |
|
705
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
58 |
|
749
ee45bfde91bb
examples: Add missing reupload_texture_from_rgb_image() to common
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
746
diff
changeset
|
59 // the first argument disables mipmap generation (we don’t care so far) |
|
ee45bfde91bb
examples: Add missing reupload_texture_from_rgb_image() to common
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
746
diff
changeset
|
60 tex.upload(GenMipmaps::No, &texels).unwrap(); |
|
ee45bfde91bb
examples: Add missing reupload_texture_from_rgb_image() to common
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
746
diff
changeset
|
61 |
|
ee45bfde91bb
examples: Add missing reupload_texture_from_rgb_image() to common
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
746
diff
changeset
|
62 Ok(()) |
|
ee45bfde91bb
examples: Add missing reupload_texture_from_rgb_image() to common
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
746
diff
changeset
|
63 } |
|
ee45bfde91bb
examples: Add missing reupload_texture_from_rgb_image() to common
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
746
diff
changeset
|
64 |
|
ee45bfde91bb
examples: Add missing reupload_texture_from_rgb_image() to common
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
746
diff
changeset
|
65 pub fn upload_texture_from_rgb_image(surface: &mut GlfwSurface, img: DynamicImage) -> Result<LoadedTexture, TextureLoadError> { |
|
ee45bfde91bb
examples: Add missing reupload_texture_from_rgb_image() to common
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
746
diff
changeset
|
66 let (width, height) = img.dimensions(); |
|
ee45bfde91bb
examples: Add missing reupload_texture_from_rgb_image() to common
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
746
diff
changeset
|
67 |
|
745
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
68 // create the luminance texture; the third argument is the number of mipmaps we want (leave it |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
69 // to 0 for now) and the latest is a the sampler to use when sampling the texels in the |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
70 // shader (we’ll just use the default one) |
|
749
ee45bfde91bb
examples: Add missing reupload_texture_from_rgb_image() to common
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
746
diff
changeset
|
71 let mut tex = |
|
745
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
72 Texture::new(surface, [width, height], 0, Sampler::default()).expect("luminance texture creation"); |
|
705
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
73 |
|
749
ee45bfde91bb
examples: Add missing reupload_texture_from_rgb_image() to common
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
746
diff
changeset
|
74 reupload_texture_from_rgb_image(&mut tex, img)?; |
|
705
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
75 |
|
745
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
76 Ok(LoadedTexture::Rgb(tex)) |
|
705
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
77 } |
|
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
78 |
|
746
0ebf6467e4ff
examples: Add a menu example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
745
diff
changeset
|
79 pub fn load_rgb_texture(surface: &mut GlfwSurface, path: &Path) -> Result<LoadedTexture, TextureLoadError> { |
|
0ebf6467e4ff
examples: Add a menu example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
745
diff
changeset
|
80 let img = open_rgb_png(&path)?; |
|
0ebf6467e4ff
examples: Add a menu example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
745
diff
changeset
|
81 upload_texture_from_rgb_image(surface, img) |
|
0ebf6467e4ff
examples: Add a menu example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
745
diff
changeset
|
82 } |
|
0ebf6467e4ff
examples: Add a menu example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
745
diff
changeset
|
83 |
|
717
d5d5496e4e53
examples: Propagate image loading errors.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
715
diff
changeset
|
84 fn load_rgb_a_pngs(surface: &mut GlfwSurface, rgb: &Path, alpha: &Path) -> Result<LoadedTexture, TextureLoadError> { |
|
745
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
85 let img = open_alpha_png(&alpha)?; |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
86 let alpha = match img.grayscale() { |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
87 DynamicImage::ImageLuma8(img) => img, |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
88 _ => { |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
89 return Err(TextureLoadError::AlphaToGrayscale(alpha.to_str().unwrap().to_owned())) |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
90 } |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
91 }; |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
92 let (width, height) = img.dimensions(); |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
93 let img = open_rgb_png(&rgb)?; |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
94 assert_eq!((width, height), img.dimensions()); |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
95 let texels = merge_rgb_alpha(&img, &alpha); |
|
705
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
96 |
|
745
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
97 // create the luminance texture; the third argument is the number of mipmaps we want (leave it |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
98 // to 0 for now) and the latest is a the sampler to use when sampling the texels in the |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
99 // shader (we’ll just use the default one) |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
100 let tex = |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
101 Texture::new(surface, [width, height], 0, Sampler::default()).expect("luminance texture creation"); |
|
705
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
102 |
|
745
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
103 // the first argument disables mipmap generation (we don’t care so far) |
|
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
104 tex.upload(GenMipmaps::No, &texels).unwrap(); |
|
705
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
105 |
|
745
90e907859bae
examples: Simplify PNG load functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
740
diff
changeset
|
106 Ok(LoadedTexture::Rgba(tex)) |
|
705
ed65f9412bc0
anmrenderer: split common loading functions in another module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
107 } |
|
706
bca515da9047
examples: use common module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
705
diff
changeset
|
108 |
|
740
8d29dac12219
examples: Make the common functions take AsRef<Path>.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
717
diff
changeset
|
109 pub fn load_anm_image<P: AsRef<Path>>(mut surface: &mut GlfwSurface, anm0: &Anm0, anm_filename: P) -> Result<LoadedTexture, TextureLoadError> { |
|
8d29dac12219
examples: Make the common functions take AsRef<Path>.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
717
diff
changeset
|
110 let anm_filename = anm_filename.as_ref(); |
|
706
bca515da9047
examples: use common module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
705
diff
changeset
|
111 let png_filename = anm_filename.with_file_name(Path::new(&anm0.png_filename).file_name().unwrap()); |
|
bca515da9047
examples: use common module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
705
diff
changeset
|
112 match anm0.alpha_filename { |
|
bca515da9047
examples: use common module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
705
diff
changeset
|
113 Some(ref filename) => { |
|
bca515da9047
examples: use common module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
705
diff
changeset
|
114 let alpha_filename = anm_filename.with_file_name(Path::new(filename).file_name().unwrap()); |
|
717
d5d5496e4e53
examples: Propagate image loading errors.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
715
diff
changeset
|
115 load_rgb_a_pngs(&mut surface, &png_filename, &alpha_filename) |
|
706
bca515da9047
examples: use common module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
705
diff
changeset
|
116 }, |
|
bca515da9047
examples: use common module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
705
diff
changeset
|
117 None => { |
|
746
0ebf6467e4ff
examples: Add a menu example.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
745
diff
changeset
|
118 load_rgb_texture(&mut surface, &png_filename) |
|
706
bca515da9047
examples: use common module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
705
diff
changeset
|
119 } |
|
bca515da9047
examples: use common module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
705
diff
changeset
|
120 } |
|
bca515da9047
examples: use common module.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
705
diff
changeset
|
121 } |
|
753
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
122 |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
123 fn load_array_texture(surface: &mut GlfwSurface, images: &[(&Path, &Path)]) -> Result<LoadedTexture, TextureLoadError> { |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
124 let mut decoded = vec![]; |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
125 let dimensions = (256, 256); |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
126 for (rgb, alpha) in images { |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
127 let img = open_alpha_png(&alpha)?; |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
128 assert_eq!(dimensions, img.dimensions()); |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
129 let alpha = match img.grayscale() { |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
130 DynamicImage::ImageLuma8(img) => img, |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
131 _ => { |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
132 return Err(TextureLoadError::AlphaToGrayscale(alpha.to_str().unwrap().to_owned())) |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
133 } |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
134 }; |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
135 let img = open_rgb_png(&rgb)?; |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
136 assert_eq!(dimensions, img.dimensions()); |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
137 let texels = merge_rgb_alpha(&img, &alpha); |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
138 decoded.push(texels); |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
139 } |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
140 |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
141 // create the luminance texture; the third argument is the number of mipmaps we want (leave it |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
142 // to 0 for now) and the latest is a the sampler to use when sampling the texels in the |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
143 // shader (we’ll just use the default one) |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
144 let tex = |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
145 Texture::new(surface, ([dimensions.0, dimensions.1], images.len() as u32), 0, Sampler::default()).expect("luminance texture creation"); |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
146 |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
147 // the first argument disables mipmap generation (we don’t care so far) |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
148 tex.upload(GenMipmaps::No, &decoded.into_iter().flatten().collect::<Vec<_>>()).unwrap(); |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
149 |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
150 Ok(LoadedTexture::RgbaArray(tex)) |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
151 } |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
152 |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
153 pub fn load_multiple_anm_images<P: AsRef<Path>>(mut surface: &mut GlfwSurface, anms: &[Anm0], anm_filename: P) -> Result<LoadedTexture, TextureLoadError> { |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
154 let anm_filename = anm_filename.as_ref(); |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
155 let mut paths = vec![]; |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
156 for anm0 in anms.iter() { |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
157 let rgb_filename = anm_filename.with_file_name(Path::new(&anm0.png_filename).file_name().unwrap()); |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
158 let filename = anm0.alpha_filename.as_ref().expect("Can’t not have alpha here!"); |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
159 let alpha_filename = anm_filename.with_file_name(Path::new(filename).file_name().unwrap()); |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
160 paths.push((rgb_filename, alpha_filename)); |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
161 } |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
162 let paths: Vec<_> = paths.iter().map(|(rgb, alpha)| (rgb.as_ref(), alpha.as_ref())).collect(); |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
163 load_array_texture(&mut surface, paths.as_slice()) |
|
a662dddd4a2b
examples: Use array textures for enemy PNGs
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
752
diff
changeset
|
164 } |
