pub struct Grid<T: Copy> { /* private fields */ }
Implementations§
Source§impl<T: Copy> Grid<T>
impl<T: Copy> Grid<T>
pub fn new(size: Vec2<usize>, fill_value: T) -> Self
pub fn with_buffer(size: Vec2<usize>, buffer: Vec<T>) -> Option<Self>
Sourcepub fn generate(size: Vec2<usize>, generator: impl GridGenetator<T>) -> Selfwhere
T: Default,
pub fn generate(size: Vec2<usize>, generator: impl GridGenetator<T>) -> Selfwhere
T: Default,
Examples found in repository?
examples/pcg_island.rs (lines 52-55)
51 fn default() -> Self {
52 let mut height = Grid::<f64>::generate(
53 SIZE.into(),
54 NoiseGenerator::new(Fbm::<SuperSimplex>::default().set_frequency(0.025)),
55 );
56 height.apply_all(RemapGenerator {
57 from: -1.0..1.0,
58 to: 0.0..1.0,
59 });
60
61 let gradient = Grid::<f64>::generate(
62 SIZE.into(),
63 |location: Vec2<usize>, size: Vec2<usize>, _| {
64 let center = size / 2;
65 let x = if location.x >= center.x {
66 location.x - center.x
67 } else {
68 center.x - location.x
69 } as f64;
70 let y = if location.y >= center.y {
71 location.y - center.y
72 } else {
73 center.y - location.y
74 } as f64;
75 let result = (x / center.x as f64).max(y / center.y as f64);
76 result * result
77 },
78 );
79 height.apply_all(SubGenerator { other: &gradient });
80
81 let mut biome = Grid::<f64>::generate(
82 SIZE.into(),
83 NoiseGenerator::new(Fbm::<SuperSimplex>::new(42).set_frequency(0.05)),
84 );
85 biome.apply_all(RemapGenerator {
86 from: -1.0..1.0,
87 to: 0.0..1.0,
88 });
89
90 let buffer = height
91 .into_inner()
92 .1
93 .into_iter()
94 .zip(biome.into_inner().1)
95 .map(|(height, biome)| {
96 if height > 0.75 {
97 SNOW
98 } else if height > 0.6 {
99 ROCK
100 } else if height > 0.1 {
101 if biome > 0.8 {
102 SAND
103 } else if biome > 0.5 {
104 GRASS
105 } else {
106 FOREST
107 }
108 } else {
109 WATER
110 }
111 })
112 .collect();
113
114 Self {
115 world: GridWorld::new(
116 10.0.into(),
117 TileSet::default()
118 .shader(ShaderRef::name("color"))
119 .mapping(WATER, TileSetItem::default().tint(Rgba::blue()))
120 .mapping(
121 FOREST,
122 TileSetItem::default().tint(Rgba::new_opaque(0.0, 0.5, 0.0)),
123 )
124 .mapping(GRASS, TileSetItem::default().tint(Rgba::green()))
125 .mapping(
126 SAND,
127 TileSetItem::default().tint(Rgba::new_opaque(1.0, 1.0, 0.5)),
128 )
129 .mapping(ROCK, TileSetItem::default().tint(Rgba::gray(0.5)))
130 .mapping(SNOW, TileSetItem::default().tint(Rgba::white())),
131 GridWorldLayer::new(TileMap::with_buffer(SIZE.into(), buffer).unwrap()),
132 ),
133 weather_tileset: TileSet::default()
134 .shader(ShaderRef::name("color"))
135 .mapping(
136 CLEAR_SKY,
137 TileSetItem::default().tint(Rgba::new(1.0, 1.0, 1.0, 0.0)),
138 )
139 .mapping(
140 CLOUD_SKY,
141 TileSetItem::default().tint(Rgba::new(1.0, 1.0, 1.0, 0.8)),
142 )
143 .mapping(
144 RAINY_SKY,
145 TileSetItem::default().tint(Rgba::new(0.3, 0.3, 0.3, 0.8)),
146 ),
147 weather_noise: Fbm::<SuperSimplex>::default().set_frequency(0.03),
148 time: 0.0,
149 mouse_position: Default::default(),
150 }
151 }
pub fn fork(&self, fill_value: T) -> Self
pub fn fork_generate(&self, generator: impl GridGenetator<T>) -> Self
pub fn apply( &mut self, from: impl Into<Vec2<usize>>, to: impl Into<Vec2<usize>>, generator: impl GridGenetator<T>, )
Sourcepub fn apply_all(&mut self, generator: impl GridGenetator<T>)
pub fn apply_all(&mut self, generator: impl GridGenetator<T>)
Examples found in repository?
examples/pcg_island.rs (lines 56-59)
51 fn default() -> Self {
52 let mut height = Grid::<f64>::generate(
53 SIZE.into(),
54 NoiseGenerator::new(Fbm::<SuperSimplex>::default().set_frequency(0.025)),
55 );
56 height.apply_all(RemapGenerator {
57 from: -1.0..1.0,
58 to: 0.0..1.0,
59 });
60
61 let gradient = Grid::<f64>::generate(
62 SIZE.into(),
63 |location: Vec2<usize>, size: Vec2<usize>, _| {
64 let center = size / 2;
65 let x = if location.x >= center.x {
66 location.x - center.x
67 } else {
68 center.x - location.x
69 } as f64;
70 let y = if location.y >= center.y {
71 location.y - center.y
72 } else {
73 center.y - location.y
74 } as f64;
75 let result = (x / center.x as f64).max(y / center.y as f64);
76 result * result
77 },
78 );
79 height.apply_all(SubGenerator { other: &gradient });
80
81 let mut biome = Grid::<f64>::generate(
82 SIZE.into(),
83 NoiseGenerator::new(Fbm::<SuperSimplex>::new(42).set_frequency(0.05)),
84 );
85 biome.apply_all(RemapGenerator {
86 from: -1.0..1.0,
87 to: 0.0..1.0,
88 });
89
90 let buffer = height
91 .into_inner()
92 .1
93 .into_iter()
94 .zip(biome.into_inner().1)
95 .map(|(height, biome)| {
96 if height > 0.75 {
97 SNOW
98 } else if height > 0.6 {
99 ROCK
100 } else if height > 0.1 {
101 if biome > 0.8 {
102 SAND
103 } else if biome > 0.5 {
104 GRASS
105 } else {
106 FOREST
107 }
108 } else {
109 WATER
110 }
111 })
112 .collect();
113
114 Self {
115 world: GridWorld::new(
116 10.0.into(),
117 TileSet::default()
118 .shader(ShaderRef::name("color"))
119 .mapping(WATER, TileSetItem::default().tint(Rgba::blue()))
120 .mapping(
121 FOREST,
122 TileSetItem::default().tint(Rgba::new_opaque(0.0, 0.5, 0.0)),
123 )
124 .mapping(GRASS, TileSetItem::default().tint(Rgba::green()))
125 .mapping(
126 SAND,
127 TileSetItem::default().tint(Rgba::new_opaque(1.0, 1.0, 0.5)),
128 )
129 .mapping(ROCK, TileSetItem::default().tint(Rgba::gray(0.5)))
130 .mapping(SNOW, TileSetItem::default().tint(Rgba::white())),
131 GridWorldLayer::new(TileMap::with_buffer(SIZE.into(), buffer).unwrap()),
132 ),
133 weather_tileset: TileSet::default()
134 .shader(ShaderRef::name("color"))
135 .mapping(
136 CLEAR_SKY,
137 TileSetItem::default().tint(Rgba::new(1.0, 1.0, 1.0, 0.0)),
138 )
139 .mapping(
140 CLOUD_SKY,
141 TileSetItem::default().tint(Rgba::new(1.0, 1.0, 1.0, 0.8)),
142 )
143 .mapping(
144 RAINY_SKY,
145 TileSetItem::default().tint(Rgba::new(0.3, 0.3, 0.3, 0.8)),
146 ),
147 weather_noise: Fbm::<SuperSimplex>::default().set_frequency(0.03),
148 time: 0.0,
149 mouse_position: Default::default(),
150 }
151 }
pub fn map<U: Copy>( &self, f: impl FnMut(Vec2<usize>, Vec2<usize>, T) -> U, ) -> Grid<U>
Sourcepub fn into_inner(self) -> (Vec2<usize>, Vec<T>)
pub fn into_inner(self) -> (Vec2<usize>, Vec<T>)
Examples found in repository?
examples/pcg_island.rs (line 91)
51 fn default() -> Self {
52 let mut height = Grid::<f64>::generate(
53 SIZE.into(),
54 NoiseGenerator::new(Fbm::<SuperSimplex>::default().set_frequency(0.025)),
55 );
56 height.apply_all(RemapGenerator {
57 from: -1.0..1.0,
58 to: 0.0..1.0,
59 });
60
61 let gradient = Grid::<f64>::generate(
62 SIZE.into(),
63 |location: Vec2<usize>, size: Vec2<usize>, _| {
64 let center = size / 2;
65 let x = if location.x >= center.x {
66 location.x - center.x
67 } else {
68 center.x - location.x
69 } as f64;
70 let y = if location.y >= center.y {
71 location.y - center.y
72 } else {
73 center.y - location.y
74 } as f64;
75 let result = (x / center.x as f64).max(y / center.y as f64);
76 result * result
77 },
78 );
79 height.apply_all(SubGenerator { other: &gradient });
80
81 let mut biome = Grid::<f64>::generate(
82 SIZE.into(),
83 NoiseGenerator::new(Fbm::<SuperSimplex>::new(42).set_frequency(0.05)),
84 );
85 biome.apply_all(RemapGenerator {
86 from: -1.0..1.0,
87 to: 0.0..1.0,
88 });
89
90 let buffer = height
91 .into_inner()
92 .1
93 .into_iter()
94 .zip(biome.into_inner().1)
95 .map(|(height, biome)| {
96 if height > 0.75 {
97 SNOW
98 } else if height > 0.6 {
99 ROCK
100 } else if height > 0.1 {
101 if biome > 0.8 {
102 SAND
103 } else if biome > 0.5 {
104 GRASS
105 } else {
106 FOREST
107 }
108 } else {
109 WATER
110 }
111 })
112 .collect();
113
114 Self {
115 world: GridWorld::new(
116 10.0.into(),
117 TileSet::default()
118 .shader(ShaderRef::name("color"))
119 .mapping(WATER, TileSetItem::default().tint(Rgba::blue()))
120 .mapping(
121 FOREST,
122 TileSetItem::default().tint(Rgba::new_opaque(0.0, 0.5, 0.0)),
123 )
124 .mapping(GRASS, TileSetItem::default().tint(Rgba::green()))
125 .mapping(
126 SAND,
127 TileSetItem::default().tint(Rgba::new_opaque(1.0, 1.0, 0.5)),
128 )
129 .mapping(ROCK, TileSetItem::default().tint(Rgba::gray(0.5)))
130 .mapping(SNOW, TileSetItem::default().tint(Rgba::white())),
131 GridWorldLayer::new(TileMap::with_buffer(SIZE.into(), buffer).unwrap()),
132 ),
133 weather_tileset: TileSet::default()
134 .shader(ShaderRef::name("color"))
135 .mapping(
136 CLEAR_SKY,
137 TileSetItem::default().tint(Rgba::new(1.0, 1.0, 1.0, 0.0)),
138 )
139 .mapping(
140 CLOUD_SKY,
141 TileSetItem::default().tint(Rgba::new(1.0, 1.0, 1.0, 0.8)),
142 )
143 .mapping(
144 RAINY_SKY,
145 TileSetItem::default().tint(Rgba::new(0.3, 0.3, 0.3, 0.8)),
146 ),
147 weather_noise: Fbm::<SuperSimplex>::default().set_frequency(0.03),
148 time: 0.0,
149 mouse_position: Default::default(),
150 }
151 }
pub fn size(&self) -> Vec2<usize>
pub fn buffer(&self) -> &[T]
pub fn buffer_mut(&mut self) -> &mut [T]
pub fn iter(&self) -> impl Iterator<Item = (Vec2<usize>, usize, T)> + '_
pub fn index(&self, location: impl Into<Vec2<usize>>) -> usize
pub fn location(&self, index: usize) -> Vec2<usize>
pub fn location_offset( &self, location: Vec2<usize>, direction: GridDirection, distance: usize, ) -> Option<Vec2<usize>>
pub fn neighbors( &self, location: impl Into<Vec2<usize>>, range: Range<usize>, ) -> impl Iterator<Item = (GridDirection, Vec2<usize>, T)> + '_
pub fn get(&self, location: impl Into<Vec2<usize>>) -> Option<T>
pub fn set(&mut self, location: impl Into<Vec2<usize>>, value: T)
Trait Implementations§
Auto Trait Implementations§
impl<T> Freeze for Grid<T>
impl<T> RefUnwindSafe for Grid<T>where
T: RefUnwindSafe,
impl<T> Send for Grid<T>where
T: Send,
impl<T> Sync for Grid<T>where
T: Sync,
impl<T> Unpin for Grid<T>where
T: Unpin,
impl<T> UnwindSafe for Grid<T>where
T: UnwindSafe,
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more