pub struct WfcPatternExtractor;Implementations§
Source§impl WfcPatternExtractor
impl WfcPatternExtractor
Sourcepub fn extract_patterns(grid: &Grid<Tile>, pattern_size: usize) -> Vec<Pattern>
pub fn extract_patterns(grid: &Grid<Tile>, pattern_size: usize) -> Vec<Pattern>
Examples found in repository?
examples/enhanced_wfc.rs (line 23)
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}More examples
examples/phase4_workflow.rs (line 33)
14fn main() {
15 println!("=== Phase 4 Complete Workflow Demo ===\n");
16
17 // Step 1: Generate base layout with BSP
18 println!("1. Generating Base Layout:");
19 let mut base_grid = Grid::new(35, 25);
20 let bsp = Bsp::default();
21 bsp.generate(&mut base_grid, 12345);
22
23 let base_floors = base_grid.count(|t| t.is_floor());
24 println!(
25 " Generated {}x{} base layout with {} floors",
26 base_grid.width(),
27 base_grid.height(),
28 base_floors
29 );
30
31 // Step 2: Learn patterns from base layout
32 println!("\n2. Learning Patterns from Base Layout:");
33 let learned_patterns = WfcPatternExtractor::extract_patterns(&base_grid, 3);
34 println!(
35 " Extracted {} unique 3x3 patterns",
36 learned_patterns.len()
37 );
38
39 // Step 3: Generate enhanced areas with WFC
40 println!("\n3. Generating Enhanced Areas with Learned Patterns:");
41 let mut wfc_grid = Grid::new(20, 15);
42 let wfc = Wfc::new(WfcConfig {
43 floor_weight: 0.45,
44 pattern_size: 3,
45 enable_backtracking: true,
46 });
47 wfc.generate_with_patterns(&mut wfc_grid, learned_patterns.clone(), 54321);
48
49 let wfc_floors = wfc_grid.count(|t| t.is_floor());
50 println!(
51 " WFC generated {} floors with learned patterns",
52 wfc_floors
53 );
54
55 // Step 4: Find room centers for connectivity analysis
56 println!("\n4. Analyzing Room Connectivity:");
57 let room_centers = find_room_centers(&base_grid);
58 println!(" Identified {} room centers", room_centers.len());
59
60 // Step 5: Create optimal connections with Delaunay + MST
61 println!("\n5. Creating Optimal Room Connections:");
62 if room_centers.len() >= 3 {
63 let triangulation = DelaunayTriangulation::new(room_centers.clone());
64 let mst_edges = triangulation.minimum_spanning_tree();
65
66 println!(" Delaunay triangulation:");
67 println!(" Triangles: {}", triangulation.triangles.len());
68 println!(" All edges: {}", triangulation.edges.len());
69
70 println!(" Minimum spanning tree:");
71 println!(" Optimal edges: {}", mst_edges.len());
72
73 let total_length: f32 = mst_edges
74 .iter()
75 .map(|edge| edge.length(&triangulation.points))
76 .sum();
77 println!(" Total corridor length: {:.1}", total_length);
78
79 // Graph analysis
80 let graph = Graph::new(triangulation.points.clone(), mst_edges);
81 let analysis = GraphAnalysis::analyze(&graph);
82
83 println!(" Connectivity analysis:");
84 println!(" Connected: {}", analysis.is_connected);
85 println!(" Diameter: {:.1}", analysis.diameter);
86 println!(" Clustering: {:.3}", analysis.average_clustering);
87 } else {
88 println!(" Not enough rooms for connectivity analysis");
89 }
90
91 // Step 6: Create specialized prefab library
92 println!("\n6. Creating Specialized Prefab Library:");
93 let library = create_specialized_library();
94
95 println!(
96 " Created library with {} prefabs:",
97 library.get_prefabs().len()
98 );
99 for prefab in library.get_prefabs() {
100 println!(
101 " - {} (weight: {:.1}, tags: {:?})",
102 prefab.name, prefab.weight, prefab.tags
103 );
104 }
105
106 // Step 7: Place special features with advanced prefabs
107 println!("\n7. Placing Special Features:");
108 let mut feature_grid = Grid::new(30, 20);
109
110 // Place boss rooms (rare, large)
111 let boss_config = PrefabConfig {
112 max_prefabs: 1,
113 min_spacing: 8,
114 allow_rotation: false,
115 allow_mirroring: false,
116 weighted_selection: true,
117 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
118 tags: None,
119 };
120
121 let boss_placer = PrefabPlacer::new(boss_config, library.clone());
122 boss_placer.generate(&mut feature_grid, 98765);
123
124 // Place treasure rooms (medium rarity)
125 let treasure_config = PrefabConfig {
126 max_prefabs: 2,
127 min_spacing: 5,
128 allow_rotation: true,
129 allow_mirroring: true,
130 weighted_selection: true,
131 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
132 tags: None,
133 };
134
135 let treasure_placer = PrefabPlacer::new(treasure_config, library.clone());
136 treasure_placer.generate(&mut feature_grid, 13579);
137
138 let feature_floors = feature_grid.count(|t| t.is_floor());
139 println!(" Placed special features: {} floor tiles", feature_floors);
140
141 // Step 8: Performance and quality metrics
142 println!("\n8. Performance and Quality Metrics:");
143
144 // WFC performance
145 let start = std::time::Instant::now();
146 let mut perf_grid = Grid::new(25, 20);
147 wfc.generate_with_patterns(&mut perf_grid, learned_patterns.clone(), 24680);
148 let wfc_time = start.elapsed();
149
150 // Prefab performance
151 let start = std::time::Instant::now();
152 let placer = PrefabPlacer::new(PrefabConfig::default(), library.clone());
153 let mut prefab_grid = Grid::new(25, 20);
154 placer.generate(&mut prefab_grid, 24680);
155 let prefab_time = start.elapsed();
156
157 // Delaunay performance
158 let start = std::time::Instant::now();
159 let _ = DelaunayTriangulation::new(room_centers.clone());
160 let delaunay_time = start.elapsed();
161
162 println!(" Performance metrics:");
163 println!(" WFC generation: {:?}", wfc_time);
164 println!(" Prefab placement: {:?}", prefab_time);
165 println!(" Delaunay triangulation: {:?}", delaunay_time);
166
167 // Step 9: Quality comparison
168 println!("\n9. Quality Comparison:");
169
170 // Basic generation
171 let mut basic_grid = Grid::new(25, 20);
172 bsp.generate(&mut basic_grid, 11111);
173 let basic_floors = basic_grid.count(|t| t.is_floor());
174
175 // Enhanced generation (WFC + prefabs)
176 let enhanced_floors = perf_grid.count(|t| t.is_floor()) + prefab_grid.count(|t| t.is_floor());
177
178 println!(" Floor tile comparison:");
179 println!(
180 " Basic BSP: {} floors ({:.1}%)",
181 basic_floors,
182 100.0 * basic_floors as f32 / (25 * 20) as f32
183 );
184 println!(
185 " Enhanced (WFC + Prefabs): {} floors ({:.1}%)",
186 enhanced_floors,
187 100.0 * enhanced_floors as f32 / (50 * 20) as f32
188 );
189
190 // Step 10: Save configuration for reuse
191 println!("\n10. Saving Configuration:");
192 match library.save_to_json("phase4_library.json") {
193 Ok(()) => println!(" ✅ Saved prefab library to phase4_library.json"),
194 Err(e) => println!(" ❌ Failed to save library: {}", e),
195 }
196
197 println!("\n✅ Phase 4 complete workflow finished!");
198 println!(" Workflow summary:");
199 println!(" 1. Generated base layout with BSP algorithm");
200 println!(
201 " 2. Learned {} patterns for WFC enhancement",
202 learned_patterns.len()
203 );
204 println!(
205 " 3. Analyzed {} room connections with Delaunay triangulation",
206 room_centers.len()
207 );
208 println!(" 4. Placed specialized features with weighted prefab selection");
209 println!(" 5. Achieved optimal room connectivity with MST");
210 println!(" 6. Demonstrated pattern learning and constraint propagation");
211 println!(" \n Phase 4 features enable:");
212 println!(" - Intelligent pattern-based generation");
213 println!(" - Mathematically optimal room connections");
214 println!(" - Flexible, reusable prefab systems");
215 println!(" - Advanced graph analysis for level design");
216}Auto Trait Implementations§
impl Freeze for WfcPatternExtractor
impl RefUnwindSafe for WfcPatternExtractor
impl Send for WfcPatternExtractor
impl Sync for WfcPatternExtractor
impl Unpin for WfcPatternExtractor
impl UnwindSafe for WfcPatternExtractor
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more