aboutsummaryrefslogtreecommitdiff
path: root/light-client/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-07-15 17:37:45 +0200
committermetamuffin <metamuffin@disroot.org>2024-07-15 17:37:45 +0200
commitb12bb151d39fab96624e96570af44985725e3bd2 (patch)
treeee1729dd9cb5add0d8571b0945f0693f18511722 /light-client/src
parentb13e8dfb618d475b91b73ffff28c8367442b9951 (diff)
downloadhurrycurry-b12bb151d39fab96624e96570af44985725e3bd2.tar
hurrycurry-b12bb151d39fab96624e96570af44985725e3bd2.tar.bz2
hurrycurry-b12bb151d39fab96624e96570af44985725e3bd2.tar.zst
fix tile rendering
Diffstat (limited to 'light-client/src')
-rw-r--r--light-client/src/atlas.rs47
1 files changed, 24 insertions, 23 deletions
diff --git a/light-client/src/atlas.rs b/light-client/src/atlas.rs
index e75430c5..94114176 100644
--- a/light-client/src/atlas.rs
+++ b/light-client/src/atlas.rs
@@ -4,8 +4,8 @@ use hurrycurry_protocol::{
};
use sdl2::{
pixels::PixelFormatEnum,
- rect::Rect,
- render::{Canvas, Texture, TextureAccess, TextureCreator},
+ rect::{FRect, Rect},
+ render::{BlendMode, Canvas, Texture, TextureAccess, TextureCreator},
video::{Window, WindowContext},
};
use std::collections::HashMap;
@@ -16,7 +16,7 @@ pub struct SpriteRenderer<'a> {
tiles: Vec<Rect>,
items: Vec<Rect>,
- view_scale: u32,
+ view_scale: Vec2,
view_offset: Vec2,
sprites: Vec<DrawItem>,
@@ -25,7 +25,7 @@ pub struct SpriteRenderer<'a> {
pub struct DrawItem {
z_order: i32,
src: Rect,
- dst: Rect,
+ dst: FRect,
}
impl<'a> SpriteRenderer<'a> {
@@ -55,8 +55,10 @@ impl<'a> SpriteRenderer<'a> {
}
for (x, char) in line.chars().enumerate() {
let color = palette.get(&char).unwrap();
- let base = (y * 1024 + x) * 4;
- texels[base..base + 4].copy_from_slice(color);
+ texels[(y * 1024 + x) * 4 + 0] = color[3];
+ texels[(y * 1024 + x) * 4 + 1] = color[2];
+ texels[(y * 1024 + x) * 4 + 2] = color[1];
+ texels[(y * 1024 + x) * 4 + 3] = color[0];
}
}
@@ -70,6 +72,7 @@ impl<'a> SpriteRenderer<'a> {
.unwrap();
texture.update(None, &texels, 1024 * 4).unwrap();
+ texture.set_blend_mode(BlendMode::Blend);
Self {
texture,
@@ -77,7 +80,7 @@ impl<'a> SpriteRenderer<'a> {
tiles: vec![],
sprites: vec![],
view_offset: Vec2::ZERO,
- view_scale: 32,
+ view_scale: Vec2::new(1., 0.75) * 2.,
}
}
@@ -99,39 +102,37 @@ impl<'a> SpriteRenderer<'a> {
self.items = data
.item_names
.iter()
- .map(|i| meta.get(i).copied().unwrap_or(Rect::new(0, 0, 100, 100)))
+ .map(|i| meta.get(i).copied().unwrap_or(Rect::new(0, 0, 0, 0)))
.collect();
self.tiles = data
.tile_names
.iter()
- .map(|i| meta.get(i).copied().unwrap_or(Rect::new(0, 0, 100, 100)))
+ .map(|i| meta.get(i).copied().unwrap_or(Rect::new(0, 0, 0, 0)))
.collect();
}
pub fn draw_tile(&mut self, TileIndex(i): TileIndex, position: IVec2) {
- let p = (self.view_offset.as_ivec2() + position) * self.view_scale as i32;
+ let p = self.view_offset + position.as_vec2();
+ let src = self.tiles[i];
self.sprites.push(DrawItem {
z_order: position.y,
- src: self.tiles[i],
- dst: Rect::from_center((p.x as i32, p.y as i32), self.view_scale, self.view_scale),
+ src,
+ dst: FRect::new(
+ (p.x * 32.) * self.view_scale.x,
+ (p.y * 24. + 24. - src.height() as f32) * self.view_scale.y,
+ src.width() as f32 * self.view_scale.x,
+ src.height() as f32 * self.view_scale.y,
+ ),
});
}
- pub fn draw_item(&mut self, ItemIndex(i): ItemIndex, position: Vec2) {
- self.sprites.push(DrawItem {
- z_order: position.y as i32,
- src: self.tiles[i],
- dst: Rect::from_center(
- (position.x as i32, position.y as i32),
- self.view_scale,
- self.view_scale,
- ),
- })
+ pub fn draw_item(&mut self, ItemIndex(_i): ItemIndex, _position: Vec2) {
+ todo!()
}
pub fn submit(&mut self, canvas: &mut Canvas<Window>) {
self.sprites.sort();
for DrawItem { src, dst, .. } in self.sprites.drain(..) {
- canvas.copy(&self.texture, src, dst).unwrap();
+ canvas.copy_f(&self.texture, src, dst).unwrap();
}
}
}