aboutsummaryrefslogtreecommitdiff
path: root/src/tool/wall_tool.rs
diff options
context:
space:
mode:
authorArne Dußin2020-10-31 01:36:58 +0100
committerArne Dußin2020-10-31 01:36:58 +0100
commit4579d5cb376fdcc58c70d9d7ea8a5064d686ec1d (patch)
tree98bb4b3415601348bffc1176d189264b01c1c558 /src/tool/wall_tool.rs
parentc5b16dd0511997331b8cc8c3647fff95effbe8ec (diff)
downloadgraf_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.rs79
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,
+ },
+ );
+ }
+ }
+}