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.rs94
1 files changed, 73 insertions, 21 deletions
diff --git a/renderer/src/tee.rs b/renderer/src/tee.rs
index 98ac218..d796f5e 100644
--- a/renderer/src/tee.rs
+++ b/renderer/src/tee.rs
@@ -1,22 +1,41 @@
-use skia_safe::{Canvas, Color4f, ColorSpace, Font, Paint, Point};
-use twclient::world::World;
+use std::{collections::BTreeMap, fs::File, io::Read};
-const TEE_RADIUS: f32 = 16.0;
+use skia_safe::{
+ canvas::SrcRectConstraint, utils::text_utils::Align, Canvas, Color4f, ColorSpace, Data, Font,
+ Image, Paint, Point, Rect,
+};
+use twclient::world::{tee::Tee, World};
-pub struct TeeRenderer {}
+const TEE_COLL_RADIUS: f32 = 16.0;
+const TEE_REND_RADIUS: f32 = 32.0;
+
+pub struct TeeRenderer {
+ skins: BTreeMap<String, Image>,
+}
impl TeeRenderer {
pub fn new() -> Self {
- Self {}
+ Self {
+ skins: BTreeMap::new(),
+ }
}
pub fn draw(&mut self, world: &World, canvas: &mut Canvas) {
+ for t in world.tees.inner.values() {
+ canvas.save();
+ canvas.translate((t.x as f32, t.y as f32));
+ self.draw_tee(canvas, t);
+ canvas.restore();
+ }
+ }
+
+ pub fn draw_tee(&mut self, canvas: &mut Canvas, tee: &Tee) {
let tee_paint = Paint::new(
Color4f {
a: 1.0,
- r: 0.2,
- g: 0.0,
- b: 0.2,
+ r: 1.0,
+ g: 1.0,
+ b: 1.0,
},
&ColorSpace::new_srgb(),
);
@@ -29,18 +48,51 @@ impl TeeRenderer {
},
&ColorSpace::new_srgb(),
);
- for t in world.tees.values() {
- let origin = Point {
- x: t.x as f32,
- y: t.y as f32,
- };
- canvas.draw_circle(origin, TEE_RADIUS, &tee_paint);
- canvas.draw_str(
- t.name.as_str(),
- (origin.x, origin.y - 20.0),
- &Font::default(),
- &name_paint,
- );
- }
+ let skin_texture = self
+ .skins
+ .entry(tee.skin.clone())
+ .or_insert_with(|| TeeRenderer::load_skin(tee.name.as_str()).unwrap());
+
+ let origin = Point {
+ x: tee.x as f32,
+ y: tee.y as f32,
+ };
+
+ canvas.draw_image_rect(
+ skin_texture,
+ Some((
+ &Rect {
+ top: 16.0,
+ left: 16.0,
+ right: 96.0,
+ bottom: 96.0,
+ },
+ SrcRectConstraint::Strict,
+ )),
+ Rect {
+ top: -TEE_REND_RADIUS,
+ left: -TEE_REND_RADIUS,
+ right: TEE_REND_RADIUS,
+ bottom: TEE_REND_RADIUS,
+ },
+ &tee_paint,
+ );
+
+ canvas.draw_str_align(
+ tee.name.as_str(),
+ (origin.x, origin.y - 20.0),
+ &Font::default(),
+ &name_paint,
+ Align::Center,
+ );
+ }
+
+ pub fn load_skin(_name: &str) -> Option<Image> {
+ let path = "/usr/share/ddnet/data/skins/default.png";
+ let mut file = File::open(path).unwrap();
+ let mut data = Vec::new();
+ file.read_to_end(&mut data).unwrap();
+ let data = Data::new_copy(&data);
+ Image::from_encoded(data)
}
}