diff options
Diffstat (limited to 'src/map/wall.rs')
| -rw-r--r-- | src/map/wall.rs | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/map/wall.rs b/src/map/wall.rs new file mode 100644 index 0000000..22393bb --- /dev/null +++ b/src/map/wall.rs @@ -0,0 +1,111 @@ +use super::Mappable; +use crate::colours::DEFAULT_COLOURS; +use crate::math::{LineSegment, Rect, Vec2}; +use crate::scaleable::Scaleable; +use crate::transform::Transform; +use raylib::drawing::{RaylibDraw, RaylibDrawHandle}; +use std::ops::{Deref, DerefMut}; + +pub type WallData = LineSegment<f64>; + +pub struct Wall { + data: WallData, + selected: bool, + round_start: bool, + round_end: bool, +} + +impl Wall { + pub fn from_data(data: WallData, round_start: bool, round_end: bool) -> Self { + Self { + data, + selected: false, + round_start, + round_end, + } + } + + pub fn data(&self) -> &WallData { + &self.data + } +} + +fn draw_round_corner( + rld: &mut RaylibDrawHandle, + pos_px: Vec2<f64>, + transform: &Transform, + selected: bool, +) { + rld.draw_circle_v( + pos_px, + transform.length_m_to_px(0.05) as f32, + if selected { + DEFAULT_COLOURS.wall_selected + } else { + DEFAULT_COLOURS.wall_normal + }, + ); +} + +impl Mappable for Wall { + fn draw(&self, rld: &mut RaylibDrawHandle, transform: &Transform) { + let start_px = transform.point_m_to_px(&self.data.start); + let end_px = transform.point_m_to_px(&self.data.end); + rld.draw_line_ex( + start_px, + end_px, + transform.length_m_to_px(0.1) as f32, + if self.selected() { + DEFAULT_COLOURS.wall_selected + } else { + DEFAULT_COLOURS.wall_normal + }, + ); + + if self.round_start { + draw_round_corner(rld, start_px, transform, self.selected()); + } + if self.round_end { + draw_round_corner(rld, end_px, transform, self.selected()); + } + } + + fn set_selected(&mut self, selected: bool) { + self.selected = selected; + } + + fn selected(&self) -> bool { + self.selected + } + + fn bounding_rect(&self) -> Rect<f64> { + Rect::bounding_rect(self.data.start, self.data.end) + } +} + +impl Scaleable for Wall { + fn scale(&mut self, by: &Vec2<f64>) { + if by.x <= 0. || by.y <= 0. { + panic!("Cannot set dimensions with negative size"); + } + + self.data.start.x *= by.x; + self.data.start.y *= by.y; + self.data.end.x *= by.x; + self.data.end.y *= by.y; + } +} + +impl Deref for Wall { + type Target = WallData; + + fn deref(&self) -> &Self::Target { + &self.data + } +} + +impl DerefMut for Wall { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.data + } +} |
