Skip to main content

enhanced_wfc/
enhanced_wfc.rs

1//! Enhanced Wave Function Collapse Demo
2//!
3//! Demonstrates pattern learning, backtracking, and constraint propagation
4
5use 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    // Step 1: Generate example map for pattern learning
14    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    // Step 2: Extract patterns from example
22    println!("\n2. Extracting Patterns from Example:");
23    let patterns = WfcPatternExtractor::extract_patterns(&example_grid, 3);
24    println!("   Extracted {} unique patterns", patterns.len());
25
26    // Step 3: Generate with learned patterns (no backtracking)
27    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    // Step 4: Generate with backtracking enabled
38    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    // Step 5: Compare results
49    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    // Step 6: Different pattern sizes
65    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}