From e2df4f4bff50adbbb97d0151a5f4508d9174ecd2 Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Sat, 29 Mar 2025 00:37:49 +0100 Subject: [PATCH 1/3] implement comment rendering and positioning after resizes --- src/board.rs | 76 +++++++++++++++++++++++++++++++++++++++++++-------- src/editor.rs | 6 +++- 2 files changed, 70 insertions(+), 12 deletions(-) diff --git a/src/board.rs b/src/board.rs index 7cfe928..a253178 100644 --- a/src/board.rs +++ b/src/board.rs @@ -1,15 +1,24 @@ +use raylib::{ + color::Color, + drawing::{RaylibDraw, RaylibDrawHandle}, + math::Vector2, +}; use serde::{Deserialize, Serialize}; -use crate::marble_engine::{ - grid::{Grid, ResizeDeltas}, - pos::Pos, - tile::Tile, +use crate::{ + marble_engine::{ + grid::{Grid, ResizeDeltas}, + pos::Pos, + tile::Tile, + }, + theme::TILE_TEXTURE_SIZE, }; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct Comment { text: String, - pos: Pos, + x: i32, + y: i32, } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] @@ -62,9 +71,28 @@ impl Board { } } + pub fn draw_comments(&self, d: &mut RaylibDrawHandle, offset: Vector2, scale: f32) { + let tile_size = (TILE_TEXTURE_SIZE * scale) as i32; + + for c in &self.comments { + let px = c.x * tile_size + offset.x as i32; + let py = c.y * tile_size + offset.y as i32; + d.draw_text(&c.text, px, py, 10 * scale as i32, Color::ORANGE); + } + } + pub fn get_rect(&self, pos: Pos, width: usize, height: usize) -> Self { - // TODO filter for comments in the area - let comments = self.comments.clone(); + let comments = self + .comments + .iter() + .filter(|c| c.in_area(pos, width, height)) + .map(|c| { + let mut c = c.clone(); + c.x -= pos.x as i32; + c.y -= pos.y as i32; + c + }) + .collect(); Self { grid: self.grid.get_rect(pos, width, height), comments, @@ -72,19 +100,36 @@ impl Board { } pub fn paste_board(&mut self, pos: Pos, board: &Board) { - // TODO remove overlapping comments self.grid.paste_grid(pos, &board.grid); - self.comments.extend_from_slice(&board.comments); + for c in &board.comments { + let mut comment = c.clone(); + comment.x += pos.x as i32; + comment.y += pos.y as i32; + self.add_comment(comment); + } + } + + pub fn add_comment(&mut self, comment: Comment) { + if self.comments.iter().any(|c| c == &comment) { + return; + } + self.comments.push(comment); } pub fn grow(&mut self, deltas: &ResizeDeltas) { self.grid.grow(deltas); - // TODO adjust comments + for c in &mut self.comments { + c.x += deltas.x_neg as i32; + c.y += deltas.y_neg as i32; + } } pub fn shrink(&mut self, deltas: &ResizeDeltas) { self.grid.shrink(deltas); - // TODO adjust comments + for c in &mut self.comments { + c.x -= deltas.x_neg as i32; + c.y -= deltas.y_neg as i32; + } } pub fn from_user_str(source: &str) -> Self { @@ -102,3 +147,12 @@ impl Board { self.grid.height() } } + +impl Comment { + fn in_area(&self, pos: Pos, width: usize, height: usize) -> bool { + self.x >= pos.x as i32 + && self.y >= pos.y as i32 + && self.x < pos.x as i32 + width as i32 + && self.y < pos.y as i32 + height as i32 + } +} diff --git a/src/editor.rs b/src/editor.rs index 21d7352..36b50da 100644 --- a/src/editor.rs +++ b/src/editor.rs @@ -553,7 +553,7 @@ impl Editor { self.pasting_board = Some(b); } } else if rl.is_key_pressed(KeyboardKey::KEY_Z) { - self.undo() + self.undo(); } else if rl.is_key_pressed(KeyboardKey::KEY_Y) { self.redo(); } @@ -584,6 +584,10 @@ impl Editor { .draw_marble_values(d, textures, self.view_offset, self.zoom); } } + if self.draw_overlay { + self.source_board + .draw_comments(d, self.view_offset, self.zoom); + } } pub fn draw(&mut self, d: &mut RaylibDrawHandle, textures: &Textures) { From cd51c4b47aa68ab39e6b13ca3647a9cfd521252c Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Sat, 29 Mar 2025 00:41:58 +0100 Subject: [PATCH 2/3] include final tick state in debug subticks --- src/marble_engine.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/marble_engine.rs b/src/marble_engine.rs index 89aad50..e18c13f 100644 --- a/src/marble_engine.rs +++ b/src/marble_engine.rs @@ -529,6 +529,10 @@ impl Machine { } #[cfg(debug_assertions)] { + self.debug_subticks.push(DebugSubTick { + grid: self.grid.clone(), + pos: None, + }); self.subtick_index = self.debug_subticks.len() - 1; } } From ae42cd10a460c4bf4bbc9599b4a10dfd8ec3ed75 Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Sat, 29 Mar 2025 00:48:14 +0100 Subject: [PATCH 3/3] fix comment line spacing, add comments to first level --- levels/chapter_01.json | 9 ++++++++- src/board.rs | 13 +++++++++---- src/editor.rs | 2 +- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/levels/chapter_01.json b/levels/chapter_01.json index 4e6c18a..81c6a2d 100644 --- a/levels/chapter_01.json +++ b/levels/chapter_01.json @@ -5,7 +5,14 @@ "id": "output", "name": "Zero", "description": "learn how to output data", - "init_board": "\n o \n\n I\n\n", + "init_board": { + "comments": [ + { "text": "Welcome :3", "x": 3, "y": 0 }, + { "text": "< This is a marble,\n it will move down when you start the machine", "x": 3, "y": 2 }, + { "text": "< This is an input/output silo\n when a marble enters it, it disappears\n and the value it held is added to the level output", "x": 3, "y": 5 } + ], + "grid": "\n\n o \n\n\n I\n\n\n" + }, "stages": [{ "input": [], "output": [0] diff --git a/src/board.rs b/src/board.rs index a253178..0017248 100644 --- a/src/board.rs +++ b/src/board.rs @@ -73,11 +73,16 @@ impl Board { pub fn draw_comments(&self, d: &mut RaylibDrawHandle, offset: Vector2, scale: f32) { let tile_size = (TILE_TEXTURE_SIZE * scale) as i32; + let font_size = 10 * (scale as i32).max(1); + let line_space = 12 * (scale as i32).max(1); - for c in &self.comments { - let px = c.x * tile_size + offset.x as i32; - let py = c.y * tile_size + offset.y as i32; - d.draw_text(&c.text, px, py, 10 * scale as i32, Color::ORANGE); + for comment in &self.comments { + let x = comment.x * tile_size + offset.x as i32; + let y = comment.y * tile_size + offset.y as i32; + for (i, line) in comment.text.lines().enumerate() { + let y = y + line_space * i as i32; + d.draw_text(&line, x, y, font_size, Color::ORANGE); + } } } diff --git a/src/editor.rs b/src/editor.rs index 36b50da..003d6b1 100644 --- a/src/editor.rs +++ b/src/editor.rs @@ -146,7 +146,7 @@ impl Editor { machine, sim_state: SimState::Editing, view_offset: Vector2::zero(), - zoom: 1., + zoom: 2., active_tool: Tool::None, output_as_text, input_as_text,