diff options
Diffstat (limited to 'renderer/src/tee.rs')
-rw-r--r-- | renderer/src/tee.rs | 112 |
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, +}; |