From 7c770af89c8dd40fee374ce43776171d3caf8581 Mon Sep 17 00:00:00 2001 From: Amatsugu Date: Tue, 23 Apr 2024 21:39:35 -0400 Subject: [PATCH] resource load states use biome painter --- engine/asset_loader/src/lib.rs | 20 +++++++ engine/world_generation/src/biome_painter.rs | 5 +- engine/world_generation/src/heightmap.rs | 13 +++-- engine/world_generation/src/lib.rs | 9 +++ engine/world_generation/src/mesh_generator.rs | 9 ++- engine/world_generation/src/tile_manager.rs | 2 +- engine/world_generation/src/tile_mapper.rs | 1 + game/camera_system/src/lib.rs | 8 ++- game/main/src/phos.rs | 57 +++++++++---------- 9 files changed, 85 insertions(+), 39 deletions(-) diff --git a/engine/asset_loader/src/lib.rs b/engine/asset_loader/src/lib.rs index 2f90aeb..de6a83d 100644 --- a/engine/asset_loader/src/lib.rs +++ b/engine/asset_loader/src/lib.rs @@ -6,6 +6,7 @@ pub mod macros { $plugin_name: ident, $loader_name: ident, $asset_type: ident, + $asset_loadstate_name: ident, $extensions: expr, $($string_name: ident -> $handle_name: ident)* ; $($string_array_name: ident -> $handle_array_name: ident)* ? @@ -18,6 +19,7 @@ pub mod macros { fn build(&self, app: &mut App) { app.init_asset::<$asset_type>() .init_asset_loader::<$loader_name>() + .insert_resource($asset_loadstate_name::default()) .add_systems(Update, finalize); } } @@ -25,10 +27,12 @@ pub mod macros { fn finalize( mut asset_events: EventReader>, mut assets: ResMut>, + mut load_state: ResMut<$asset_loadstate_name>, asset_server: Res ) { for event in asset_events.read() { match event { + AssetEvent::Added { id } => load_state.added += 1, AssetEvent::LoadedWithDependencies { id } => { let asset = assets.get_mut(id.clone()).unwrap(); @@ -40,12 +44,28 @@ pub mod macros { asset.$handle_array_name.push(asset_server.load(&asset.$string_array_name[i])); } )? + load_state.loaded += 1; }, _ => (), } } } + #[derive(Resource, Debug, Default)] + pub struct $asset_loadstate_name{ + pub loaded: u32, + pub added: u32, + } + + impl $asset_loadstate_name{ + pub fn is_all_loaded(&self) -> bool{ + if self.added == 0{ + return false; + } + return self.loaded >= self.added; + } + } + #[derive(Default)] pub struct $loader_name; diff --git a/engine/world_generation/src/biome_painter.rs b/engine/world_generation/src/biome_painter.rs index 476c8c4..c10a02e 100644 --- a/engine/world_generation/src/biome_painter.rs +++ b/engine/world_generation/src/biome_painter.rs @@ -16,8 +16,8 @@ pub struct BiomePainterAsset { impl BiomePainterAsset { pub fn sample_biome(&self, moisture: f32, temperature: f32) -> Handle { - let x = (moisture.clamp(0., 1.) * 4.).ceil() as usize; - let y = (temperature.clamp(0., 1.) * 4.).ceil() as usize; + let x = (moisture.clamp(0., 1.) * 3.).ceil() as usize; + let y = (temperature.clamp(0., 1.) * 3.).ceil() as usize; return self.biomes[x + y * 4].clone(); } } @@ -26,6 +26,7 @@ create_asset_loader!( BiomePainterPlugin, BiomePainterLoader, BiomePainterAsset, + BiomePainterLoadState, &["bimoes.json"], ; biomes_path -> biomes diff --git a/engine/world_generation/src/heightmap.rs b/engine/world_generation/src/heightmap.rs index 42bbd58..7ae0d0f 100644 --- a/engine/world_generation/src/heightmap.rs +++ b/engine/world_generation/src/heightmap.rs @@ -39,10 +39,10 @@ pub fn generate_chunk(chunk_x: f64, chunk_z: f64, cfg: &GenerationConfig, seed: &noise, ) as f32; temp[x + z * Chunk::SIZE] = sample_tempurature( - x as f32 + chunk_x as f32 * Chunk::SIZE as f32, z as f32 + chunk_z as f32 * Chunk::SIZE as f32, sample, - 100. + &cfg, + 100., ); } } @@ -54,8 +54,13 @@ pub fn generate_chunk(chunk_x: f64, chunk_z: f64, cfg: &GenerationConfig, seed: }; } -fn sample_tempurature(x: f32, z: f32, height: f32, equator: f32) -> f32 { - return height.remap(0., 100., 0., 1.).clamp(0., 1.); +fn sample_tempurature(z: f32, height: f32, cfg: &GenerationConfig, equator: f32) -> f32 { + let d = (equator - z).abs(); + let max_d = equator.max(cfg.get_total_height() as f32 - equator); + let t_mod = d.remap(0., max_d, 0., 1.); + + // let max_d = d.max() + return height.remap(0., 100., 0., 1.).clamp(0., 1.) * t_mod; } fn sample_point(x: f64, z: f64, cfg: &GenerationConfig, noise: &impl NoiseFn) -> f32 { diff --git a/engine/world_generation/src/lib.rs b/engine/world_generation/src/lib.rs index 64677e8..afe097a 100644 --- a/engine/world_generation/src/lib.rs +++ b/engine/world_generation/src/lib.rs @@ -20,6 +20,15 @@ pub mod prelude { pub layers: Vec, } + impl GenerationConfig { + pub fn get_total_width(&self) -> usize { + return self.size.x as usize * Chunk::SIZE; + } + pub fn get_total_height(&self) -> usize { + return self.size.y as usize * Chunk::SIZE; + } + } + pub struct GeneratorLayer { pub strength: f64, pub min_value: f64, diff --git a/engine/world_generation/src/mesh_generator.rs b/engine/world_generation/src/mesh_generator.rs index fa776e1..8b7a2e1 100644 --- a/engine/world_generation/src/mesh_generator.rs +++ b/engine/world_generation/src/mesh_generator.rs @@ -1,3 +1,4 @@ +use crate::biome_painter::BiomePainterAsset; use crate::hex_utils::HexCoord; use crate::tile_manager::TileAsset; use crate::tile_mapper::TileMapperAsset; @@ -26,8 +27,9 @@ const HEX_CORNERS: [Vec3; 6] = [ pub fn generate_chunk_mesh( chunk: &Chunk, map: &Map, - tile_mapper: &TileMapperAsset, + painter: &BiomePainterAsset, tiles: &Res>, + mappers: &Res>, ) -> Mesh { let vertex_count: usize = Chunk::SIZE * Chunk::SIZE * 6; let mut verts = Vec::with_capacity(vertex_count); @@ -37,13 +39,16 @@ pub fn generate_chunk_mesh( for z in 0..Chunk::SIZE { for x in 0..Chunk::SIZE { let height = chunk.heights[x + z * Chunk::SIZE]; + let moisture = chunk.moisture[x + z * Chunk::SIZE]; + let temperature = chunk.temperature[x + z * Chunk::SIZE]; let off_pos = Vec3::new(x as f32, height, z as f32); let tile_pos = offset3d_to_world(off_pos); let coord = HexCoord::from_offset( IVec2::new(x as i32, z as i32) + (chunk.chunk_offset * Chunk::SIZE as i32), ); let n = map.get_neighbors(&coord); - let tile_handle = tile_mapper.sample_tile(height); + let biome = mappers.get(painter.sample_biome(moisture, temperature)); + let tile_handle = biome.unwrap().sample_tile(height); let tile = tiles.get(tile_handle).unwrap(); create_tile( diff --git a/engine/world_generation/src/tile_manager.rs b/engine/world_generation/src/tile_manager.rs index 3b11e47..fe57c82 100644 --- a/engine/world_generation/src/tile_manager.rs +++ b/engine/world_generation/src/tile_manager.rs @@ -37,4 +37,4 @@ pub struct TileAsset { pub side_texture: String, } -create_asset_loader!(TileAssetPlugin, TileAssetLoader, TileAsset, &["tile.json"],;?); +create_asset_loader!(TileAssetPlugin, TileAssetLoader, TileAsset, TileAssetLoadState, &["tile.json"],;?); diff --git a/engine/world_generation/src/tile_mapper.rs b/engine/world_generation/src/tile_mapper.rs index 3a0beb1..9c19c53 100644 --- a/engine/world_generation/src/tile_mapper.rs +++ b/engine/world_generation/src/tile_mapper.rs @@ -34,6 +34,7 @@ create_asset_loader!( TileMapperAssetPlugin, TileMapperAssetLoader, TileMapperAsset, + TileMapperLoadState, &["mapper.json"],; tiles_path -> tiles ? diff --git a/game/camera_system/src/lib.rs b/game/camera_system/src/lib.rs index af4d30a..46e8b8c 100644 --- a/game/camera_system/src/lib.rs +++ b/game/camera_system/src/lib.rs @@ -25,7 +25,8 @@ impl Plugin for PhosCameraPlugin { } } -fn setup(mut commands: Commands) { +fn setup(mut commands: Commands, mut msaa: ResMut) { + *msaa = Msaa::Off; commands.spawn(( Camera3dBundle { transform: Transform::from_xyz(0., 30., 0.) @@ -42,7 +43,12 @@ fn update_camera( mut cam_query: Query<(&PhosCamera, &mut Transform)>, keyboard_input: Res>, time: Res