# HG changeset patch # User unC0Rr # Date 1676361140 -3600 # Node ID 9502611bffc1c7af8e80c5a21d1e25ccd61bc820 # Parent d46ad15c6dec609b8c2c349b792e2b5495ffca41 Some bug fixes, build fixes and code formatting diff -r d46ad15c6dec -r 9502611bffc1 rust/landgen/src/wavefront_collapse/generator.rs --- a/rust/landgen/src/wavefront_collapse/generator.rs Mon Feb 13 17:02:08 2023 +0100 +++ b/rust/landgen/src/wavefront_collapse/generator.rs Tue Feb 14 08:52:20 2023 +0100 @@ -27,18 +27,19 @@ pub struct TileDescription { pub name: String, pub edges: EdgesDescription, - pub is_negative: bool, - pub can_flip: bool, - pub can_mirror: bool, - pub can_rotate90: bool, - pub can_rotate180: bool, - pub can_rotate270: bool, + pub is_negative: Option, + pub can_flip: Option, + pub can_mirror: Option, + pub can_rotate90: Option, + pub can_rotate180: Option, + pub can_rotate270: Option, } #[derive(Clone)] pub struct TemplateDescription { pub size: Size, pub tiles: Vec, + pub wrap: bool, } pub struct WavefrontCollapseLandGenerator { @@ -76,7 +77,7 @@ let mut tiles_image_pixels = tiles_image.as_mut_slice().iter_mut(); - let (zero, basic) = if tile_description.is_negative { + let (zero, basic) = if tile_description.is_negative.unwrap_or_default() { (parameters.basic(), parameters.zero()) } else { (parameters.zero(), parameters.basic()) @@ -100,11 +101,7 @@ *tiles_image_pixels .next() .expect("vec2d size matching image dimensions") = - if value[0] == 0u8 { - zero - } else { - basic - }; + if value[0] == 0u8 { zero } else { basic }; } } } @@ -142,23 +139,25 @@ result.push(tile.clone()); - if tile_description.can_flip { + if tile_description.can_flip.unwrap_or_default() { result.push(tile.flipped()); } - if tile_description.can_mirror { + if tile_description.can_mirror.unwrap_or_default() { result.push(tile.mirrored()); } - if tile_description.can_flip && tile_description.can_mirror { + if tile_description.can_flip.unwrap_or_default() + && tile_description.can_mirror.unwrap_or_default() + { result.push(tile.mirrored().flipped()); } - if tile_description.can_rotate90 { + if tile_description.can_rotate90.unwrap_or_default() { result.push(tile.rotated90()); } - if tile_description.can_rotate180 { + if tile_description.can_rotate180.unwrap_or_default() { result.push(tile.rotated180()); } - if tile_description.can_rotate270 { + if tile_description.can_rotate270.unwrap_or_default() { result.push(tile.rotated270()); } @@ -229,7 +228,7 @@ }); } - let mut wfc = WavefrontCollapse::default(); + let mut wfc = WavefrontCollapse::new(self.template.wrap); wfc.set_rules(rules); let wfc_size = if let Some(first_tile) = tiles.first() { @@ -246,6 +245,8 @@ wfc.generate_map(&wfc_size, |_| {}, random_numbers); let mut result = land2d::Land2D::new(&self.template.size, parameters.zero); + let offset_y = result.height() - result.play_height(); + let offset_x = (result.width() - result.play_width()) / 2; for row in 0..wfc_size.height { for column in 0..wfc_size.width { @@ -255,8 +256,8 @@ for tile_row in 0..tile.size().height { for tile_column in 0..tile.size().width { result.map( - (row * tile.size().height + tile_row) as i32, - (column * tile.size().width + tile_column) as i32, + (row * tile.size().height + tile_row + offset_y) as i32, + (column * tile.size().width + tile_column + offset_x) as i32, |p| { *p = *tile.get(tile_row, tile_column).unwrap_or(¶meters.zero) @@ -271,44 +272,3 @@ result } } - -#[cfg(test)] -mod tests { - use super::WavefrontCollapseLandGenerator; - use crate::{LandGenerationParameters, LandGenerator}; - use integral_geometry::Size; - use std::fs::File; - use std::io::BufWriter; - use std::path::Path; - - #[test] - fn test_generation() { - let wfc_gen = WavefrontCollapseLandGenerator::new(&Size::new(2048, 1024)); - let landgen_params = LandGenerationParameters::new(0u32, 0xff000000u32, 0, true, true); - let land = wfc_gen.generate_land( - &landgen_params, - &mut [0u32, 1u32, 3u32, 5u32, 7u32, 11u32].into_iter().cycle(), - ); - - let path = Path::new(r"output.png"); - let file = File::create(path).unwrap(); - let ref mut w = BufWriter::new(file); - - let mut encoder = png::Encoder::new(w, land.width() as u32, land.height() as u32); // Width is 2 pixels and height is 1. - encoder.set_color(png::ColorType::Rgba); - encoder.set_depth(png::BitDepth::Eight); - encoder.set_source_gamma(png::ScaledFloat::from_scaled(45455)); // 1.0 / 2.2, scaled by 100000 - encoder.set_source_gamma(png::ScaledFloat::new(1.0 / 2.2)); // 1.0 / 2.2, unscaled, but rounded - let source_chromaticities = png::SourceChromaticities::new( - // Using unscaled instantiation here - (0.31270, 0.32900), - (0.64000, 0.33000), - (0.30000, 0.60000), - (0.15000, 0.06000), - ); - encoder.set_source_chromaticities(source_chromaticities); - let mut writer = encoder.write_header().unwrap(); - - writer.write_image_data(land.raw_pixel_bytes()).unwrap(); // Save - } -} diff -r d46ad15c6dec -r 9502611bffc1 rust/landgen/src/wavefront_collapse/tile_image.rs --- a/rust/landgen/src/wavefront_collapse/tile_image.rs Mon Feb 13 17:02:08 2023 +0100 +++ b/rust/landgen/src/wavefront_collapse/tile_image.rs Tue Feb 14 08:52:20 2023 +0100 @@ -11,6 +11,7 @@ } impl Edge { + #[inline] pub fn new(id: I, symmetrical: bool) -> Self { Self { id, @@ -19,6 +20,7 @@ } } + #[inline] pub fn reversed(&self) -> Self { Self { id: self.id.clone(), @@ -27,6 +29,7 @@ } } + #[inline] pub fn is_compatible(&self, other: &Self) -> bool { self.id == other.id && ((self.reverse != other.reverse) || self.symmetrical) } @@ -115,22 +118,27 @@ } } + #[inline] pub fn right_edge(&self) -> &Edge { &self.right } + #[inline] pub fn bottom_edge(&self) -> &Edge { &self.bottom } + #[inline] pub fn left_edge(&self) -> &Edge { &self.left } + #[inline] pub fn top_edge(&self) -> &Edge { &self.top } + #[inline] pub fn size(&self) -> Size { match self.transform { Transform::Rotate0(_) => self.image.size(), @@ -138,6 +146,7 @@ } } + #[inline] pub fn get(&self, row: usize, column: usize) -> Option<&T> { match self.transform { Transform::Rotate0(_) => { diff -r d46ad15c6dec -r 9502611bffc1 rust/landgen/src/wavefront_collapse/wavefront_collapse.rs --- a/rust/landgen/src/wavefront_collapse/wavefront_collapse.rs Mon Feb 13 17:02:08 2023 +0100 +++ b/rust/landgen/src/wavefront_collapse/wavefront_collapse.rs Tue Feb 14 08:52:20 2023 +0100 @@ -27,6 +27,7 @@ pub struct WavefrontCollapse { rules: Vec, grid: Vec2D, + wrap: bool, } impl Default for WavefrontCollapse { @@ -34,11 +35,20 @@ Self { rules: Vec::new(), grid: Vec2D::new(&Size::new(1, 1), Tile::Empty), + wrap: false, } } } impl WavefrontCollapse { + pub fn new(wrap: bool) -> Self { + Self { + rules: Vec::new(), + grid: Vec2D::new(&Size::new(1, 1), Tile::Empty), + wrap, + } + } + pub fn generate_map, F: FnOnce(&mut Vec2D)>( &mut self, map_size: &Size, @@ -57,6 +67,20 @@ } fn get_tile(&self, y: usize, x: usize) -> Tile { + let x = if self.wrap { + if x == usize::MAX { + self.grid.width() - 1 + } else { + if x == self.grid.width() { + 0 + } else { + x + } + } + } else { + x + }; + self.grid.get(y, x).copied().unwrap_or_default() } diff -r d46ad15c6dec -r 9502611bffc1 rust/lib-hedgewars-engine/src/instance.rs --- a/rust/lib-hedgewars-engine/src/instance.rs Mon Feb 13 17:02:08 2023 +0100 +++ b/rust/lib-hedgewars-engine/src/instance.rs Tue Feb 14 08:52:20 2023 +0100 @@ -5,7 +5,7 @@ use hedgewars_engine_messages::queue::*; use integral_geometry::{Point, Rect, Size}; -use landgen::outline_template::OutlineTemplate; +use landgen::outline_template_based::outline_template::OutlineTemplate; use std::path::Path; diff -r d46ad15c6dec -r 9502611bffc1 rust/lib-hedgewars-engine/src/lib.rs --- a/rust/lib-hedgewars-engine/src/lib.rs Mon Feb 13 17:02:08 2023 +0100 +++ b/rust/lib-hedgewars-engine/src/lib.rs Tue Feb 14 08:52:20 2023 +0100 @@ -5,7 +5,7 @@ mod world; use std::{ - ffi::{CString, CStr}, + ffi::{CStr, CString}, io::{Read, Write}, mem::replace, os::raw::{c_char, c_void}, diff -r d46ad15c6dec -r 9502611bffc1 rust/lib-hedgewars-engine/src/render/gear.rs --- a/rust/lib-hedgewars-engine/src/render/gear.rs Mon Feb 13 17:02:08 2023 +0100 +++ b/rust/lib-hedgewars-engine/src/render/gear.rs Tue Feb 14 08:52:20 2023 +0100 @@ -71,22 +71,10 @@ } const SPRITE_LOAD_LIST: &[(SpriteId, &str)] = &[ - ( - SpriteId::Mine, - "Graphics/MineOn.png", - ), - ( - SpriteId::Grenade, - "Graphics/Bomb.png", - ), - ( - SpriteId::Cheese, - "Graphics/cheese.png", - ), - ( - SpriteId::Cleaver, - "Graphics/cleaver.png", - ), + (SpriteId::Mine, "Graphics/MineOn.png"), + (SpriteId::Grenade, "Graphics/Bomb.png"), + (SpriteId::Cheese, "Graphics/cheese.png"), + (SpriteId::Cleaver, "Graphics/cleaver.png"), ]; const MAX_SPRITES: usize = SpriteId::MaxSprite as usize + 1; diff -r d46ad15c6dec -r 9502611bffc1 rust/lib-hedgewars-engine/src/world.rs --- a/rust/lib-hedgewars-engine/src/world.rs Mon Feb 13 17:02:08 2023 +0100 +++ b/rust/lib-hedgewars-engine/src/world.rs Tue Feb 14 08:52:20 2023 +0100 @@ -7,8 +7,9 @@ use integral_geometry::{Point, Rect, Size}; use land2d::Land2D; use landgen::{ - outline_template::OutlineTemplate, template_based::TemplatedLandGenerator, - LandGenerationParameters, LandGenerator, + outline_template_based::outline_template::OutlineTemplate, + outline_template_based::template_based::TemplatedLandGenerator, LandGenerationParameters, + LandGenerator, }; use lfprng::LaggedFibonacciPRNG; use std::path::{Path, PathBuf}; @@ -64,9 +65,14 @@ if let Some(ref state) = self.game_state { self.camera.position = state.land.play_box().center(); + let parameters = LandGenerationParameters::new(0u32, 0x8000u32, 0, false, false); let theme = Theme::load(self.data_path.join(Path::new("Themes/Cheese/")).as_path()).unwrap(); - let texture = MapGenerator::new().make_texture(&state.land, &theme); + let texture = MapGenerator::::new().make_texture( + &state.land, + ¶meters, + &theme, + ); if let Some(ref mut renderer) = self.map_renderer { renderer.init(&texture); } diff -r d46ad15c6dec -r 9502611bffc1 rust/mapgen/src/lib.rs --- a/rust/mapgen/src/lib.rs Mon Feb 13 17:02:08 2023 +0100 +++ b/rust/mapgen/src/lib.rs Tue Feb 14 08:52:20 2023 +0100 @@ -17,7 +17,6 @@ }; use rand::{seq::SliceRandom, Rng}; - use std::{borrow::Borrow, collections::hash_map::HashMap}; use vec2d::Vec2D; @@ -249,7 +248,8 @@ #[cfg(test)] mod tests { - use crate::{MapGenerator, TemplateType}; + use crate::{MapGenerator, TemplateType, OutlineTemplate}; + use rand::thread_rng; #[test] fn simple_load() { @@ -283,14 +283,14 @@ test: [0] "#; - let mut generator = MapGenerator::new(); + let mut generator = MapGenerator::::new(); generator.import_yaml_templates(&text); assert!(generator .templates .contains_key(&TemplateType("test".to_string()))); - let template = generator.get_template("test").unwrap(); + let template = generator.get_template("test", &mut thread_rng()).unwrap(); assert_eq!(template.islands[0].len(), 7); } diff -r d46ad15c6dec -r 9502611bffc1 rust/mapgen/src/template/outline.rs --- a/rust/mapgen/src/template/outline.rs Mon Feb 13 17:02:08 2023 +0100 +++ b/rust/mapgen/src/template/outline.rs Tue Feb 14 08:52:20 2023 +0100 @@ -1,11 +1,9 @@ use integral_geometry::{Point, Rect, Size}; -use landgen::{ - outline_template_based::outline_template::OutlineTemplate, -}; +use landgen::outline_template_based::outline_template::OutlineTemplate; use serde_derive::Deserialize; -use std::{collections::hash_map::HashMap}; +use std::collections::hash_map::HashMap; #[derive(Deserialize)] pub struct PointDesc { diff -r d46ad15c6dec -r 9502611bffc1 rust/mapgen/src/template/wavefront_collapse.rs --- a/rust/mapgen/src/template/wavefront_collapse.rs Mon Feb 13 17:02:08 2023 +0100 +++ b/rust/mapgen/src/template/wavefront_collapse.rs Tue Feb 14 08:52:20 2023 +0100 @@ -1,9 +1,9 @@ -use integral_geometry::{Size}; +use integral_geometry::Size; -use landgen::{wavefront_collapse::generator::*}; +use landgen::wavefront_collapse::generator::*; use serde_derive::Deserialize; -use std::{collections::hash_map::HashMap}; +use std::collections::hash_map::HashMap; #[derive(Deserialize)] #[serde(remote = "EdgeDescription")] @@ -32,12 +32,12 @@ pub name: String, #[serde(with = "EdgesDesc")] pub edges: EdgesDescription, - pub is_negative: bool, - pub can_flip: bool, - pub can_mirror: bool, - pub can_rotate90: bool, - pub can_rotate180: bool, - pub can_rotate270: bool, + pub is_negative: Option, + pub can_flip: Option, + pub can_mirror: Option, + pub can_rotate90: Option, + pub can_rotate180: Option, + pub can_rotate270: Option, } #[derive(Deserialize)] @@ -51,6 +51,7 @@ pub is_negative: bool, pub put_girders: bool, pub max_hedgehogs: u8, + pub wrap: bool, pub tiles: Vec, } @@ -69,6 +70,7 @@ .iter() .map(|TileDescriptionHelper(t)| t.clone()) .collect(), + wrap: desc.wrap, } } } diff -r d46ad15c6dec -r 9502611bffc1 share/hedgewars/Data/wfc_templates.yaml --- a/share/hedgewars/Data/wfc_templates.yaml Mon Feb 13 17:02:08 2023 +0100 +++ b/share/hedgewars/Data/wfc_templates.yaml Tue Feb 14 08:52:20 2023 +0100 @@ -4,11 +4,12 @@ # 00 - width: 3960 - height: 1980 + height: 1920 can_invert: false is_negative: false put_girders: true max_hedgehogs: 40 + wrap: true tiles: - name: "120_bar.png" edges: