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 | |
| 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')
| -rw-r--r-- | src/tool/mod.rs | 61 | ||||
| -rw-r--r-- | src/tool/room_tool.rs | 9 | ||||
| -rw-r--r-- | src/tool/wall_tool.rs | 79 |
3 files changed, 137 insertions, 12 deletions
diff --git a/src/tool/mod.rs b/src/tool/mod.rs index e0d4f1e..3e6200f 100644 --- a/src/tool/mod.rs +++ b/src/tool/mod.rs @@ -1,16 +1,65 @@ pub mod room_tool; pub use room_tool::RoomTool; +pub mod wall_tool; +pub use wall_tool::WallTool; + use crate::transform::Transform; -use raylib::core::drawing::RaylibDraw; +use raylib::core::drawing::RaylibDrawHandle; +use raylib::ffi::KeyboardKey; use raylib::RaylibHandle; +#[derive(Debug)] +#[repr(u8)] +pub enum ToolType { + RoomTool, + WallTool, + NumTools, +} + pub trait Tool { - fn update(&mut self, rl: &RaylibHandle, transform: &Transform); + fn update(&mut self, rl: &RaylibHandle, transform: &Transform) {} + fn active_update(&mut self, rl: &RaylibHandle, transform: &Transform); + + fn draw(&self, _rld: &mut RaylibDrawHandle, _transform: &Transform) {} +} + +pub struct ToolShed { + tools: Vec<Box<dyn Tool>>, + active: usize, +} + +impl ToolShed { + pub fn new() -> Self { + let mut tools: Vec<Box<dyn Tool>> = Vec::with_capacity(ToolType::NumTools as usize); + assert_eq!(ToolType::RoomTool as u8, 0); + tools.push(Box::new(RoomTool::new())); + assert_eq!(ToolType::WallTool as u8, 1); + tools.push(Box::new(WallTool::new())); + + Self { tools, active: 0 } + } + + pub fn update(&mut self, rl: &RaylibHandle, transform: &Transform) { + // Handle keybindings for tool change + self.active = if rl.is_key_pressed(KeyboardKey::KEY_R) { + ToolType::RoomTool as usize + } else if rl.is_key_pressed(KeyboardKey::KEY_W) { + ToolType::WallTool as usize + } else { + self.active + }; + + for tool in &mut self.tools { + tool.update(rl, transform); + } + + self.tools[self.active].active_update(rl, transform); + } - fn draw<D>(&self, _rld: &mut D, _transform: &Transform) - where - D: RaylibDraw, - { + pub fn draw_tools(&self, rld: &mut RaylibDrawHandle, transform: &Transform) { + for tool in &self.tools { + tool.draw(rld, transform); + } } } diff --git a/src/tool/room_tool.rs b/src/tool/room_tool.rs index 6a9ad55..10b9edf 100644 --- a/src/tool/room_tool.rs +++ b/src/tool/room_tool.rs @@ -1,7 +1,7 @@ use super::Tool; use crate::math; use crate::transform::Transform; -use raylib::core::drawing::RaylibDraw; +use raylib::core::drawing::{RaylibDraw, RaylibDrawHandle}; use raylib::ffi::{Color, MouseButton}; use raylib::math::{Rectangle, Vector2}; use raylib::RaylibHandle; @@ -25,7 +25,7 @@ impl RoomTool { } impl Tool for RoomTool { - fn update(&mut self, rl: &RaylibHandle, transform: &Transform) { + fn active_update(&mut self, rl: &RaylibHandle, transform: &Transform) { let mouse_pos_m = transform.point_px_to_m(rl.get_mouse_position()); // Update the currently drawn rectangle, if it exists if let Some((_, ref mut pos2)) = &mut self.unfinished_rect { @@ -56,10 +56,7 @@ impl Tool for RoomTool { } } - fn draw<D>(&self, rld: &mut D, transform: &Transform) - where - D: RaylibDraw, - { + fn draw(&self, rld: &mut RaylibDrawHandle, transform: &Transform) { // Draw all finished rectangles. for &rect in &self.room_rects { rld.draw_rectangle_rec( 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, + }, + ); + } + } +} |
