From 092a7b70ff769239673cf98f92b8e757e20de6ad Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Tue, 10 Dec 2024 21:59:04 +0100 Subject: [PATCH 1/3] reduce magic number constants --- src/editor.rs | 93 +++++++++++++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 48 deletions(-) diff --git a/src/editor.rs b/src/editor.rs index c104217..f4ad52b 100644 --- a/src/editor.rs +++ b/src/editor.rs @@ -24,9 +24,13 @@ use crate::{ userdata_dir, Scroll, Textures, }; +const TILE_TEXTURE_SIZE: usize = 16; const HEADER_HEIGHT: i32 = 40; const FOOTER_HEIGHT: i32 = 95; const SIDEBAR_WIDTH: i32 = 200 + 32 * 2 + 5 * 4; +const POPUP_WIDTH: i32 = 320; +const POPUP_HEIGHT: i32 = 165; + const MAX_ZOOM_IN: i32 = 3; const BOARD_MARGIN: PosInt = 3; const MAX_SPEED_POWER: u8 = 16; @@ -166,7 +170,7 @@ impl Editor { } fn pos_to_screen(&self, pos: Vector2) -> Vector2 { - pos * (16 << self.zoom) as f32 + self.view_offset + pos * (TILE_TEXTURE_SIZE << self.zoom) as f32 + self.view_offset } fn start_sim(&mut self) { @@ -234,7 +238,7 @@ impl Editor { } pub fn center_view(&mut self, d: &RaylibHandle) { - let tile_size = (16 << self.zoom) as f32; + let tile_size = (TILE_TEXTURE_SIZE << self.zoom) as f32; let tile_x = self.source_board.width() as f32 / 2. * tile_size; let tile_y = self.source_board.height() as f32 / 2. * tile_size; let screen_x = d.get_screen_width() as f32 / 2.; @@ -244,11 +248,11 @@ impl Editor { } fn change_zoom_level(&mut self, d: &RaylibHandle, delta: i32) { - let tile_size = (16 << self.zoom) as f32; + let tile_size = (TILE_TEXTURE_SIZE << self.zoom) as f32; let mouse_pos = d.get_mouse_position(); let tile_pos_of_mouse = (mouse_pos - self.view_offset) / tile_size; self.zoom += delta; - let tile_size = (16 << self.zoom) as f32; + let tile_size = (TILE_TEXTURE_SIZE << self.zoom) as f32; self.view_offset = mouse_pos - tile_pos_of_mouse * tile_size; self.view_offset.x = self.view_offset.x.floor(); self.view_offset.y = self.view_offset.y.floor(); @@ -288,7 +292,7 @@ impl Editor { } fn grow_board_and_update_view(&mut self, pos: &mut Pos) { - let tile_size = (16 << self.zoom) as f32; + let tile_size = (TILE_TEXTURE_SIZE << self.zoom) as f32; let (x, y) = self.source_board.grow_to_include(*pos); if x != 0 || y != 0 { self.view_offset.x -= x as f32 * tile_size; @@ -315,7 +319,7 @@ impl Editor { } fn set_tile(&mut self, mut pos: Pos, tile: Tile) { - let tile_size = (16 << self.zoom) as f32; + let tile_size = (TILE_TEXTURE_SIZE << self.zoom) as f32; pos.x -= BOARD_MARGIN; pos.y -= BOARD_MARGIN; self.grow_board_and_update_view(&mut pos); @@ -443,7 +447,7 @@ impl Editor { d.clear_background(Color::new(64, 64, 64, 255)); if self.draw_overlay { - let tile_size = (16 << self.zoom) as f32; + let tile_size = (TILE_TEXTURE_SIZE << self.zoom) as f32; let grid_spill_x = (self.view_offset.x).rem(tile_size) - tile_size; let grid_spill_y = (self.view_offset.y).rem(tile_size) - tile_size; d.gui_grid( @@ -517,48 +521,41 @@ impl Editor { } } - if self.popup == EndPopup::Success { - let width = 320; - let height = 165; - let x = d.get_screen_width() / 2 - width / 2; - let y = d.get_screen_height() / 2 - height / 2; - d.draw_rectangle(x, y, width, height, BG_DARK); - d.draw_text("Level Complete!", x + 45, y + 10, 30, Color::LIME); - if let Some(score) = &self.score { - d.draw_text("cycles", x + 15, y + 45, 20, Color::WHITE); - draw_usize(d, textures, score.cycles, x + 10, y + 70, 9, 2); - d.draw_text("tiles", x + 215, y + 45, 20, Color::WHITE); - draw_usize(d, textures, score.tiles, x + 210, y + 70, 5, 2); - } - if simple_button(d, x + 10, y + 110, 140, 45) { - self.popup = EndPopup::Dismissed; - } - d.draw_text("continue\nediting", x + 15, y + 115, 20, Color::WHITE); + if matches!(self.popup, EndPopup::Success | EndPopup::Failure) { + let x = d.get_screen_width() / 2 - POPUP_WIDTH / 2; + let y = d.get_screen_height() / 2 - POPUP_HEIGHT / 2; + d.draw_rectangle(x, y, POPUP_WIDTH, POPUP_HEIGHT, BG_DARK); + if self.popup == EndPopup::Success { + d.draw_text("Level Complete!", x + 45, y + 10, 30, Color::LIME); + if let Some(score) = &self.score { + d.draw_text("cycles", x + 15, y + 45, 20, Color::WHITE); + draw_usize(d, textures, score.cycles, x + 10, y + 70, 9, 2); + d.draw_text("tiles", x + 215, y + 45, 20, Color::WHITE); + draw_usize(d, textures, score.tiles, x + 210, y + 70, 5, 2); + } + if simple_button(d, x + 10, y + 110, 140, 45) { + self.popup = EndPopup::Dismissed; + } + d.draw_text("continue\nediting", x + 15, y + 115, 20, Color::WHITE); - if simple_button(d, x + width / 2 + 5, y + 110, 140, 45) { - self.exit_state = ExitState::ExitAndSave; + if simple_button(d, x + POPUP_WIDTH / 2 + 5, y + 110, 140, 45) { + self.exit_state = ExitState::ExitAndSave; + } + d.draw_text( + "return to\nlevel list", + x + POPUP_WIDTH / 2 + 10, + y + 115, + 20, + Color::WHITE, + ); + } else { + d.draw_text("Level Failed!", x + 45, y + 10, 30, Color::RED); + d.draw_text("incorrect output", x + 45, y + 45, 20, Color::WHITE); + if simple_button(d, x + 10, y + 110, 300, 25) { + self.popup = EndPopup::Dismissed; + } + d.draw_text("ok :(", x + 15, y + 115, 20, Color::WHITE); } - d.draw_text( - "return to\nlevel list", - x + width / 2 + 10, - y + 115, - 20, - Color::WHITE, - ); - } - - if self.popup == EndPopup::Failure { - let width = 320; - let height = 165; - let x = d.get_screen_width() / 2 - width / 2; - let y = d.get_screen_height() / 2 - height / 2; - d.draw_rectangle(x, y, width, height, BG_DARK); - d.draw_text("Level Failed!", x + 45, y + 10, 30, Color::RED); - d.draw_text("incorrect output", x + 45, y + 45, 20, Color::WHITE); - if simple_button(d, x + 10, y + 110, 300, 25) { - self.popup = EndPopup::Dismissed; - } - d.draw_text("ok :(", x + 15, y + 115, 20, Color::WHITE); } } @@ -904,7 +901,7 @@ impl Editor { let mouse_pos = d.get_mouse_position(); let scroll_delta = d.get_mouse_wheel_move(); let tile_scale = (1 << self.zoom) as f32; - let tile_size = 16 << self.zoom; + let tile_size = TILE_TEXTURE_SIZE << self.zoom; if self.sim_state == SimState::Editing { if let Some(board) = &self.pasting_board { if d.is_key_pressed(KeyboardKey::KEY_ESCAPE) { From 9d54c17dcd1f96069a210cf91c8f19dc60eb8778 Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Tue, 10 Dec 2024 22:18:09 +0100 Subject: [PATCH 2/3] zoom out further --- src/editor.rs | 51 +++++++++++++++++++------------------- src/main.rs | 2 ++ src/marble_engine.rs | 7 +++--- src/marble_engine/board.rs | 6 ++--- 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/editor.rs b/src/editor.rs index f4ad52b..aa62f90 100644 --- a/src/editor.rs +++ b/src/editor.rs @@ -21,17 +21,17 @@ use crate::{ solution::{Score, Solution}, text_input, texture_option_button, theme::*, - userdata_dir, Scroll, Textures, + userdata_dir, Scroll, Textures, TILE_TEXTURE_SIZE, }; -const TILE_TEXTURE_SIZE: usize = 16; const HEADER_HEIGHT: i32 = 40; const FOOTER_HEIGHT: i32 = 95; const SIDEBAR_WIDTH: i32 = 200 + 32 * 2 + 5 * 4; const POPUP_WIDTH: i32 = 320; const POPUP_HEIGHT: i32 = 165; -const MAX_ZOOM_IN: i32 = 3; +const MAX_ZOOM: f32 = 8.; +const MIN_ZOOM: f32 = 0.25; const BOARD_MARGIN: PosInt = 3; const MAX_SPEED_POWER: u8 = 16; const SPEED_DIGITS: u8 = 5; @@ -44,7 +44,7 @@ pub struct Editor { machine: Machine, sim_state: SimState, view_offset: Vector2, - zoom: i32, + zoom: f32, output_as_text: bool, input_as_text: bool, active_tool: Tool, @@ -123,7 +123,7 @@ impl Editor { machine: Machine::new_empty(level.inputs().to_owned(), 1), sim_state: SimState::Editing, view_offset: Vector2::zero(), - zoom: 1, + zoom: 1., active_tool: Tool::None, output_as_text: level.output_is_text(), input_as_text: level.input_is_text(), @@ -170,7 +170,7 @@ impl Editor { } fn pos_to_screen(&self, pos: Vector2) -> Vector2 { - pos * (TILE_TEXTURE_SIZE << self.zoom) as f32 + self.view_offset + pos * (TILE_TEXTURE_SIZE * self.zoom) as f32 + self.view_offset } fn start_sim(&mut self) { @@ -238,7 +238,7 @@ impl Editor { } pub fn center_view(&mut self, d: &RaylibHandle) { - let tile_size = (TILE_TEXTURE_SIZE << self.zoom) as f32; + let tile_size = (TILE_TEXTURE_SIZE * self.zoom) as f32; let tile_x = self.source_board.width() as f32 / 2. * tile_size; let tile_y = self.source_board.height() as f32 / 2. * tile_size; let screen_x = d.get_screen_width() as f32 / 2.; @@ -247,26 +247,26 @@ impl Editor { self.view_offset.y = (screen_y - tile_y).floor(); } - fn change_zoom_level(&mut self, d: &RaylibHandle, delta: i32) { - let tile_size = (TILE_TEXTURE_SIZE << self.zoom) as f32; + fn change_zoom_level(&mut self, d: &RaylibHandle, delta: f32) { + let tile_size = (TILE_TEXTURE_SIZE * self.zoom) as f32; let mouse_pos = d.get_mouse_position(); let tile_pos_of_mouse = (mouse_pos - self.view_offset) / tile_size; self.zoom += delta; - let tile_size = (TILE_TEXTURE_SIZE << self.zoom) as f32; + let tile_size = (TILE_TEXTURE_SIZE * self.zoom) as f32; self.view_offset = mouse_pos - tile_pos_of_mouse * tile_size; self.view_offset.x = self.view_offset.x.floor(); self.view_offset.y = self.view_offset.y.floor(); } fn zoom_in(&mut self, d: &RaylibHandle) { - if self.zoom < MAX_ZOOM_IN { - self.change_zoom_level(d, 1); + if self.zoom < MAX_ZOOM { + self.change_zoom_level(d, self.zoom); } } fn zoom_out(&mut self, d: &RaylibHandle) { - if self.zoom > 0 { - self.change_zoom_level(d, -1); + if self.zoom > MIN_ZOOM { + self.change_zoom_level(d, self.zoom / -2.); } } @@ -292,7 +292,7 @@ impl Editor { } fn grow_board_and_update_view(&mut self, pos: &mut Pos) { - let tile_size = (TILE_TEXTURE_SIZE << self.zoom) as f32; + let tile_size = (TILE_TEXTURE_SIZE * self.zoom) as f32; let (x, y) = self.source_board.grow_to_include(*pos); if x != 0 || y != 0 { self.view_offset.x -= x as f32 * tile_size; @@ -319,7 +319,7 @@ impl Editor { } fn set_tile(&mut self, mut pos: Pos, tile: Tile) { - let tile_size = (TILE_TEXTURE_SIZE << self.zoom) as f32; + let tile_size = (TILE_TEXTURE_SIZE * self.zoom) as f32; pos.x -= BOARD_MARGIN; pos.y -= BOARD_MARGIN; self.grow_board_and_update_view(&mut pos); @@ -446,8 +446,8 @@ impl Editor { pub fn draw(&mut self, d: &mut RaylibDrawHandle, textures: &Textures) { d.clear_background(Color::new(64, 64, 64, 255)); - if self.draw_overlay { - let tile_size = (TILE_TEXTURE_SIZE << self.zoom) as f32; + if self.draw_overlay && self.zoom >= 1. { + let tile_size = (TILE_TEXTURE_SIZE * self.zoom) as f32; let grid_spill_x = (self.view_offset.x).rem(tile_size) - tile_size; let grid_spill_y = (self.view_offset.y).rem(tile_size) - tile_size; d.gui_grid( @@ -900,8 +900,7 @@ impl Editor { let footer_top = (d.get_screen_height() - FOOTER_HEIGHT) as f32; let mouse_pos = d.get_mouse_position(); let scroll_delta = d.get_mouse_wheel_move(); - let tile_scale = (1 << self.zoom) as f32; - let tile_size = TILE_TEXTURE_SIZE << self.zoom; + let tile_size = TILE_TEXTURE_SIZE * self.zoom; if self.sim_state == SimState::Editing { if let Some(board) = &self.pasting_board { if d.is_key_pressed(KeyboardKey::KEY_ESCAPE) { @@ -939,7 +938,7 @@ impl Editor { textures.get("selection"), tile_screen_pos, 0., - tile_scale, + self.zoom, Color::new(255, 180, 20, 255), ); if d.is_key_pressed(KeyboardKey::KEY_LEFT) { @@ -992,7 +991,7 @@ impl Editor { textures.get(&tex), tile_screen_pos, 0., - tile_scale, + self.zoom, Color::new(255, 255, 255, 100), ); } @@ -1090,13 +1089,13 @@ impl Editor { let p_min = self.pos_to_screen(min.to_vec()); let p_max = self.pos_to_screen(max.to_vec()); let tex = textures.get("area_corner"); - d.draw_texture_ex(tex, p_min, 0., tile_scale, Color::WHITE); + d.draw_texture_ex(tex, p_min, 0., self.zoom, Color::WHITE); let one_xy = Vector2::new(tile_size as f32, tile_size as f32); - d.draw_texture_ex(tex, p_max + one_xy, 180., tile_scale, Color::WHITE); + d.draw_texture_ex(tex, p_max + one_xy, 180., self.zoom, Color::WHITE); let top_right = Vector2::new(p_max.x + tile_size as f32, p_min.y); - d.draw_texture_ex(tex, top_right, 90., tile_scale, Color::WHITE); + d.draw_texture_ex(tex, top_right, 90., self.zoom, Color::WHITE); let bot_left = Vector2::new(p_min.x, p_max.y + tile_size as f32); - d.draw_texture_ex(tex, bot_left, -90., tile_scale, Color::WHITE); + d.draw_texture_ex(tex, bot_left, -90., self.zoom, Color::WHITE); } } } diff --git a/src/main.rs b/src/main.rs index 0b6fb44..4fb7834 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,6 +21,8 @@ use util::*; const TITLE_TEXT: &str = concat!("Marble Machinations v", env!("CARGO_PKG_VERSION")); +pub const TILE_TEXTURE_SIZE: f32 = 16.0; + struct Game { levels: Vec, level_scroll: usize, diff --git a/src/marble_engine.rs b/src/marble_engine.rs index 502af92..25fc1e1 100644 --- a/src/marble_engine.rs +++ b/src/marble_engine.rs @@ -7,7 +7,7 @@ use board::Board; use pos::*; use tile::*; -use crate::{draw_usize_small, Textures}; +use crate::{draw_usize_small, Textures, TILE_TEXTURE_SIZE}; #[derive(Debug)] pub struct Machine { @@ -76,10 +76,9 @@ impl Machine { d: &mut RaylibDrawHandle, textures: &Textures, offset: Vector2, - zoom: i32, + scale: f32, ) { - let tile_size = 16 << zoom; - let scale = (1 << zoom) as f32; + let tile_size = (TILE_TEXTURE_SIZE * scale) as i32; for marble in &self.marbles { let x = marble.x; let y = marble.y; diff --git a/src/marble_engine/board.rs b/src/marble_engine/board.rs index af8664d..757b65c 100644 --- a/src/marble_engine/board.rs +++ b/src/marble_engine/board.rs @@ -1,3 +1,4 @@ +use crate::TILE_TEXTURE_SIZE; use crate::{draw_scaled_texture, Textures}; use super::tile::*; @@ -245,9 +246,8 @@ impl Board { out } - pub fn draw(&self, d: &mut RaylibDrawHandle, textures: &Textures, offset: Vector2, zoom: i32) { - let tile_size = 16 << zoom; - let scale = (1 << zoom) as f32; + pub fn draw(&self, d: &mut RaylibDrawHandle, textures: &Textures, offset: Vector2, scale: f32) { + let tile_size = (TILE_TEXTURE_SIZE * scale) as i32; let start_x = (-offset.x as i32) / tile_size - 1; let tile_width = d.get_screen_width() / tile_size + 2; From 6dcb6c9dd7dba1d24a33bb4a7417c94fadce66c9 Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Tue, 10 Dec 2024 23:11:27 +0100 Subject: [PATCH 3/3] draw selection bounds independently of zoom --- assets/area_corner.png | Bin 105 -> 0 bytes assets/area_full.png | Bin 122 -> 99 bytes src/editor.rs | 22 ++++++++++------------ 3 files changed, 10 insertions(+), 12 deletions(-) delete mode 100644 assets/area_corner.png diff --git a/assets/area_corner.png b/assets/area_corner.png deleted file mode 100644 index 15150fc010fb4744dd6f547b820ec5ba852acf8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`2A(dCAr`&KfBygfU(e>naE2j= z?Qc6%6I;L&F0Z`@TsogQrZA{JblAx4mYf(N!N8zbss7=GLAVT1FN3G6pUXO@geCy8 Cd>}%WV$qxY=l}oz^=w`Ys%#*Zy|C*xV*`U8DTAy7D;Nb1cx0BbF>JLL V;N@7gyO9A1JYD@<);T3K0RX}x8K?jN delta 91 zcmYeUnxGQq=;`7ZV$qxY=l}oz^=w`YXBcwW{>TvAH)Cv diff --git a/src/editor.rs b/src/editor.rs index aa62f90..a483f94 100644 --- a/src/editor.rs +++ b/src/editor.rs @@ -1084,18 +1084,16 @@ impl Editor { is_selecting: _, }) = self.active_tool { - let min = start.min(end); - let max = start.max(end); - let p_min = self.pos_to_screen(min.to_vec()); - let p_max = self.pos_to_screen(max.to_vec()); - let tex = textures.get("area_corner"); - d.draw_texture_ex(tex, p_min, 0., self.zoom, Color::WHITE); - let one_xy = Vector2::new(tile_size as f32, tile_size as f32); - d.draw_texture_ex(tex, p_max + one_xy, 180., self.zoom, Color::WHITE); - let top_right = Vector2::new(p_max.x + tile_size as f32, p_min.y); - d.draw_texture_ex(tex, top_right, 90., self.zoom, Color::WHITE); - let bot_left = Vector2::new(p_min.x, p_max.y + tile_size as f32); - d.draw_texture_ex(tex, bot_left, -90., self.zoom, Color::WHITE); + let p_min = self.pos_to_screen(start.min(end).to_vec()); + let p_max = self.pos_to_screen((start.max(end) + (1, 1).into()).to_vec()); + let x = p_min.x as i32; + let y = p_min.y as i32; + let width = p_max.x as i32 - x; + let height = p_max.y as i32 - y; + d.draw_rectangle(x, y, width, 4, Color::WHITE); + d.draw_rectangle(x, y + height - 4, width, 4, Color::WHITE); + d.draw_rectangle(x, y, 4, height, Color::WHITE); + d.draw_rectangle(x + width - 4, y, 4, height, Color::WHITE); } } }