diff options
Diffstat (limited to 'renderer/src/map.rs')
-rw-r--r-- | renderer/src/map.rs | 91 |
1 files changed, 39 insertions, 52 deletions
diff --git a/renderer/src/map.rs b/renderer/src/map.rs index f7672c1..a1e8d94 100644 --- a/renderer/src/map.rs +++ b/renderer/src/map.rs @@ -1,17 +1,17 @@ use std::collections::HashMap; -use log::{info, warn}; +use log::info; use skia_safe::{ - canvas::SrcRectConstraint, BlendMode, Canvas, Color4f, ColorSpace, ISize, Image, Matrix, Paint, - Rect, + canvas::SrcRectConstraint, Canvas, Color4f, ColorSpace, ISize, Image, Matrix, Paint, Rect, }; use twclient::world::{ + helper::Color, map::{format, TILE_NUM}, World, }; pub struct MapRenderer { - tileset: HashMap<Option<usize>, Image>, + tileset: HashMap<(Option<usize>, Color), Image>, } const TILE_SIZE: f32 = 32.0; @@ -27,27 +27,35 @@ impl MapRenderer { pub fn map_changed(&mut self, world: &World) { self.tileset.clear(); for (key, t) in &world.map.tilesets { - let mut bytes: Vec<u8> = Vec::with_capacity(t.dim().0 * t.dim().1 * 4); - info!("loading tileset: {:?} => {:?}", key, t.dim()); - for ((_x, _y), c) in t.indexed_iter() { - bytes.push(c.red); - bytes.push(c.green); - bytes.push(c.blue); - bytes.push(c.alpha); + for layer in world.map.layers.iter().filter(|l| l.image == *key) { + let tint = layer.color; + let mut bytes: Vec<u8> = Vec::with_capacity(t.dim().0 * t.dim().1 * 4); + info!( + "loading tileset: (texture: {:?}, tint: {}) => {:?}", + key, + tint, + t.dim() + ); + for ((_x, _y), c) in t.indexed_iter() { + bytes.push((c.r as u32 * tint.r as u32) as u8); + bytes.push((c.g as u32 * tint.g as u32) as u8); + bytes.push((c.b as u32 * tint.b as u32) as u8); + bytes.push((c.a as u32 * tint.a as u32) as u8); + } + let d = skia_safe::Data::new_copy(&bytes); + let v = skia_safe::Image::from_raster_data( + &skia_safe::ImageInfo::new( + ISize::new(t.dim().0 as i32, t.dim().1 as i32), + skia_safe::ColorType::RGBA8888, + skia_safe::AlphaType::Premul, + ColorSpace::new_srgb_linear(), + ), + d, + t.dim().0 * 4, + ) + .unwrap(); + self.tileset.insert((*key, tint), v); } - let d = skia_safe::Data::new_copy(&bytes); - let v = skia_safe::Image::from_raster_data( - &skia_safe::ImageInfo::new( - ISize::new(t.dim().0 as i32, t.dim().1 as i32), - skia_safe::ColorType::RGBA8888, - skia_safe::AlphaType::Premul, - ColorSpace::new_srgb_linear(), - ), - d, - t.dim().0 * 4, - ) - .unwrap(); - self.tileset.insert(*key, v); } } @@ -66,25 +74,24 @@ impl MapRenderer { grid_paint.set_anti_alias(true); let center = world - .local_tee() + .tees + .local() .map(|t| (t.x / 32, t.y / 32)) .unwrap_or((0, 0)); for l in &world.map.layers { - let tileset = self.tileset.get(&l.image).unwrap(); + let tileset = self.tileset.get(&(l.image, l.color)).unwrap(); let mut layer_tint = Paint::new( Color4f { - a: 0.0, - b: 0.0, - g: 0.0, - r: 0.0, + a: 1.0, + b: 1.0, + g: 1.0, + r: 1.0, }, &ColorSpace::new_srgb(), ); layer_tint.set_style(skia_safe::PaintStyle::Fill); - layer_tint.set_blend_mode(BlendMode::Multiply); - layer_tint.set_argb(l.color.alpha, l.color.red, l.color.green, l.color.blue); for layer_y in (center.1 - 15)..(center.1 + 15) { for layer_x in (center.0 - 15)..(center.0 + 15) { @@ -142,26 +149,6 @@ impl MapRenderer { &layer_tint, ); - // if hflip { - // canvas.draw_rect( - // Rect { - // top: -TILE_SIZE / 2.0, - // bottom: TILE_SIZE / 2.0, - // left: -TILE_SIZE / 2.0, - // right: TILE_SIZE / 2.0, - // }, - // &Paint::new( - // Color4f { - // a: 0.5, - // b: 1.0, - // g: 0.0, - // r: 1.0, - // }, - // &ColorSpace::new_srgb(), - // ), - // ); - // } - canvas.restore(); } } |