aboutsummaryrefslogtreecommitdiff
path: root/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'renderer')
-rw-r--r--renderer/src/main.rs4
-rw-r--r--renderer/src/map.rs15
-rw-r--r--renderer/src/tee.rs112
3 files changed, 111 insertions, 20 deletions
diff --git a/renderer/src/main.rs b/renderer/src/main.rs
index 985a717..9716393 100644
--- a/renderer/src/main.rs
+++ b/renderer/src/main.rs
@@ -172,10 +172,10 @@ fn main() {
if !repeat {
match k {
VirtualKeyCode::A => {
- renderer.input.direction += sk * -1;
+ renderer.input.direction -= sk;
}
VirtualKeyCode::D => {
- renderer.input.direction += sk * 1;
+ renderer.input.direction += sk;
}
VirtualKeyCode::Space => {
renderer.input.jump = sa;
diff --git a/renderer/src/map.rs b/renderer/src/map.rs
index a1e8d94..5b657d4 100644
--- a/renderer/src/map.rs
+++ b/renderer/src/map.rs
@@ -29,18 +29,18 @@ impl MapRenderer {
for (key, t) in &world.map.tilesets {
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()
);
+ let mut bytes: Vec<u8> = Vec::with_capacity(t.dim().0 * t.dim().1 * 4);
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);
+ 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(
@@ -98,7 +98,10 @@ impl MapRenderer {
let layer_x = layer_x.try_into().unwrap_or(0);
let layer_y = layer_y.try_into().unwrap_or(0);
- let tile = match l.tiles.get((layer_y, layer_x)) {
+ let tile = match l.tiles.get((
+ ((layer_y as i32) + l.offset.1) as usize,
+ ((layer_y as i32) + l.offset.0) as usize,
+ )) {
Some(t) => t,
None => continue,
};
diff --git a/renderer/src/tee.rs b/renderer/src/tee.rs
index d796f5e..8e8e3ba 100644
--- a/renderer/src/tee.rs
+++ b/renderer/src/tee.rs
@@ -6,8 +6,11 @@ use skia_safe::{
};
use twclient::world::{tee::Tee, World};
-const TEE_COLL_RADIUS: f32 = 16.0;
+// const TEE_COLL_RADIUS: f32 = 16.0;
const TEE_REND_RADIUS: f32 = 32.0;
+const TEE_EYE_ROTATION_RADIUS: f32 = 8.0;
+const TEE_EYE_SIZE: f32 = 12.0;
+const TEE_EYE_DISTANCE: f32 = 8.0;
pub struct TeeRenderer {
skins: BTreeMap<String, Image>,
@@ -59,16 +62,19 @@ impl TeeRenderer {
};
canvas.draw_image_rect(
- skin_texture,
- Some((
- &Rect {
- top: 16.0,
- left: 16.0,
- right: 96.0,
- bottom: 96.0,
- },
- SrcRectConstraint::Strict,
- )),
+ &skin_texture,
+ Some((&SKIN_BODY_SHADOW, SrcRectConstraint::Strict)),
+ Rect {
+ top: -TEE_REND_RADIUS,
+ left: -TEE_REND_RADIUS,
+ right: TEE_REND_RADIUS,
+ bottom: TEE_REND_RADIUS,
+ },
+ &tee_paint,
+ );
+ canvas.draw_image_rect(
+ &skin_texture,
+ Some((&SKIN_BODY, SrcRectConstraint::Strict)),
Rect {
top: -TEE_REND_RADIUS,
left: -TEE_REND_RADIUS,
@@ -78,6 +84,62 @@ impl TeeRenderer {
&tee_paint,
);
+ {
+ canvas.save();
+ // println!("{}", tee.angle);
+ canvas.translate((
+ tee.angle.cos() * TEE_EYE_ROTATION_RADIUS,
+ tee.angle.sin() * TEE_EYE_ROTATION_RADIUS,
+ ));
+
+ canvas.draw_image_rect(
+ &skin_texture,
+ Some((&SKIN_EYE_NORMAL, SrcRectConstraint::Strict)),
+ Rect {
+ top: -TEE_EYE_SIZE,
+ left: -TEE_EYE_SIZE - TEE_EYE_DISTANCE / 2.0,
+ right: TEE_EYE_SIZE - TEE_EYE_DISTANCE / 2.0,
+ bottom: TEE_EYE_SIZE,
+ },
+ &tee_paint,
+ );
+ {
+ canvas.save();
+ canvas.scale((-1.0, 1.0));
+ canvas.draw_image_rect(
+ &skin_texture,
+ Some((&SKIN_EYE_NORMAL, SrcRectConstraint::Strict)),
+ Rect {
+ top: -TEE_EYE_SIZE,
+ left: -TEE_EYE_SIZE - TEE_EYE_DISTANCE / 2.0,
+ right: TEE_EYE_SIZE - TEE_EYE_DISTANCE / 2.0,
+ bottom: TEE_EYE_SIZE,
+ },
+ &tee_paint,
+ );
+ canvas.restore();
+ }
+
+ canvas.restore();
+ }
+ {
+ canvas.save();
+
+ canvas.draw_image_rect(
+ &skin_texture,
+ Some((&SKIN_FOOT, SrcRectConstraint::Strict)),
+ Rect {
+ top: -TEE_EYE_SIZE,
+ left: -TEE_EYE_SIZE - TEE_EYE_DISTANCE / 2.0,
+ right: TEE_EYE_SIZE - TEE_EYE_DISTANCE / 2.0,
+ bottom: TEE_EYE_SIZE,
+ },
+ &tee_paint,
+ );
+
+ canvas.restore();
+ }
+
canvas.draw_str_align(
tee.name.as_str(),
(origin.x, origin.y - 20.0),
@@ -88,7 +150,8 @@ impl TeeRenderer {
}
pub fn load_skin(_name: &str) -> Option<Image> {
- let path = "/usr/share/ddnet/data/skins/default.png";
+ // let path = "/usr/share/ddnet/data/skins/limekitty.png";
+ let path = "/home/muffin/.teeworlds/downloadedskins/limekittygirl.png";
let mut file = File::open(path).unwrap();
let mut data = Vec::new();
file.read_to_end(&mut data).unwrap();
@@ -96,3 +159,28 @@ impl TeeRenderer {
Image::from_encoded(data)
}
}
+
+const SKIN_BODY: Rect = Rect {
+ top: 0.0,
+ left: 0.0,
+ right: 96.0,
+ bottom: 96.0,
+};
+const SKIN_BODY_SHADOW: Rect = Rect {
+ top: 0.0,
+ left: 96.0,
+ right: 192.0,
+ bottom: 96.0,
+};
+const SKIN_FOOT: Rect = Rect {
+ left: 196.0,
+ right: 256.0,
+ top: 32.0,
+ bottom: 64.0,
+};
+const SKIN_EYE_NORMAL: Rect = Rect {
+ left: 64.0,
+ right: 96.0,
+ top: 96.0,
+ bottom: 128.0,
+};