diff options
author | Lizzy Fleckenstein <eliasfleckenstein@web.de> | 2023-05-24 03:43:26 +0200 |
---|---|---|
committer | Lizzy Fleckenstein <eliasfleckenstein@web.de> | 2023-05-24 05:32:41 +0200 |
commit | 03c459695021b41f4986707a0fd5d42cd2d31169 (patch) | |
tree | f0b4738915cc3edad35685b54459cdd78547bf0d /src/gfx/map | |
parent | 46ef7a60b3c88799fd8dfb2faf7c9f1dfb22b964 (diff) | |
download | mt_client-03c459695021b41f4986707a0fd5d42cd2d31169.tar.xz |
Move texture creation to media.rs
Diffstat (limited to 'src/gfx/map')
-rw-r--r-- | src/gfx/map/atlas.rs | 42 |
1 files changed, 3 insertions, 39 deletions
diff --git a/src/gfx/map/atlas.rs b/src/gfx/map/atlas.rs index 920fbb4..7bcc53f 100644 --- a/src/gfx/map/atlas.rs +++ b/src/gfx/map/atlas.rs @@ -1,61 +1,25 @@ use super::{super::media::MediaMgr, AtlasSlice, CUBE}; use mt_net::NodeDef; -use rand::Rng; use std::collections::HashMap; pub(super) fn create_atlas( nodes: &mut HashMap<u16, NodeDef>, media: &MediaMgr, ) -> (image::RgbaImage, Vec<AtlasSlice>) { - let mut rng = rand::thread_rng(); let mut allocator = guillotiere::SimpleAtlasAllocator::new(guillotiere::size2(1, 1)); let mut textures = Vec::new(); + let mut id_map = HashMap::new(); + for node in nodes.values_mut() { let tiles = std::iter::empty() .chain(node.tiles.iter_mut()) .chain(node.overlay_tiles.iter_mut()) .chain(node.special_tiles.iter_mut()); - let load_texture = |texture: &str| { - let payload = media - .get(texture) - .ok_or_else(|| format!("texture not found: {texture}"))?; - - image::load_from_memory(payload) - .or_else(|_| image::load_from_memory_with_format(payload, image::ImageFormat::Tga)) - .map_err(|e| format!("failed to load texture {texture}: {e}")) - .map(|x| image::imageops::flip_vertical(&x)) - }; - - let mut make_texture = |texture: &str| { - texture - .split('^') - .map(|part| match load_texture(part) { - Ok(v) => v, - Err(e) => { - if !texture.is_empty() && !texture.contains('[') { - eprintln!("{e}"); - } - - let mut img = image::RgbImage::new(1, 1); - rng.fill(&mut img.get_pixel_mut(0, 0).0); - - image::DynamicImage::from(img).to_rgba8() - } - }) - .reduce(|mut base, top| { - image::imageops::overlay(&mut base, &top, 0, 0); - base - }) - .unwrap() - }; - - let mut id_map = HashMap::new(); - for tile in tiles { tile.texture.custom = *id_map.entry(tile.texture.name.clone()).or_insert_with(|| { - let img = make_texture(&tile.texture.name); + let img = media.texture_string(&tile.texture.name); let dimensions = img.dimensions(); let size = guillotiere::size2(dimensions.0 as i32, dimensions.1 as i32); |