enhanced_wfc/
enhanced_wfc.rs1use terrain_forge::{
6 algorithms::{Bsp, Wfc, WfcConfig, WfcPatternExtractor},
7 Algorithm, Grid, Tile,
8};
9
10fn main() {
11 println!("=== Enhanced Wave Function Collapse Demo ===\n");
12
13 println!("1. Generating Example Map for Pattern Learning:");
15 let mut example_grid = Grid::new(20, 15);
16 let bsp = Bsp::default();
17 bsp.generate(&mut example_grid, 54321);
18
19 print_grid(&example_grid, "Example Map");
20
21 println!("\n2. Extracting Patterns from Example:");
23 let patterns = WfcPatternExtractor::extract_patterns(&example_grid, 3);
24 println!(" Extracted {} unique patterns", patterns.len());
25
26 println!("\n3. WFC Generation without Backtracking:");
28 let mut grid1 = Grid::new(25, 20);
29 let wfc_no_backtrack = Wfc::new(WfcConfig {
30 floor_weight: 0.4,
31 pattern_size: 3,
32 enable_backtracking: false,
33 });
34 wfc_no_backtrack.generate_with_patterns(&mut grid1, patterns.clone(), 12345);
35 print_grid(&grid1, "Without Backtracking");
36
37 println!("\n4. WFC Generation with Backtracking:");
39 let mut grid2 = Grid::new(25, 20);
40 let wfc_backtrack = Wfc::new(WfcConfig {
41 floor_weight: 0.4,
42 pattern_size: 3,
43 enable_backtracking: true,
44 });
45 wfc_backtrack.generate_with_patterns(&mut grid2, patterns.clone(), 12345);
46 print_grid(&grid2, "With Backtracking");
47
48 println!("\n5. Comparison:");
50 let floors1 = grid1.count(|t| t.is_floor());
51 let floors2 = grid2.count(|t| t.is_floor());
52
53 println!(
54 " Without backtracking: {} floors ({:.1}%)",
55 floors1,
56 100.0 * floors1 as f32 / (grid1.width() * grid1.height()) as f32
57 );
58 println!(
59 " With backtracking: {} floors ({:.1}%)",
60 floors2,
61 100.0 * floors2 as f32 / (grid2.width() * grid2.height()) as f32
62 );
63
64 println!("\n6. Pattern Size Comparison:");
66 for size in [2, 3, 4] {
67 let patterns = WfcPatternExtractor::extract_patterns(&example_grid, size);
68 let mut grid = Grid::new(15, 12);
69 let wfc = Wfc::new(WfcConfig {
70 floor_weight: 0.4,
71 pattern_size: size,
72 enable_backtracking: true,
73 });
74 wfc.generate_with_patterns(&mut grid, patterns.clone(), 98765);
75
76 let floors = grid.count(|t| t.is_floor());
77 println!(
78 " Pattern size {}: {} patterns, {} floors",
79 size,
80 patterns.len(),
81 floors
82 );
83 }
84
85 println!("\n✅ Enhanced WFC demo complete!");
86 println!(" - Pattern learning extracts reusable structures");
87 println!(" - Backtracking improves generation success rate");
88 println!(" - Constraint propagation ensures valid outputs");
89}
90
91fn print_grid(grid: &Grid<Tile>, title: &str) {
92 println!(" {}:", title);
93 for y in 0..grid.height().min(8) {
94 print!(" ");
95 for x in 0..grid.width() {
96 let tile = grid.get(x as i32, y as i32).unwrap();
97 print!("{}", if tile.is_floor() { "." } else { "#" });
98 }
99 println!();
100 }
101 if grid.height() > 8 {
102 println!(" ... ({} more rows)", grid.height() - 8);
103 }
104}