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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
fn default() -> Self {
let mut height = Grid::<f64>::generate(
SIZE.into(),
NoiseGenerator::new(Fbm::<SuperSimplex>::default().set_frequency(0.025)),
);
height.apply_all(RemapGenerator {
from: -1.0..1.0,
to: 0.0..1.0,
});
let gradient = Grid::<f64>::generate(
SIZE.into(),
|location: Vec2<usize>, size: Vec2<usize>, _| {
let center = size / 2;
let x = if location.x >= center.x {
location.x - center.x
} else {
center.x - location.x
} as f64;
let y = if location.y >= center.y {
location.y - center.y
} else {
center.y - location.y
} as f64;
let result = (x / center.x as f64).max(y / center.y as f64);
result * result
},
);
height.apply_all(SubGenerator { other: &gradient });
let mut biome = Grid::<f64>::generate(
SIZE.into(),
NoiseGenerator::new(Fbm::<SuperSimplex>::new(42).set_frequency(0.05)),
);
biome.apply_all(RemapGenerator {
from: -1.0..1.0,
to: 0.0..1.0,
});
let buffer = height
.into_inner()
.1
.into_iter()
.zip(biome.into_inner().1)
.map(|(height, biome)| {
if height > 0.75 {
SNOW
} else if height > 0.6 {
ROCK
} else if height > 0.1 {
if biome > 0.8 {
SAND
} else if biome > 0.5 {
GRASS
} else {
FOREST
}
} else {
WATER
}
})
.collect();
Self {
world: GridWorld::new(
10.0.into(),
TileSet::default()
.shader(ShaderRef::name("color"))
.mapping(WATER, TileSetItem::default().tint(Rgba::blue()))
.mapping(
FOREST,
TileSetItem::default().tint(Rgba::new_opaque(0.0, 0.5, 0.0)),
)
.mapping(GRASS, TileSetItem::default().tint(Rgba::green()))
.mapping(
SAND,
TileSetItem::default().tint(Rgba::new_opaque(1.0, 1.0, 0.5)),
)
.mapping(ROCK, TileSetItem::default().tint(Rgba::gray(0.5)))
.mapping(SNOW, TileSetItem::default().tint(Rgba::white())),
GridWorldLayer::new(TileMap::with_buffer(SIZE.into(), buffer).unwrap()),
),
weather_tileset: TileSet::default()
.shader(ShaderRef::name("color"))
.mapping(
CLEAR_SKY,
TileSetItem::default().tint(Rgba::new(1.0, 1.0, 1.0, 0.0)),
)
.mapping(
CLOUD_SKY,
TileSetItem::default().tint(Rgba::new(1.0, 1.0, 1.0, 0.8)),
)
.mapping(
RAINY_SKY,
TileSetItem::default().tint(Rgba::new(0.3, 0.3, 0.3, 0.8)),
),
weather_noise: Fbm::<SuperSimplex>::default().set_frequency(0.03),
time: 0.0,
mouse_position: Default::default(),
}
}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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
fn default() -> Self {
let mut height = Grid::<f64>::generate(
SIZE.into(),
NoiseGenerator::new(Fbm::<SuperSimplex>::default().set_frequency(0.025)),
);
height.apply_all(RemapGenerator {
from: -1.0..1.0,
to: 0.0..1.0,
});
let gradient = Grid::<f64>::generate(
SIZE.into(),
|location: Vec2<usize>, size: Vec2<usize>, _| {
let center = size / 2;
let x = if location.x >= center.x {
location.x - center.x
} else {
center.x - location.x
} as f64;
let y = if location.y >= center.y {
location.y - center.y
} else {
center.y - location.y
} as f64;
let result = (x / center.x as f64).max(y / center.y as f64);
result * result
},
);
height.apply_all(SubGenerator { other: &gradient });
let mut biome = Grid::<f64>::generate(
SIZE.into(),
NoiseGenerator::new(Fbm::<SuperSimplex>::new(42).set_frequency(0.05)),
);
biome.apply_all(RemapGenerator {
from: -1.0..1.0,
to: 0.0..1.0,
});
let buffer = height
.into_inner()
.1
.into_iter()
.zip(biome.into_inner().1)
.map(|(height, biome)| {
if height > 0.75 {
SNOW
} else if height > 0.6 {
ROCK
} else if height > 0.1 {
if biome > 0.8 {
SAND
} else if biome > 0.5 {
GRASS
} else {
FOREST
}
} else {
WATER
}
})
.collect();
Self {
world: GridWorld::new(
10.0.into(),
TileSet::default()
.shader(ShaderRef::name("color"))
.mapping(WATER, TileSetItem::default().tint(Rgba::blue()))
.mapping(
FOREST,
TileSetItem::default().tint(Rgba::new_opaque(0.0, 0.5, 0.0)),
)
.mapping(GRASS, TileSetItem::default().tint(Rgba::green()))
.mapping(
SAND,
TileSetItem::default().tint(Rgba::new_opaque(1.0, 1.0, 0.5)),
)
.mapping(ROCK, TileSetItem::default().tint(Rgba::gray(0.5)))
.mapping(SNOW, TileSetItem::default().tint(Rgba::white())),
GridWorldLayer::new(TileMap::with_buffer(SIZE.into(), buffer).unwrap()),
),
weather_tileset: TileSet::default()
.shader(ShaderRef::name("color"))
.mapping(
CLEAR_SKY,
TileSetItem::default().tint(Rgba::new(1.0, 1.0, 1.0, 0.0)),
)
.mapping(
CLOUD_SKY,
TileSetItem::default().tint(Rgba::new(1.0, 1.0, 1.0, 0.8)),
)
.mapping(
RAINY_SKY,
TileSetItem::default().tint(Rgba::new(0.3, 0.3, 0.3, 0.8)),
),
weather_noise: Fbm::<SuperSimplex>::default().set_frequency(0.03),
time: 0.0,
mouse_position: Default::default(),
}
}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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
fn default() -> Self {
let mut height = Grid::<f64>::generate(
SIZE.into(),
NoiseGenerator::new(Fbm::<SuperSimplex>::default().set_frequency(0.025)),
);
height.apply_all(RemapGenerator {
from: -1.0..1.0,
to: 0.0..1.0,
});
let gradient = Grid::<f64>::generate(
SIZE.into(),
|location: Vec2<usize>, size: Vec2<usize>, _| {
let center = size / 2;
let x = if location.x >= center.x {
location.x - center.x
} else {
center.x - location.x
} as f64;
let y = if location.y >= center.y {
location.y - center.y
} else {
center.y - location.y
} as f64;
let result = (x / center.x as f64).max(y / center.y as f64);
result * result
},
);
height.apply_all(SubGenerator { other: &gradient });
let mut biome = Grid::<f64>::generate(
SIZE.into(),
NoiseGenerator::new(Fbm::<SuperSimplex>::new(42).set_frequency(0.05)),
);
biome.apply_all(RemapGenerator {
from: -1.0..1.0,
to: 0.0..1.0,
});
let buffer = height
.into_inner()
.1
.into_iter()
.zip(biome.into_inner().1)
.map(|(height, biome)| {
if height > 0.75 {
SNOW
} else if height > 0.6 {
ROCK
} else if height > 0.1 {
if biome > 0.8 {
SAND
} else if biome > 0.5 {
GRASS
} else {
FOREST
}
} else {
WATER
}
})
.collect();
Self {
world: GridWorld::new(
10.0.into(),
TileSet::default()
.shader(ShaderRef::name("color"))
.mapping(WATER, TileSetItem::default().tint(Rgba::blue()))
.mapping(
FOREST,
TileSetItem::default().tint(Rgba::new_opaque(0.0, 0.5, 0.0)),
)
.mapping(GRASS, TileSetItem::default().tint(Rgba::green()))
.mapping(
SAND,
TileSetItem::default().tint(Rgba::new_opaque(1.0, 1.0, 0.5)),
)
.mapping(ROCK, TileSetItem::default().tint(Rgba::gray(0.5)))
.mapping(SNOW, TileSetItem::default().tint(Rgba::white())),
GridWorldLayer::new(TileMap::with_buffer(SIZE.into(), buffer).unwrap()),
),
weather_tileset: TileSet::default()
.shader(ShaderRef::name("color"))
.mapping(
CLEAR_SKY,
TileSetItem::default().tint(Rgba::new(1.0, 1.0, 1.0, 0.0)),
)
.mapping(
CLOUD_SKY,
TileSetItem::default().tint(Rgba::new(1.0, 1.0, 1.0, 0.8)),
)
.mapping(
RAINY_SKY,
TileSetItem::default().tint(Rgba::new(0.3, 0.3, 0.3, 0.8)),
),
weather_noise: Fbm::<SuperSimplex>::default().set_frequency(0.03),
time: 0.0,
mouse_position: Default::default(),
}
}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