From c31af38e80eaa9006df55470189af978acbffa16 Mon Sep 17 00:00:00 2001 From: tobi Date: Wed, 8 May 2024 18:06:00 +0200 Subject: [PATCH] Fix debug layers and ui --- src/config.rs | 4 ++-- src/generator.rs | 36 +++++++++++++++++++++++++++++------- src/gui.rs | 2 +- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/config.rs b/src/config.rs index 22974b7..fa43270 100644 --- a/src/config.rs +++ b/src/config.rs @@ -127,8 +127,8 @@ impl Default for GenerationConfig { waypoint_reached_dist: 250, inner_size_probs: vec![(3, 0.25), (5, 0.75)], outer_margin_probs: vec![(0, 0.5), (2, 0.5)], - skip_min_spacing_sqr: 18, - skip_length_bounds: (4, 15), + skip_min_spacing_sqr: 45, + skip_length_bounds: (3, 11), } } } diff --git a/src/generator.rs b/src/generator.rs index cf025e1..c7df602 100644 --- a/src/generator.rs +++ b/src/generator.rs @@ -1,5 +1,7 @@ +use std::borrow::BorrowMut; use std::{f32::consts::SQRT_2, usize}; +use clap::Parser; use std::collections::BTreeMap; use timing::Timer; @@ -40,9 +42,9 @@ impl Generator { let rnd = Random::new(seed, config); let debug_layers = BTreeMap::from([ - ("edge_bugs", DebugLayer::new(true, colors::RED, &map)), - ("corners", DebugLayer::new(true, colors::BLUE, &map)), - ("corner_ends", DebugLayer::new(true, colors::GREEN, &map)), + ("edge_bugs", DebugLayer::new(true, colors::BLUE, &map)), + ("skips", DebugLayer::new(true, colors::GREEN, &map)), + ("skips_invalid", DebugLayer::new(true, colors::RED, &map)), ]); Generator { @@ -126,7 +128,7 @@ impl Generator { /// Using a distance transform this function will fill up all empty blocks that are too far /// from the next solid/non-empty block - pub fn fill_area(&mut self, max_distance: &f32) -> Array2 { + pub fn fill_open_areas(&mut self, max_distance: &f32) -> Array2 { let grid = self.map.grid.map(|val| *val != BlockType::Empty); // euclidean distance transform @@ -373,7 +375,7 @@ impl Generator { } } - pub fn get_all_valid_skips(&mut self, length_bounds: (usize, usize), min_spacing_sqr: usize) { + pub fn generate_all_skips(&mut self, length_bounds: (usize, usize), min_spacing_sqr: usize) { // get corner candidates let corner_candidates = self.find_corners().expect("corner detection failed"); @@ -397,6 +399,7 @@ impl Generator { } // skip is valid -> invalidate all following conflicting skips + // TODO: right now skips can still cross each other let (start, end, _, _) = &skips[skip_index]; for other_index in (skip_index + 1)..skips.len() { let (other_start, other_end, _, _) = &skips[other_index]; @@ -418,6 +421,24 @@ impl Generator { self.generate_skip(start, end, shift); } } + + // set debug layer for valid skips + let debug_skips = &mut self.debug_layers.get_mut("skips").unwrap().grid; + for ((start, end, _, _), valid) in skips.iter().zip(valid_skips.iter()) { + if *valid { + debug_skips[start.as_index()] = true; + debug_skips[end.as_index()] = true; + } + } + + // set debug layer for invalid skips + let debug_skips_invalid = &mut self.debug_layers.get_mut("skips_invalid").unwrap().grid; + for ((start, end, _, _), valid) in skips.iter().zip(valid_skips.iter()) { + if !*valid { + debug_skips_invalid[start.as_index()] = true; + debug_skips_invalid[end.as_index()] = true; + } + } } pub fn print_time(timer: &Timer, message: &str) { @@ -438,10 +459,11 @@ impl Generator { .expect("start finish room generation"); Generator::print_time(&timer, "place rooms"); - self.fill_area(&config.max_distance); + self.fill_open_areas(&config.max_distance); Generator::print_time(&timer, "place obstacles"); - self.get_all_valid_skips(config.skip_length_bounds, config.skip_min_spacing_sqr); + self.generate_all_skips(config.skip_length_bounds, config.skip_min_spacing_sqr); + Generator::print_time(&timer, "generate skips"); // debug layers // let corners_grid = &mut self.debug_layers.get_mut("corners").unwrap().grid; diff --git a/src/gui.rs b/src/gui.rs index 44a6749..4419476 100644 --- a/src/gui.rs +++ b/src/gui.rs @@ -431,7 +431,7 @@ pub fn sidebar(ctx: &Context, editor: &mut Editor) { ui, &mut editor.config.skip_min_spacing_sqr, edit_usize, - "skip length bounds", + "skip min spacing sqr", true, ); }