aboutsummaryrefslogtreecommitdiff
path: root/renderer/src/map.rs
diff options
context:
space:
mode:
Diffstat (limited to 'renderer/src/map.rs')
-rw-r--r--renderer/src/map.rs91
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();
}
}