aboutsummaryrefslogtreecommitdiff
path: root/renderer/src/tee.rs
diff options
context:
space:
mode:
Diffstat (limited to 'renderer/src/tee.rs')
-rw-r--r--renderer/src/tee.rs112
1 files changed, 100 insertions, 12 deletions
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,
+};