diff options
| author | Arne Dußin | 2020-10-31 01:36:58 +0100 |
|---|---|---|
| committer | Arne Dußin | 2020-10-31 01:36:58 +0100 |
| commit | 4579d5cb376fdcc58c70d9d7ea8a5064d686ec1d (patch) | |
| tree | 98bb4b3415601348bffc1176d189264b01c1c558 /src/tool/wall_tool.rs | |
| parent | c5b16dd0511997331b8cc8c3647fff95effbe8ec (diff) | |
| download | graf_karto-4579d5cb376fdcc58c70d9d7ea8a5064d686ec1d.tar.gz graf_karto-4579d5cb376fdcc58c70d9d7ea8a5064d686ec1d.zip | |
Add wall tool
The wall tool is currently just one pixels lines, which must be changed
in the future, of course, but this is also to test changing between
tools.
Diffstat (limited to 'src/tool/wall_tool.rs')
| -rw-r--r-- | src/tool/wall_tool.rs | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/tool/wall_tool.rs b/src/tool/wall_tool.rs new file mode 100644 index 0000000..8d018c6 --- /dev/null +++ b/src/tool/wall_tool.rs @@ -0,0 +1,79 @@ +use super::Tool; +use crate::math; +use crate::transform::Transform; +use raylib::core::drawing::{RaylibDraw, RaylibDrawHandle}; +use raylib::ffi::{Color, MouseButton}; +use raylib::math::Vector2; +use raylib::RaylibHandle; + +pub struct WallTool { + walls: Vec<(Vector2, Vector2)>, + unfinished_wall: Option<(Vector2, Vector2)>, +} + +impl WallTool { + pub fn new() -> Self { + Self { + walls: Vec::new(), + unfinished_wall: None, + } + } +} + +impl Tool for WallTool { + fn active_update(&mut self, rl: &RaylibHandle, transform: &Transform) { + let mouse_pos_m = transform.point_px_to_m(rl.get_mouse_position()); + if let Some((_, ref mut pos2)) = &mut self.unfinished_wall { + let snapped_mouse_pos = Vector2::new( + math::round(mouse_pos_m.x, 0.5), + math::round(mouse_pos_m.y, 0.5), + ); + *pos2 = snapped_mouse_pos; + } + + if rl.is_mouse_button_pressed(MouseButton::MOUSE_LEFT_BUTTON) { + if let Some((pos1, pos2)) = self.unfinished_wall { + self.walls.push((pos1, pos2)); + self.unfinished_wall = None; + } else { + let snapped_mouse_pos = Vector2::new( + math::round(mouse_pos_m.x, 0.5), + math::round(mouse_pos_m.y, 0.5), + ); + self.unfinished_wall = Some((snapped_mouse_pos, snapped_mouse_pos)) + } + } + + if rl.is_mouse_button_pressed(MouseButton::MOUSE_RIGHT_BUTTON) { + self.unfinished_wall = None; + } + } + + fn draw(&self, rld: &mut RaylibDrawHandle, transform: &Transform) { + for &(pos1, pos2) in &self.walls { + rld.draw_line_v( + transform.point_m_to_px(pos1), + transform.point_m_to_px(pos2), + Color { + r: 200, + g: 150, + b: 150, + a: 255, + }, + ); + } + + if let Some((pos1, pos2)) = self.unfinished_wall { + rld.draw_line_v( + transform.point_m_to_px(pos1), + transform.point_m_to_px(pos2), + Color { + r: 150, + g: 200, + b: 150, + a: 255, + }, + ); + } + } +} |
