17 wavefront_collapse::generator::{ |
17 wavefront_collapse::generator::{ |
18 TemplateDescription as WfcTemplate, WavefrontCollapseLandGenerator, |
18 TemplateDescription as WfcTemplate, WavefrontCollapseLandGenerator, |
19 }, |
19 }, |
20 LandGenerationParameters, LandGenerator, |
20 LandGenerationParameters, LandGenerator, |
21 }; |
21 }; |
22 use rand::{seq::SliceRandom, Rng}; |
22 use rand::Rng; |
23 |
23 |
|
24 use rand::prelude::IndexedRandom; |
24 use std::{borrow::Borrow, collections::hash_map::HashMap}; |
25 use std::{borrow::Borrow, collections::hash_map::HashMap}; |
25 use rand::prelude::IndexedRandom; |
|
26 use vec2d::Vec2D; |
26 use vec2d::Vec2D; |
27 |
27 |
28 #[derive(PartialEq, Eq, Hash, Clone, Debug)] |
28 #[derive(PartialEq, Eq, Hash, Clone, Debug)] |
29 struct TemplateType(String); |
29 struct TemplateType(String); |
30 |
30 |
66 let mut texture = Vec2D::new(&land.size().size(), 0); |
66 let mut texture = Vec2D::new(&land.size().size(), 0); |
67 |
67 |
68 if let Some(land_sprite) = theme.land_texture() { |
68 if let Some(land_sprite) = theme.land_texture() { |
69 for (row_index, (land_row, tex_row)) in land.rows().zip(texture.rows_mut()).enumerate() |
69 for (row_index, (land_row, tex_row)) in land.rows().zip(texture.rows_mut()).enumerate() |
70 { |
70 { |
71 let sprite_row = land_sprite.get_row(row_index % land_sprite.height()); |
71 let sprite_row = land_sprite.get_row(row_index % land_sprite.height() as usize); |
72 let mut x_offset = 0; |
72 let mut x_offset = 0; |
73 while sprite_row.len() < land.width() - x_offset { |
73 while sprite_row.len() < land.width() - x_offset { |
74 let copy_range = x_offset..x_offset + sprite_row.len(); |
74 let copy_range = x_offset..x_offset + sprite_row.len(); |
75 tex_row_copy( |
75 tex_row_copy( |
76 parameters.basic(), |
76 parameters.basic(), |
77 &land_row[copy_range.clone()], |
77 &land_row[copy_range.clone()], |
78 &mut tex_row[copy_range], |
78 &mut tex_row[copy_range], |
79 sprite_row, |
79 sprite_row, |
80 ); |
80 ); |
81 |
81 |
82 x_offset += land_sprite.width() |
82 x_offset += land_sprite.width() as usize |
83 } |
83 } |
84 |
84 |
85 if x_offset < land.width() { |
85 if x_offset < land.width() { |
86 let final_range = x_offset..land.width(); |
86 let final_range = x_offset..land.width(); |
87 tex_row_copy( |
87 tex_row_copy( |
105 parameters.basic(), |
105 parameters.basic(), |
106 land.rows().rev().zip(texture.rows_mut().rev()), |
106 land.rows().rev().zip(texture.rows_mut().rev()), |
107 &mut offsets, |
107 &mut offsets, |
108 border_width, |
108 border_width, |
109 |x, y| { |
109 |x, y| { |
110 border_sprite |
110 border_sprite.get_pixel( |
111 .get_pixel(x % border_sprite.width(), border_sprite.height() - 1 - y) |
111 x % border_sprite.width() as usize, |
|
112 border_sprite.height() as usize - 1 - y, |
|
113 ) |
112 }, |
114 }, |
113 ); |
115 ); |
114 |
116 |
115 offsets.iter_mut().for_each(|v| *v = 255); |
117 offsets.iter_mut().for_each(|v| *v = 255); |
116 |
118 |
117 land_border_pass( |
119 land_border_pass( |
118 parameters.basic(), |
120 parameters.basic(), |
119 land.rows().zip(texture.rows_mut()), |
121 land.rows().zip(texture.rows_mut()), |
120 &mut offsets, |
122 &mut offsets, |
121 border_width, |
123 border_width, |
122 |x, y| border_sprite.get_pixel(x % border_sprite.width(), y), |
124 |x, y| border_sprite.get_pixel(x % border_sprite.width() as usize, y), |
123 ); |
125 ); |
124 } |
126 } |
125 |
127 |
126 texture |
128 texture |
127 } |
129 } |