diff options
| author | Arne Dußin | 2020-12-21 21:12:01 +0100 |
|---|---|---|
| committer | GitHub | 2020-12-21 21:12:01 +0100 |
| commit | c435f278eddcada279fdc424120e4a1448843c20 (patch) | |
| tree | be9a5601e99608966d4ccd146c3bfb3a70c7fc02 /src/map/icon.rs | |
| parent | 3bc690803fb59493ea8180fd630d65b3e26642d0 (diff) | |
| parent | 82d11b7d3e15d8175accf7579db1fbe528fc6583 (diff) | |
| download | graf_karto-c435f278eddcada279fdc424120e4a1448843c20.tar.gz graf_karto-c435f278eddcada279fdc424120e4a1448843c20.zip | |
Merge pull request #24 from LordSentox/refactor
Refactor to make interaction between tools easier
Diffstat (limited to 'src/map/icon.rs')
| -rw-r--r-- | src/map/icon.rs | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/src/map/icon.rs b/src/map/icon.rs new file mode 100644 index 0000000..f623c98 --- /dev/null +++ b/src/map/icon.rs @@ -0,0 +1,94 @@ +use super::icon_renderer::IconRenderer; +use crate::colours::DEFAULT_COLOURS; +use crate::map::Mappable; +use crate::math::{Rect, Vec2}; +use crate::transform::Transform; +use raylib::core::drawing::{RaylibDraw, RaylibDrawHandle}; +use serde::{Deserialize, Serialize}; +use std::ops::{Deref, DerefMut}; +use std::rc::Rc; + +#[derive(Clone, Serialize, Deserialize)] +pub struct IconData { + /// The id of the icon is the icons position in the currently loaded icon_data vector. + pub id: usize, + /// The position of the icon on the map, given by the vector in meters. + pub position: Vec2<f64>, + /// Rotation of the icon texture in degrees. + pub rotation: f64, +} + +#[derive(Clone)] +pub struct Icon { + data: IconData, + selected: bool, + renderer: Rc<IconRenderer>, +} + +impl Icon { + pub fn new(id: usize, position: Vec2<f64>, rotation: f64, renderer: Rc<IconRenderer>) -> Self { + Self::from_data( + IconData { + id, + position, + rotation, + }, + renderer, + ) + } + + pub fn from_data(data: IconData, renderer: Rc<IconRenderer>) -> Self { + Self { + data, + selected: false, + renderer, + } + } +} + +impl Mappable for Icon { + fn draw(&self, rld: &mut RaylibDrawHandle, transform: &Transform) { + let (texture, info) = self.renderer.get(self.id); + // Round the position to whole pixels to fix rotation problems. + let mut position_px = + transform.point_m_to_px(&(self.position - (info.anchor / info.pixels_per_m))); + position_px.x = position_px.x.floor(); + position_px.y = position_px.y.floor(); + rld.draw_texture_ex( + texture, + position_px, + self.rotation as f32, + (transform.pixels_per_m() / info.pixels_per_m) as f32, + if self.selected() { + DEFAULT_COLOURS.icon_selected + } else { + DEFAULT_COLOURS.icon_normal + }, + ); + } + + fn set_selected(&mut self, selected: bool) { + self.selected = selected; + } + + fn selected(&self) -> bool { + self.selected + } + + fn bounding_rect(&self) -> Rect<f64> { + Rect::new(self.data.position.x, self.data.position.y, 0., 0.) + } +} + +impl Deref for Icon { + type Target = IconData; + + fn deref(&self) -> &Self::Target { + &self.data + } +} +impl DerefMut for Icon { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.data + } +} |
