diff options
-rw-r--r-- | renderer/src/map.rs | 46 |
1 files changed, 20 insertions, 26 deletions
diff --git a/renderer/src/map.rs b/renderer/src/map.rs index f687809..8ce932f 100644 --- a/renderer/src/map.rs +++ b/renderer/src/map.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use log::{info, warn}; use skia_safe::{ - canvas::SrcRectConstraint, Canvas, Color4f, ColorSpace, ISize, Image, Paint, Rect, + canvas::SrcRectConstraint, BlendMode, Canvas, Color4f, ColorSpace, ISize, Image, Paint, Rect, }; use twclient::world::{ map::{format, TILE_NUM}, @@ -39,8 +39,8 @@ impl MapRenderer { &skia_safe::ImageInfo::new( ISize::new(t.dim().0 as i32, t.dim().1 as i32), skia_safe::ColorType::RGBA8888, - skia_safe::AlphaType::Opaque, - None, + skia_safe::AlphaType::Premul, + ColorSpace::new_srgb_linear(), ), d, t.dim().0 * 4, @@ -68,28 +68,22 @@ impl MapRenderer { .map(|t| (t.x / 32, t.y / 32)) .unwrap_or((0, 0)); - let tile_rect = Rect { - top: center.1 as f32 * TILE_SIZE, - left: center.0 as f32 * TILE_SIZE, - bottom: center.1 as f32 * TILE_SIZE + TILE_SIZE, - right: center.0 as f32 * TILE_SIZE + TILE_SIZE, - }; - canvas.draw_rect(tile_rect, &grid_paint); - for l in &world.map.layers { - let tileset = match world.map.tilesets.get(&l.image) { - Some(t) => t, - None => { - warn!("missing tileset for {:?}, skipping layer", l.image); - continue; - } - }; - if tileset.dim() == (1, 1) { - continue; - } + let tileset = self.tileset.get(&l.image).unwrap(); + + let mut layer_tint = Paint::new( + Color4f { + a: 0.0, + b: 0.0, + g: 0.0, + r: 0.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); - // let magic = (186, 50); - // println!("{:?} {:?}", center, l.tiles.dim()); for layer_y in (center.1 - 15)..(center.1 + 15) { for layer_x in (center.0 - 15)..(center.0 + 15) { let layer_x = layer_x.try_into().unwrap_or(0); @@ -101,7 +95,7 @@ impl MapRenderer { bottom: layer_y as f32 * TILE_SIZE + TILE_SIZE, right: layer_x as f32 * TILE_SIZE + TILE_SIZE, }; - canvas.draw_rect(tile_rect, &grid_paint); + // canvas.draw_rect(tile_rect, &grid_paint); let tile = match l.tiles.get((layer_y, layer_x)) { Some(t) => t, @@ -120,7 +114,7 @@ impl MapRenderer { const TL: u32 = 64; canvas.draw_image_rect( - self.tileset.get(&l.image).unwrap(), + tileset, Some(( &Rect { top: (tile_y * TL) as f32, @@ -131,7 +125,7 @@ impl MapRenderer { SrcRectConstraint::Strict, )), tile_rect, - &Paint::default(), + &layer_tint, ); } } |