use core::range::Range; use crate::{Config, Input, sim::board::Board}; pub fn create_compute_combined_overlay_offset( board: &Board, config: &Config, input: &Input, ) -> impl Fn(i32, i32) -> (u8, u8, u8, u8) { // TODO fix this move? move |x: i32, y: i32| { // could allow negative offsets too let mut offset: (u8, u8, u8, u8) = (0x00, 0x00, 0x00, 0x00); // bounds // left let xl = -((board.size_x / 2 + 1) as i32); // right let xu = (board.size_x / 2 + 1) as i32; // bottom let yl = -((board.size_y / 2 + 1) as i32); // top let yu = (board.size_y / 2 + 1) as i32; if ((x == xl || x == xu) && (y <= yu && y >= yl)) || (y == yl || y == yu) && (x <= xu && x >= xl) { offset.0 = offset.0.saturating_add(0xFF); offset.1 = offset.1.saturating_add(0xFF); offset.2 = offset.2.saturating_add(0xFF); } // grid if x % 30 == 0 || y % 30 == 0 { offset.0 = offset.0.saturating_add(0x10); offset.1 = offset.1.saturating_add(0x10); offset.2 = offset.2.saturating_add(0x10); } // brush/selection if input.last_mouse_pos_on_board.is_some_and(|p| { ((x - p.0).pow(2) + (y - p.1).pow(2)) < (config.brush_radius as i32).pow(2) }) { offset.0 = offset.0.saturating_add(0x82); offset.1 = offset.1.saturating_add(0xA1); offset.2 = offset.2.saturating_add(0xAD); } return offset; } }