Mercurial > touhou
view examples/common.rs @ 705:ed65f9412bc0
anmrenderer: split common loading functions in another module.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Fri, 23 Aug 2019 19:29:00 +0200 |
parents | |
children | bca515da9047 |
line wrap: on
line source
use image::{GenericImageView, DynamicImage}; use luminance::pixel::{NormRGB8UI, NormRGBA8UI}; use luminance::texture::{Dim2, Flat, Sampler, Texture, GenMipmaps}; use luminance_glfw::surface::GlfwSurface; use std::fs::File; use std::io::{BufReader, Read}; use std::path::Path; pub fn load_file_into_vec(filename: &Path) -> Vec<u8> { let file = File::open(filename).unwrap(); let mut file = BufReader::new(file); let mut buf = vec![]; file.read_to_end(&mut buf).unwrap(); buf } pub enum LoadedTexture { Rgba(Texture<Flat, Dim2, NormRGBA8UI>), Rgb(Texture<Flat, Dim2, NormRGB8UI>), } pub fn load_rgb_png(surface: &mut GlfwSurface, path: &Path) -> Option<LoadedTexture> { // load the texture into memory as a whole bloc (i.e. no streaming) match image::open(&path) { Ok(img) => { let (width, height) = img.dimensions(); let texels = img .pixels() .map(|(_x, _y, rgb)| (rgb[0], rgb[1], rgb[2])) .collect::<Vec<_>>(); // create the luminance texture; the third argument is the number of mipmaps we want (leave it // to 0 for now) and the latest is a the sampler to use when sampling the texels in the // shader (we’ll just use the default one) let tex = Texture::new(surface, [width, height], 0, &Sampler::default()).expect("luminance texture creation"); // the first argument disables mipmap generation (we don’t care so far) tex.upload(GenMipmaps::No, &texels); Some(LoadedTexture::Rgb(tex)) } Err(e) => { eprintln!("cannot open image {}: {}", path.display(), e); None } } } pub fn load_rgb_a_pngs(surface: &mut GlfwSurface, rgb: &Path, alpha: &Path) -> Option<LoadedTexture> { // load the texture into memory as a whole bloc (i.e. no streaming) match image::open(&alpha) { Ok(img) => { let (width, height) = img.dimensions(); let alpha = match img.grayscale() { DynamicImage::ImageLuma8(img) => img, _ => { eprintln!("cannot convert alpha image {} to grayscale", alpha.display()); return None; } }; let img = match image::open(&rgb) { Ok(img) => img, Err(e) => { eprintln!("cannot open rgb image {}: {}", rgb.display(), e); return None; }, }; let texels = img .pixels() .zip(alpha.pixels()) .map(|((_x, _y, rgb), luma)| (rgb[0], rgb[1], rgb[1], luma[0])) .collect::<Vec<_>>(); // create the luminance texture; the third argument is the number of mipmaps we want (leave it // to 0 for now) and the latest is a the sampler to use when sampling the texels in the // shader (we’ll just use the default one) let tex = Texture::new(surface, [width, height], 0, &Sampler::default()).expect("luminance texture creation"); // the first argument disables mipmap generation (we don’t care so far) tex.upload(GenMipmaps::No, &texels); Some(LoadedTexture::Rgba(tex)) } Err(e) => { eprintln!("cannot open alpha image {}: {}", alpha.display(), e); None } } }