pub struct PrefabLibrary { /* private fields */ }Implementations§
Source§impl PrefabLibrary
impl PrefabLibrary
Sourcepub fn new() -> Self
pub fn new() -> Self
Examples found in repository?
examples/phase4_workflow.rs (line 282)
281fn create_specialized_library() -> PrefabLibrary {
282 let mut library = PrefabLibrary::new();
283
284 // Boss room (very rare, large)
285 let boss_room = PrefabData {
286 name: "boss_chamber".to_string(),
287 width: 9,
288 height: 7,
289 pattern: vec![
290 "#########".to_string(),
291 "#.......#".to_string(),
292 "#..###..#".to_string(),
293 "#..#B#..#".to_string(),
294 "#..###..#".to_string(),
295 "#.......#".to_string(),
296 "#########".to_string(),
297 ],
298 weight: 0.2,
299 tags: vec![
300 "boss".to_string(),
301 "special".to_string(),
302 "large".to_string(),
303 ],
304 legend: None,
305 };
306 library.add_prefab(terrain_forge::algorithms::Prefab::from_data(boss_room));
307
308 // Treasure room (rare)
309 let treasure_room = PrefabData {
310 name: "treasure_vault".to_string(),
311 width: 5,
312 height: 5,
313 pattern: vec![
314 "#####".to_string(),
315 "#...#".to_string(),
316 "#.T.#".to_string(),
317 "#...#".to_string(),
318 "#####".to_string(),
319 ],
320 weight: 0.8,
321 tags: vec![
322 "treasure".to_string(),
323 "special".to_string(),
324 "small".to_string(),
325 ],
326 legend: None,
327 };
328 library.add_prefab(terrain_forge::algorithms::Prefab::from_data(treasure_room));
329
330 // Secret passage (uncommon)
331 let secret_passage = PrefabData {
332 name: "secret_passage".to_string(),
333 width: 3,
334 height: 7,
335 pattern: vec![
336 "###".to_string(),
337 "#.#".to_string(),
338 "#.#".to_string(),
339 "#.#".to_string(),
340 "#.#".to_string(),
341 "#.#".to_string(),
342 "###".to_string(),
343 ],
344 weight: 1.2,
345 tags: vec!["secret".to_string(), "corridor".to_string()],
346 legend: None,
347 };
348 library.add_prefab(terrain_forge::algorithms::Prefab::from_data(secret_passage));
349
350 library
351}More examples
examples/advanced_prefabs.rs (line 194)
193fn create_sample_library() -> PrefabLibrary {
194 let mut library = PrefabLibrary::new();
195
196 // Small room (high weight)
197 let small_room = PrefabData {
198 name: "small_room".to_string(),
199 width: 5,
200 height: 5,
201 pattern: vec![
202 "#####".to_string(),
203 "#...#".to_string(),
204 "#...#".to_string(),
205 "#...#".to_string(),
206 "#####".to_string(),
207 ],
208 weight: 3.0,
209 tags: vec!["room".to_string(), "small".to_string()],
210 legend: None,
211 };
212 library.add_prefab(terrain_forge::algorithms::Prefab::from_data(small_room));
213
214 // Large room (medium weight)
215 let large_room = PrefabData {
216 name: "large_room".to_string(),
217 width: 7,
218 height: 6,
219 pattern: vec![
220 "#######".to_string(),
221 "#.....#".to_string(),
222 "#.....#".to_string(),
223 "#.....#".to_string(),
224 "#.....#".to_string(),
225 "#######".to_string(),
226 ],
227 weight: 1.5,
228 tags: vec!["room".to_string(), "large".to_string()],
229 legend: None,
230 };
231 library.add_prefab(terrain_forge::algorithms::Prefab::from_data(large_room));
232
233 // Corridor (low weight)
234 let corridor = PrefabData {
235 name: "corridor".to_string(),
236 width: 7,
237 height: 3,
238 pattern: vec![
239 "#######".to_string(),
240 ".......".to_string(),
241 "#######".to_string(),
242 ],
243 weight: 0.8,
244 tags: vec!["corridor".to_string(), "connection".to_string()],
245 legend: None,
246 };
247 library.add_prefab(terrain_forge::algorithms::Prefab::from_data(corridor));
248
249 // L-shaped room (rare)
250 let mut legend = std::collections::HashMap::new();
251 legend.insert(
252 "M".to_string(),
253 terrain_forge::algorithms::PrefabLegendEntry {
254 tile: Some("floor".to_string()),
255 marker: Some("loot_slot".to_string()),
256 mask: None,
257 },
258 );
259 let l_room = PrefabData {
260 name: "l_shaped_room".to_string(),
261 width: 6,
262 height: 6,
263 pattern: vec![
264 "######".to_string(),
265 "#....#".to_string(),
266 "#....#".to_string(),
267 "#..M##".to_string(),
268 "#..###".to_string(),
269 "######".to_string(),
270 ],
271 weight: 0.5,
272 tags: vec![
273 "room".to_string(),
274 "special".to_string(),
275 "l_shaped".to_string(),
276 ],
277 legend: Some(legend),
278 };
279 library.add_prefab(terrain_forge::algorithms::Prefab::from_data(l_room));
280
281 library
282}Sourcepub fn add_prefab(&mut self, prefab: Prefab)
pub fn add_prefab(&mut self, prefab: Prefab)
Examples found in repository?
examples/phase4_workflow.rs (line 306)
281fn create_specialized_library() -> PrefabLibrary {
282 let mut library = PrefabLibrary::new();
283
284 // Boss room (very rare, large)
285 let boss_room = PrefabData {
286 name: "boss_chamber".to_string(),
287 width: 9,
288 height: 7,
289 pattern: vec![
290 "#########".to_string(),
291 "#.......#".to_string(),
292 "#..###..#".to_string(),
293 "#..#B#..#".to_string(),
294 "#..###..#".to_string(),
295 "#.......#".to_string(),
296 "#########".to_string(),
297 ],
298 weight: 0.2,
299 tags: vec![
300 "boss".to_string(),
301 "special".to_string(),
302 "large".to_string(),
303 ],
304 legend: None,
305 };
306 library.add_prefab(terrain_forge::algorithms::Prefab::from_data(boss_room));
307
308 // Treasure room (rare)
309 let treasure_room = PrefabData {
310 name: "treasure_vault".to_string(),
311 width: 5,
312 height: 5,
313 pattern: vec![
314 "#####".to_string(),
315 "#...#".to_string(),
316 "#.T.#".to_string(),
317 "#...#".to_string(),
318 "#####".to_string(),
319 ],
320 weight: 0.8,
321 tags: vec![
322 "treasure".to_string(),
323 "special".to_string(),
324 "small".to_string(),
325 ],
326 legend: None,
327 };
328 library.add_prefab(terrain_forge::algorithms::Prefab::from_data(treasure_room));
329
330 // Secret passage (uncommon)
331 let secret_passage = PrefabData {
332 name: "secret_passage".to_string(),
333 width: 3,
334 height: 7,
335 pattern: vec![
336 "###".to_string(),
337 "#.#".to_string(),
338 "#.#".to_string(),
339 "#.#".to_string(),
340 "#.#".to_string(),
341 "#.#".to_string(),
342 "###".to_string(),
343 ],
344 weight: 1.2,
345 tags: vec!["secret".to_string(), "corridor".to_string()],
346 legend: None,
347 };
348 library.add_prefab(terrain_forge::algorithms::Prefab::from_data(secret_passage));
349
350 library
351}More examples
examples/advanced_prefabs.rs (line 212)
193fn create_sample_library() -> PrefabLibrary {
194 let mut library = PrefabLibrary::new();
195
196 // Small room (high weight)
197 let small_room = PrefabData {
198 name: "small_room".to_string(),
199 width: 5,
200 height: 5,
201 pattern: vec![
202 "#####".to_string(),
203 "#...#".to_string(),
204 "#...#".to_string(),
205 "#...#".to_string(),
206 "#####".to_string(),
207 ],
208 weight: 3.0,
209 tags: vec!["room".to_string(), "small".to_string()],
210 legend: None,
211 };
212 library.add_prefab(terrain_forge::algorithms::Prefab::from_data(small_room));
213
214 // Large room (medium weight)
215 let large_room = PrefabData {
216 name: "large_room".to_string(),
217 width: 7,
218 height: 6,
219 pattern: vec![
220 "#######".to_string(),
221 "#.....#".to_string(),
222 "#.....#".to_string(),
223 "#.....#".to_string(),
224 "#.....#".to_string(),
225 "#######".to_string(),
226 ],
227 weight: 1.5,
228 tags: vec!["room".to_string(), "large".to_string()],
229 legend: None,
230 };
231 library.add_prefab(terrain_forge::algorithms::Prefab::from_data(large_room));
232
233 // Corridor (low weight)
234 let corridor = PrefabData {
235 name: "corridor".to_string(),
236 width: 7,
237 height: 3,
238 pattern: vec![
239 "#######".to_string(),
240 ".......".to_string(),
241 "#######".to_string(),
242 ],
243 weight: 0.8,
244 tags: vec!["corridor".to_string(), "connection".to_string()],
245 legend: None,
246 };
247 library.add_prefab(terrain_forge::algorithms::Prefab::from_data(corridor));
248
249 // L-shaped room (rare)
250 let mut legend = std::collections::HashMap::new();
251 legend.insert(
252 "M".to_string(),
253 terrain_forge::algorithms::PrefabLegendEntry {
254 tile: Some("floor".to_string()),
255 marker: Some("loot_slot".to_string()),
256 mask: None,
257 },
258 );
259 let l_room = PrefabData {
260 name: "l_shaped_room".to_string(),
261 width: 6,
262 height: 6,
263 pattern: vec![
264 "######".to_string(),
265 "#....#".to_string(),
266 "#....#".to_string(),
267 "#..M##".to_string(),
268 "#..###".to_string(),
269 "######".to_string(),
270 ],
271 weight: 0.5,
272 tags: vec![
273 "room".to_string(),
274 "special".to_string(),
275 "l_shaped".to_string(),
276 ],
277 legend: Some(legend),
278 };
279 library.add_prefab(terrain_forge::algorithms::Prefab::from_data(l_room));
280
281 library
282}Sourcepub fn load_from_json<P: AsRef<Path>>(path: P) -> Result<Self, Box<dyn Error>>
pub fn load_from_json<P: AsRef<Path>>(path: P) -> Result<Self, Box<dyn Error>>
Examples found in repository?
examples/advanced_prefabs.rs (line 131)
10fn main() {
11 println!("=== Advanced Prefab System Demo ===\n");
12
13 // Step 1: Create prefab library programmatically
14 println!("1. Creating Prefab Library:");
15 let library = create_sample_library();
16
17 println!(
18 " Created library with {} prefabs:",
19 library.get_prefabs().len()
20 );
21 for prefab in library.get_prefabs() {
22 println!(
23 " - {} ({}x{}, weight: {:.1}, tags: {:?})",
24 prefab.name, prefab.width, prefab.height, prefab.weight, prefab.tags
25 );
26 }
27
28 // Step 2: Demonstrate weighted selection
29 println!("\n2. Weighted Selection Test:");
30 let mut rng = Rng::new(12345);
31 let mut selection_counts = std::collections::HashMap::new();
32
33 for _ in 0..100 {
34 if let Some(prefab) = library.select_weighted(&mut rng, None) {
35 *selection_counts.entry(prefab.name.clone()).or_insert(0) += 1;
36 }
37 }
38
39 println!(" Selection frequency (100 trials):");
40 for (name, count) in &selection_counts {
41 println!(" {}: {} times", name, count);
42 }
43
44 // Step 3: Tag-based selection
45 println!("\n3. Tag-based Selection:");
46 let room_prefabs = library.get_by_tag("room");
47 let corridor_prefabs = library.get_by_tag("corridor");
48
49 println!(" Room prefabs: {}", room_prefabs.len());
50 for prefab in &room_prefabs {
51 println!(" - {}", prefab.name);
52 }
53
54 println!(" Corridor prefabs: {}", corridor_prefabs.len());
55 for prefab in &corridor_prefabs {
56 println!(" - {}", prefab.name);
57 }
58
59 // Step 4: Transformation examples
60 println!("\n4. Prefab Transformations:");
61 if let Some(base_prefab) = library.get_prefabs().first() {
62 println!(
63 " Base prefab '{}' ({}x{}):",
64 base_prefab.name, base_prefab.width, base_prefab.height
65 );
66 print_prefab_pattern(base_prefab);
67
68 // Rotation
69 let rotated = base_prefab.rotated();
70 println!(
71 " After 90° rotation ({}x{}):",
72 rotated.width, rotated.height
73 );
74 print_prefab_pattern(&rotated);
75
76 // Horizontal mirror
77 let mirrored = base_prefab.mirrored_horizontal();
78 println!(
79 " After horizontal mirror ({}x{}):",
80 mirrored.width, mirrored.height
81 );
82 print_prefab_pattern(&mirrored);
83
84 // Combined transformation
85 let transform = PrefabTransform {
86 rotation: 1,
87 mirror_h: true,
88 mirror_v: false,
89 };
90 let transformed = transform.apply(base_prefab);
91 println!(
92 " After rotation + mirror ({}x{}):",
93 transformed.width, transformed.height
94 );
95 print_prefab_pattern(&transformed);
96 }
97
98 // Step 5: Generation with advanced prefabs
99 println!("\n5. Generation with Advanced Prefabs:");
100 let config = PrefabConfig {
101 max_prefabs: 5,
102 min_spacing: 3,
103 allow_rotation: true,
104 allow_mirroring: true,
105 weighted_selection: true,
106 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
107 tags: None,
108 };
109
110 let placer = PrefabPlacer::new(config, library.clone());
111 let mut grid = Grid::new(30, 25);
112 placer.generate(&mut grid, 54321);
113
114 let floor_count = grid.count(|t| t.is_floor());
115 println!(
116 " Generated {}x{} grid with {} floor tiles",
117 grid.width(),
118 grid.height(),
119 floor_count
120 );
121
122 print_grid(&grid);
123
124 // Step 6: JSON serialization example
125 println!("\n6. JSON Serialization:");
126 match library.save_to_json("prefab_library.json") {
127 Ok(()) => {
128 println!(" ✅ Saved library to prefab_library.json");
129
130 // Try to load it back
131 match PrefabLibrary::load_from_json("prefab_library.json") {
132 Ok(loaded_library) => {
133 println!(" ✅ Successfully loaded library back");
134 println!(" Loaded {} prefabs", loaded_library.get_prefabs().len());
135 }
136 Err(e) => println!(" ❌ Failed to load: {}", e),
137 }
138 }
139 Err(e) => println!(" ❌ Failed to save: {}", e),
140 }
141
142 // Step 7: Performance comparison
143 println!("\n7. Performance Comparison:");
144
145 // Simple generation
146 let simple_config = PrefabConfig {
147 max_prefabs: 10,
148 min_spacing: 2,
149 allow_rotation: false,
150 allow_mirroring: false,
151 weighted_selection: false,
152 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
153 tags: None,
154 };
155
156 let start = std::time::Instant::now();
157 let simple_placer = PrefabPlacer::new(simple_config, library.clone());
158 let mut simple_grid = Grid::new(40, 30);
159 simple_placer.generate(&mut simple_grid, 98765);
160 let simple_time = start.elapsed();
161
162 // Advanced generation
163 let advanced_config = PrefabConfig {
164 max_prefabs: 10,
165 min_spacing: 2,
166 allow_rotation: true,
167 allow_mirroring: true,
168 weighted_selection: true,
169 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
170 tags: None,
171 };
172
173 let start = std::time::Instant::now();
174 let advanced_placer = PrefabPlacer::new(advanced_config, library);
175 let mut advanced_grid = Grid::new(40, 30);
176 advanced_placer.generate(&mut advanced_grid, 98765);
177 let advanced_time = start.elapsed();
178
179 println!(" Simple generation: {:?}", simple_time);
180 println!(" Advanced generation: {:?}", advanced_time);
181 println!(
182 " Overhead: {:.1}x",
183 advanced_time.as_nanos() as f32 / simple_time.as_nanos() as f32
184 );
185
186 println!("\n✅ Advanced prefab system demo complete!");
187 println!(" - JSON serialization for persistent libraries");
188 println!(" - Weighted selection for balanced generation");
189 println!(" - Transformations for variety and reuse");
190 println!(" - Tag-based organization for targeted selection");
191}pub fn load_from_paths<I, P>(paths: I) -> Result<Self, Box<dyn Error>>
pub fn load_from_dir<P: AsRef<Path>>(path: P) -> Result<Self, Box<dyn Error>>
Sourcepub fn save_to_json<P: AsRef<Path>>(
&self,
path: P,
) -> Result<(), Box<dyn Error>>
pub fn save_to_json<P: AsRef<Path>>( &self, path: P, ) -> Result<(), Box<dyn Error>>
Examples found in repository?
examples/advanced_prefabs.rs (line 126)
10fn main() {
11 println!("=== Advanced Prefab System Demo ===\n");
12
13 // Step 1: Create prefab library programmatically
14 println!("1. Creating Prefab Library:");
15 let library = create_sample_library();
16
17 println!(
18 " Created library with {} prefabs:",
19 library.get_prefabs().len()
20 );
21 for prefab in library.get_prefabs() {
22 println!(
23 " - {} ({}x{}, weight: {:.1}, tags: {:?})",
24 prefab.name, prefab.width, prefab.height, prefab.weight, prefab.tags
25 );
26 }
27
28 // Step 2: Demonstrate weighted selection
29 println!("\n2. Weighted Selection Test:");
30 let mut rng = Rng::new(12345);
31 let mut selection_counts = std::collections::HashMap::new();
32
33 for _ in 0..100 {
34 if let Some(prefab) = library.select_weighted(&mut rng, None) {
35 *selection_counts.entry(prefab.name.clone()).or_insert(0) += 1;
36 }
37 }
38
39 println!(" Selection frequency (100 trials):");
40 for (name, count) in &selection_counts {
41 println!(" {}: {} times", name, count);
42 }
43
44 // Step 3: Tag-based selection
45 println!("\n3. Tag-based Selection:");
46 let room_prefabs = library.get_by_tag("room");
47 let corridor_prefabs = library.get_by_tag("corridor");
48
49 println!(" Room prefabs: {}", room_prefabs.len());
50 for prefab in &room_prefabs {
51 println!(" - {}", prefab.name);
52 }
53
54 println!(" Corridor prefabs: {}", corridor_prefabs.len());
55 for prefab in &corridor_prefabs {
56 println!(" - {}", prefab.name);
57 }
58
59 // Step 4: Transformation examples
60 println!("\n4. Prefab Transformations:");
61 if let Some(base_prefab) = library.get_prefabs().first() {
62 println!(
63 " Base prefab '{}' ({}x{}):",
64 base_prefab.name, base_prefab.width, base_prefab.height
65 );
66 print_prefab_pattern(base_prefab);
67
68 // Rotation
69 let rotated = base_prefab.rotated();
70 println!(
71 " After 90° rotation ({}x{}):",
72 rotated.width, rotated.height
73 );
74 print_prefab_pattern(&rotated);
75
76 // Horizontal mirror
77 let mirrored = base_prefab.mirrored_horizontal();
78 println!(
79 " After horizontal mirror ({}x{}):",
80 mirrored.width, mirrored.height
81 );
82 print_prefab_pattern(&mirrored);
83
84 // Combined transformation
85 let transform = PrefabTransform {
86 rotation: 1,
87 mirror_h: true,
88 mirror_v: false,
89 };
90 let transformed = transform.apply(base_prefab);
91 println!(
92 " After rotation + mirror ({}x{}):",
93 transformed.width, transformed.height
94 );
95 print_prefab_pattern(&transformed);
96 }
97
98 // Step 5: Generation with advanced prefabs
99 println!("\n5. Generation with Advanced Prefabs:");
100 let config = PrefabConfig {
101 max_prefabs: 5,
102 min_spacing: 3,
103 allow_rotation: true,
104 allow_mirroring: true,
105 weighted_selection: true,
106 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
107 tags: None,
108 };
109
110 let placer = PrefabPlacer::new(config, library.clone());
111 let mut grid = Grid::new(30, 25);
112 placer.generate(&mut grid, 54321);
113
114 let floor_count = grid.count(|t| t.is_floor());
115 println!(
116 " Generated {}x{} grid with {} floor tiles",
117 grid.width(),
118 grid.height(),
119 floor_count
120 );
121
122 print_grid(&grid);
123
124 // Step 6: JSON serialization example
125 println!("\n6. JSON Serialization:");
126 match library.save_to_json("prefab_library.json") {
127 Ok(()) => {
128 println!(" ✅ Saved library to prefab_library.json");
129
130 // Try to load it back
131 match PrefabLibrary::load_from_json("prefab_library.json") {
132 Ok(loaded_library) => {
133 println!(" ✅ Successfully loaded library back");
134 println!(" Loaded {} prefabs", loaded_library.get_prefabs().len());
135 }
136 Err(e) => println!(" ❌ Failed to load: {}", e),
137 }
138 }
139 Err(e) => println!(" ❌ Failed to save: {}", e),
140 }
141
142 // Step 7: Performance comparison
143 println!("\n7. Performance Comparison:");
144
145 // Simple generation
146 let simple_config = PrefabConfig {
147 max_prefabs: 10,
148 min_spacing: 2,
149 allow_rotation: false,
150 allow_mirroring: false,
151 weighted_selection: false,
152 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
153 tags: None,
154 };
155
156 let start = std::time::Instant::now();
157 let simple_placer = PrefabPlacer::new(simple_config, library.clone());
158 let mut simple_grid = Grid::new(40, 30);
159 simple_placer.generate(&mut simple_grid, 98765);
160 let simple_time = start.elapsed();
161
162 // Advanced generation
163 let advanced_config = PrefabConfig {
164 max_prefabs: 10,
165 min_spacing: 2,
166 allow_rotation: true,
167 allow_mirroring: true,
168 weighted_selection: true,
169 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
170 tags: None,
171 };
172
173 let start = std::time::Instant::now();
174 let advanced_placer = PrefabPlacer::new(advanced_config, library);
175 let mut advanced_grid = Grid::new(40, 30);
176 advanced_placer.generate(&mut advanced_grid, 98765);
177 let advanced_time = start.elapsed();
178
179 println!(" Simple generation: {:?}", simple_time);
180 println!(" Advanced generation: {:?}", advanced_time);
181 println!(
182 " Overhead: {:.1}x",
183 advanced_time.as_nanos() as f32 / simple_time.as_nanos() as f32
184 );
185
186 println!("\n✅ Advanced prefab system demo complete!");
187 println!(" - JSON serialization for persistent libraries");
188 println!(" - Weighted selection for balanced generation");
189 println!(" - Transformations for variety and reuse");
190 println!(" - Tag-based organization for targeted selection");
191}More examples
examples/phase4_workflow.rs (line 192)
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}Sourcepub fn get_prefabs(&self) -> &[Prefab]
pub fn get_prefabs(&self) -> &[Prefab]
Examples found in repository?
examples/advanced_prefabs.rs (line 19)
10fn main() {
11 println!("=== Advanced Prefab System Demo ===\n");
12
13 // Step 1: Create prefab library programmatically
14 println!("1. Creating Prefab Library:");
15 let library = create_sample_library();
16
17 println!(
18 " Created library with {} prefabs:",
19 library.get_prefabs().len()
20 );
21 for prefab in library.get_prefabs() {
22 println!(
23 " - {} ({}x{}, weight: {:.1}, tags: {:?})",
24 prefab.name, prefab.width, prefab.height, prefab.weight, prefab.tags
25 );
26 }
27
28 // Step 2: Demonstrate weighted selection
29 println!("\n2. Weighted Selection Test:");
30 let mut rng = Rng::new(12345);
31 let mut selection_counts = std::collections::HashMap::new();
32
33 for _ in 0..100 {
34 if let Some(prefab) = library.select_weighted(&mut rng, None) {
35 *selection_counts.entry(prefab.name.clone()).or_insert(0) += 1;
36 }
37 }
38
39 println!(" Selection frequency (100 trials):");
40 for (name, count) in &selection_counts {
41 println!(" {}: {} times", name, count);
42 }
43
44 // Step 3: Tag-based selection
45 println!("\n3. Tag-based Selection:");
46 let room_prefabs = library.get_by_tag("room");
47 let corridor_prefabs = library.get_by_tag("corridor");
48
49 println!(" Room prefabs: {}", room_prefabs.len());
50 for prefab in &room_prefabs {
51 println!(" - {}", prefab.name);
52 }
53
54 println!(" Corridor prefabs: {}", corridor_prefabs.len());
55 for prefab in &corridor_prefabs {
56 println!(" - {}", prefab.name);
57 }
58
59 // Step 4: Transformation examples
60 println!("\n4. Prefab Transformations:");
61 if let Some(base_prefab) = library.get_prefabs().first() {
62 println!(
63 " Base prefab '{}' ({}x{}):",
64 base_prefab.name, base_prefab.width, base_prefab.height
65 );
66 print_prefab_pattern(base_prefab);
67
68 // Rotation
69 let rotated = base_prefab.rotated();
70 println!(
71 " After 90° rotation ({}x{}):",
72 rotated.width, rotated.height
73 );
74 print_prefab_pattern(&rotated);
75
76 // Horizontal mirror
77 let mirrored = base_prefab.mirrored_horizontal();
78 println!(
79 " After horizontal mirror ({}x{}):",
80 mirrored.width, mirrored.height
81 );
82 print_prefab_pattern(&mirrored);
83
84 // Combined transformation
85 let transform = PrefabTransform {
86 rotation: 1,
87 mirror_h: true,
88 mirror_v: false,
89 };
90 let transformed = transform.apply(base_prefab);
91 println!(
92 " After rotation + mirror ({}x{}):",
93 transformed.width, transformed.height
94 );
95 print_prefab_pattern(&transformed);
96 }
97
98 // Step 5: Generation with advanced prefabs
99 println!("\n5. Generation with Advanced Prefabs:");
100 let config = PrefabConfig {
101 max_prefabs: 5,
102 min_spacing: 3,
103 allow_rotation: true,
104 allow_mirroring: true,
105 weighted_selection: true,
106 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
107 tags: None,
108 };
109
110 let placer = PrefabPlacer::new(config, library.clone());
111 let mut grid = Grid::new(30, 25);
112 placer.generate(&mut grid, 54321);
113
114 let floor_count = grid.count(|t| t.is_floor());
115 println!(
116 " Generated {}x{} grid with {} floor tiles",
117 grid.width(),
118 grid.height(),
119 floor_count
120 );
121
122 print_grid(&grid);
123
124 // Step 6: JSON serialization example
125 println!("\n6. JSON Serialization:");
126 match library.save_to_json("prefab_library.json") {
127 Ok(()) => {
128 println!(" ✅ Saved library to prefab_library.json");
129
130 // Try to load it back
131 match PrefabLibrary::load_from_json("prefab_library.json") {
132 Ok(loaded_library) => {
133 println!(" ✅ Successfully loaded library back");
134 println!(" Loaded {} prefabs", loaded_library.get_prefabs().len());
135 }
136 Err(e) => println!(" ❌ Failed to load: {}", e),
137 }
138 }
139 Err(e) => println!(" ❌ Failed to save: {}", e),
140 }
141
142 // Step 7: Performance comparison
143 println!("\n7. Performance Comparison:");
144
145 // Simple generation
146 let simple_config = PrefabConfig {
147 max_prefabs: 10,
148 min_spacing: 2,
149 allow_rotation: false,
150 allow_mirroring: false,
151 weighted_selection: false,
152 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
153 tags: None,
154 };
155
156 let start = std::time::Instant::now();
157 let simple_placer = PrefabPlacer::new(simple_config, library.clone());
158 let mut simple_grid = Grid::new(40, 30);
159 simple_placer.generate(&mut simple_grid, 98765);
160 let simple_time = start.elapsed();
161
162 // Advanced generation
163 let advanced_config = PrefabConfig {
164 max_prefabs: 10,
165 min_spacing: 2,
166 allow_rotation: true,
167 allow_mirroring: true,
168 weighted_selection: true,
169 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
170 tags: None,
171 };
172
173 let start = std::time::Instant::now();
174 let advanced_placer = PrefabPlacer::new(advanced_config, library);
175 let mut advanced_grid = Grid::new(40, 30);
176 advanced_placer.generate(&mut advanced_grid, 98765);
177 let advanced_time = start.elapsed();
178
179 println!(" Simple generation: {:?}", simple_time);
180 println!(" Advanced generation: {:?}", advanced_time);
181 println!(
182 " Overhead: {:.1}x",
183 advanced_time.as_nanos() as f32 / simple_time.as_nanos() as f32
184 );
185
186 println!("\n✅ Advanced prefab system demo complete!");
187 println!(" - JSON serialization for persistent libraries");
188 println!(" - Weighted selection for balanced generation");
189 println!(" - Transformations for variety and reuse");
190 println!(" - Tag-based organization for targeted selection");
191}More examples
examples/phase4_workflow.rs (line 97)
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}pub fn extend_from(&mut self, other: PrefabLibrary)
Sourcepub fn get_by_tag(&self, tag: &str) -> Vec<&Prefab>
pub fn get_by_tag(&self, tag: &str) -> Vec<&Prefab>
Examples found in repository?
examples/advanced_prefabs.rs (line 46)
10fn main() {
11 println!("=== Advanced Prefab System Demo ===\n");
12
13 // Step 1: Create prefab library programmatically
14 println!("1. Creating Prefab Library:");
15 let library = create_sample_library();
16
17 println!(
18 " Created library with {} prefabs:",
19 library.get_prefabs().len()
20 );
21 for prefab in library.get_prefabs() {
22 println!(
23 " - {} ({}x{}, weight: {:.1}, tags: {:?})",
24 prefab.name, prefab.width, prefab.height, prefab.weight, prefab.tags
25 );
26 }
27
28 // Step 2: Demonstrate weighted selection
29 println!("\n2. Weighted Selection Test:");
30 let mut rng = Rng::new(12345);
31 let mut selection_counts = std::collections::HashMap::new();
32
33 for _ in 0..100 {
34 if let Some(prefab) = library.select_weighted(&mut rng, None) {
35 *selection_counts.entry(prefab.name.clone()).or_insert(0) += 1;
36 }
37 }
38
39 println!(" Selection frequency (100 trials):");
40 for (name, count) in &selection_counts {
41 println!(" {}: {} times", name, count);
42 }
43
44 // Step 3: Tag-based selection
45 println!("\n3. Tag-based Selection:");
46 let room_prefabs = library.get_by_tag("room");
47 let corridor_prefabs = library.get_by_tag("corridor");
48
49 println!(" Room prefabs: {}", room_prefabs.len());
50 for prefab in &room_prefabs {
51 println!(" - {}", prefab.name);
52 }
53
54 println!(" Corridor prefabs: {}", corridor_prefabs.len());
55 for prefab in &corridor_prefabs {
56 println!(" - {}", prefab.name);
57 }
58
59 // Step 4: Transformation examples
60 println!("\n4. Prefab Transformations:");
61 if let Some(base_prefab) = library.get_prefabs().first() {
62 println!(
63 " Base prefab '{}' ({}x{}):",
64 base_prefab.name, base_prefab.width, base_prefab.height
65 );
66 print_prefab_pattern(base_prefab);
67
68 // Rotation
69 let rotated = base_prefab.rotated();
70 println!(
71 " After 90° rotation ({}x{}):",
72 rotated.width, rotated.height
73 );
74 print_prefab_pattern(&rotated);
75
76 // Horizontal mirror
77 let mirrored = base_prefab.mirrored_horizontal();
78 println!(
79 " After horizontal mirror ({}x{}):",
80 mirrored.width, mirrored.height
81 );
82 print_prefab_pattern(&mirrored);
83
84 // Combined transformation
85 let transform = PrefabTransform {
86 rotation: 1,
87 mirror_h: true,
88 mirror_v: false,
89 };
90 let transformed = transform.apply(base_prefab);
91 println!(
92 " After rotation + mirror ({}x{}):",
93 transformed.width, transformed.height
94 );
95 print_prefab_pattern(&transformed);
96 }
97
98 // Step 5: Generation with advanced prefabs
99 println!("\n5. Generation with Advanced Prefabs:");
100 let config = PrefabConfig {
101 max_prefabs: 5,
102 min_spacing: 3,
103 allow_rotation: true,
104 allow_mirroring: true,
105 weighted_selection: true,
106 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
107 tags: None,
108 };
109
110 let placer = PrefabPlacer::new(config, library.clone());
111 let mut grid = Grid::new(30, 25);
112 placer.generate(&mut grid, 54321);
113
114 let floor_count = grid.count(|t| t.is_floor());
115 println!(
116 " Generated {}x{} grid with {} floor tiles",
117 grid.width(),
118 grid.height(),
119 floor_count
120 );
121
122 print_grid(&grid);
123
124 // Step 6: JSON serialization example
125 println!("\n6. JSON Serialization:");
126 match library.save_to_json("prefab_library.json") {
127 Ok(()) => {
128 println!(" ✅ Saved library to prefab_library.json");
129
130 // Try to load it back
131 match PrefabLibrary::load_from_json("prefab_library.json") {
132 Ok(loaded_library) => {
133 println!(" ✅ Successfully loaded library back");
134 println!(" Loaded {} prefabs", loaded_library.get_prefabs().len());
135 }
136 Err(e) => println!(" ❌ Failed to load: {}", e),
137 }
138 }
139 Err(e) => println!(" ❌ Failed to save: {}", e),
140 }
141
142 // Step 7: Performance comparison
143 println!("\n7. Performance Comparison:");
144
145 // Simple generation
146 let simple_config = PrefabConfig {
147 max_prefabs: 10,
148 min_spacing: 2,
149 allow_rotation: false,
150 allow_mirroring: false,
151 weighted_selection: false,
152 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
153 tags: None,
154 };
155
156 let start = std::time::Instant::now();
157 let simple_placer = PrefabPlacer::new(simple_config, library.clone());
158 let mut simple_grid = Grid::new(40, 30);
159 simple_placer.generate(&mut simple_grid, 98765);
160 let simple_time = start.elapsed();
161
162 // Advanced generation
163 let advanced_config = PrefabConfig {
164 max_prefabs: 10,
165 min_spacing: 2,
166 allow_rotation: true,
167 allow_mirroring: true,
168 weighted_selection: true,
169 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
170 tags: None,
171 };
172
173 let start = std::time::Instant::now();
174 let advanced_placer = PrefabPlacer::new(advanced_config, library);
175 let mut advanced_grid = Grid::new(40, 30);
176 advanced_placer.generate(&mut advanced_grid, 98765);
177 let advanced_time = start.elapsed();
178
179 println!(" Simple generation: {:?}", simple_time);
180 println!(" Advanced generation: {:?}", advanced_time);
181 println!(
182 " Overhead: {:.1}x",
183 advanced_time.as_nanos() as f32 / simple_time.as_nanos() as f32
184 );
185
186 println!("\n✅ Advanced prefab system demo complete!");
187 println!(" - JSON serialization for persistent libraries");
188 println!(" - Weighted selection for balanced generation");
189 println!(" - Transformations for variety and reuse");
190 println!(" - Tag-based organization for targeted selection");
191}Sourcepub fn select_weighted(
&self,
rng: &mut Rng,
tag: Option<&str>,
) -> Option<&Prefab>
pub fn select_weighted( &self, rng: &mut Rng, tag: Option<&str>, ) -> Option<&Prefab>
Examples found in repository?
examples/advanced_prefabs.rs (line 34)
10fn main() {
11 println!("=== Advanced Prefab System Demo ===\n");
12
13 // Step 1: Create prefab library programmatically
14 println!("1. Creating Prefab Library:");
15 let library = create_sample_library();
16
17 println!(
18 " Created library with {} prefabs:",
19 library.get_prefabs().len()
20 );
21 for prefab in library.get_prefabs() {
22 println!(
23 " - {} ({}x{}, weight: {:.1}, tags: {:?})",
24 prefab.name, prefab.width, prefab.height, prefab.weight, prefab.tags
25 );
26 }
27
28 // Step 2: Demonstrate weighted selection
29 println!("\n2. Weighted Selection Test:");
30 let mut rng = Rng::new(12345);
31 let mut selection_counts = std::collections::HashMap::new();
32
33 for _ in 0..100 {
34 if let Some(prefab) = library.select_weighted(&mut rng, None) {
35 *selection_counts.entry(prefab.name.clone()).or_insert(0) += 1;
36 }
37 }
38
39 println!(" Selection frequency (100 trials):");
40 for (name, count) in &selection_counts {
41 println!(" {}: {} times", name, count);
42 }
43
44 // Step 3: Tag-based selection
45 println!("\n3. Tag-based Selection:");
46 let room_prefabs = library.get_by_tag("room");
47 let corridor_prefabs = library.get_by_tag("corridor");
48
49 println!(" Room prefabs: {}", room_prefabs.len());
50 for prefab in &room_prefabs {
51 println!(" - {}", prefab.name);
52 }
53
54 println!(" Corridor prefabs: {}", corridor_prefabs.len());
55 for prefab in &corridor_prefabs {
56 println!(" - {}", prefab.name);
57 }
58
59 // Step 4: Transformation examples
60 println!("\n4. Prefab Transformations:");
61 if let Some(base_prefab) = library.get_prefabs().first() {
62 println!(
63 " Base prefab '{}' ({}x{}):",
64 base_prefab.name, base_prefab.width, base_prefab.height
65 );
66 print_prefab_pattern(base_prefab);
67
68 // Rotation
69 let rotated = base_prefab.rotated();
70 println!(
71 " After 90° rotation ({}x{}):",
72 rotated.width, rotated.height
73 );
74 print_prefab_pattern(&rotated);
75
76 // Horizontal mirror
77 let mirrored = base_prefab.mirrored_horizontal();
78 println!(
79 " After horizontal mirror ({}x{}):",
80 mirrored.width, mirrored.height
81 );
82 print_prefab_pattern(&mirrored);
83
84 // Combined transformation
85 let transform = PrefabTransform {
86 rotation: 1,
87 mirror_h: true,
88 mirror_v: false,
89 };
90 let transformed = transform.apply(base_prefab);
91 println!(
92 " After rotation + mirror ({}x{}):",
93 transformed.width, transformed.height
94 );
95 print_prefab_pattern(&transformed);
96 }
97
98 // Step 5: Generation with advanced prefabs
99 println!("\n5. Generation with Advanced Prefabs:");
100 let config = PrefabConfig {
101 max_prefabs: 5,
102 min_spacing: 3,
103 allow_rotation: true,
104 allow_mirroring: true,
105 weighted_selection: true,
106 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
107 tags: None,
108 };
109
110 let placer = PrefabPlacer::new(config, library.clone());
111 let mut grid = Grid::new(30, 25);
112 placer.generate(&mut grid, 54321);
113
114 let floor_count = grid.count(|t| t.is_floor());
115 println!(
116 " Generated {}x{} grid with {} floor tiles",
117 grid.width(),
118 grid.height(),
119 floor_count
120 );
121
122 print_grid(&grid);
123
124 // Step 6: JSON serialization example
125 println!("\n6. JSON Serialization:");
126 match library.save_to_json("prefab_library.json") {
127 Ok(()) => {
128 println!(" ✅ Saved library to prefab_library.json");
129
130 // Try to load it back
131 match PrefabLibrary::load_from_json("prefab_library.json") {
132 Ok(loaded_library) => {
133 println!(" ✅ Successfully loaded library back");
134 println!(" Loaded {} prefabs", loaded_library.get_prefabs().len());
135 }
136 Err(e) => println!(" ❌ Failed to load: {}", e),
137 }
138 }
139 Err(e) => println!(" ❌ Failed to save: {}", e),
140 }
141
142 // Step 7: Performance comparison
143 println!("\n7. Performance Comparison:");
144
145 // Simple generation
146 let simple_config = PrefabConfig {
147 max_prefabs: 10,
148 min_spacing: 2,
149 allow_rotation: false,
150 allow_mirroring: false,
151 weighted_selection: false,
152 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
153 tags: None,
154 };
155
156 let start = std::time::Instant::now();
157 let simple_placer = PrefabPlacer::new(simple_config, library.clone());
158 let mut simple_grid = Grid::new(40, 30);
159 simple_placer.generate(&mut simple_grid, 98765);
160 let simple_time = start.elapsed();
161
162 // Advanced generation
163 let advanced_config = PrefabConfig {
164 max_prefabs: 10,
165 min_spacing: 2,
166 allow_rotation: true,
167 allow_mirroring: true,
168 weighted_selection: true,
169 placement_mode: terrain_forge::algorithms::PrefabPlacementMode::Overwrite,
170 tags: None,
171 };
172
173 let start = std::time::Instant::now();
174 let advanced_placer = PrefabPlacer::new(advanced_config, library);
175 let mut advanced_grid = Grid::new(40, 30);
176 advanced_placer.generate(&mut advanced_grid, 98765);
177 let advanced_time = start.elapsed();
178
179 println!(" Simple generation: {:?}", simple_time);
180 println!(" Advanced generation: {:?}", advanced_time);
181 println!(
182 " Overhead: {:.1}x",
183 advanced_time.as_nanos() as f32 / simple_time.as_nanos() as f32
184 );
185
186 println!("\n✅ Advanced prefab system demo complete!");
187 println!(" - JSON serialization for persistent libraries");
188 println!(" - Weighted selection for balanced generation");
189 println!(" - Transformations for variety and reuse");
190 println!(" - Tag-based organization for targeted selection");
191}pub fn get_by_any_tag(&self, tags: &[String]) -> Vec<&Prefab>
pub fn create_default() -> Self
Trait Implementations§
Source§impl Clone for PrefabLibrary
impl Clone for PrefabLibrary
Source§fn clone(&self) -> PrefabLibrary
fn clone(&self) -> PrefabLibrary
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreAuto Trait Implementations§
impl Freeze for PrefabLibrary
impl RefUnwindSafe for PrefabLibrary
impl Send for PrefabLibrary
impl Sync for PrefabLibrary
impl Unpin for PrefabLibrary
impl UnwindSafe for PrefabLibrary
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