diff --git a/engine/asset_loader/src/lib.rs b/engine/asset_loader/src/lib.rs index 8dc097d..2f90aeb 100644 --- a/engine/asset_loader/src/lib.rs +++ b/engine/asset_loader/src/lib.rs @@ -7,7 +7,8 @@ pub mod macros { $loader_name: ident, $asset_type: ident, $extensions: expr, - $($string_name: ident -> $handle_name: ident)* + $($string_name: ident -> $handle_name: ident)* ; + $($string_array_name: ident -> $handle_array_name: ident)* ? ) => { use bevy::prelude::*; use bevy::asset::{AssetLoader, AssetEvent, LoadContext, AsyncReadExt, io::Reader}; @@ -30,9 +31,15 @@ pub mod macros { match event { AssetEvent::LoadedWithDependencies { id } => { let asset = assets.get_mut(id.clone()).unwrap(); + $( asset.$handle_name = asset_server.load(&asset.$string_name); )* + $( + for i in 0..asset.$string_array_name.len(){ + asset.$handle_array_name.push(asset_server.load(&asset.$string_array_name[i])); + } + )? }, _ => (), } diff --git a/engine/world_generation/src/heightmap.rs b/engine/world_generation/src/heightmap.rs index 4b7cfe7..6e87f0e 100644 --- a/engine/world_generation/src/heightmap.rs +++ b/engine/world_generation/src/heightmap.rs @@ -35,7 +35,7 @@ pub fn generate_chunk(chunk_x: f64, chunk_z: f64, cfg: &GenerationConfig, seed: return Chunk { heights: result, moisture: result.clone(), - tempurature: result.clone(), + temperature: result.clone(), chunk_offset: IVec2::new(chunk_x as i32, chunk_z as i32), }; } diff --git a/engine/world_generation/src/lib.rs b/engine/world_generation/src/lib.rs index 42419e7..64677e8 100644 --- a/engine/world_generation/src/lib.rs +++ b/engine/world_generation/src/lib.rs @@ -1,3 +1,4 @@ +pub mod biome_painter; pub mod heightmap; pub mod hex_utils; pub mod mesh_generator; @@ -35,7 +36,7 @@ pub mod prelude { pub struct Chunk { pub heights: [f32; Chunk::SIZE * Chunk::SIZE], pub moisture: [f32; Chunk::SIZE * Chunk::SIZE], - pub tempurature: [f32; Chunk::SIZE * Chunk::SIZE], + pub temperature: [f32; Chunk::SIZE * Chunk::SIZE], pub chunk_offset: IVec2, } @@ -81,7 +82,7 @@ pub mod prelude { pub fn get_tempurature(&self, pos: &HexCoord) -> f32 { let chunk = &self.chunks[pos.to_chunk_index(self.width)]; - return chunk.tempurature[pos.to_chunk_local_index()]; + return chunk.temperature[pos.to_chunk_local_index()]; } } diff --git a/engine/world_generation/src/tile_manager.rs b/engine/world_generation/src/tile_manager.rs index ea7a788..3b11e47 100644 --- a/engine/world_generation/src/tile_manager.rs +++ b/engine/world_generation/src/tile_manager.rs @@ -29,12 +29,12 @@ pub struct TileAsset { #[serde(skip)] pub id: usize, pub name: String, - #[serde(skip)] pub texture_id: u32, - pub texture: String, #[serde(skip)] + pub texture: String, pub side_texture_id: u32, + #[serde(skip)] pub side_texture: String, } -create_asset_loader!(TileAssetPlugin, TileAssetLoader, TileAsset, &["tile.json"],); +create_asset_loader!(TileAssetPlugin, TileAssetLoader, TileAsset, &["tile.json"],;?); diff --git a/engine/world_generation/src/tile_mapper.rs b/engine/world_generation/src/tile_mapper.rs index d1158f3..3a0beb1 100644 --- a/engine/world_generation/src/tile_mapper.rs +++ b/engine/world_generation/src/tile_mapper.rs @@ -11,15 +11,30 @@ use crate::tile_manager::TileAsset; pub struct TileMapper; #[derive(Serialize, Deserialize, Debug, TypePath, Asset)] -struct TileMapperAsset { +pub struct TileMapperAsset { #[serde(skip)] pub tiles: Vec>, pub tiles_path: Vec, + pub thresholds: Vec, +} + +impl TileMapperAsset { + pub fn sample_tile(&self, height: f32) -> Handle { + for i in 0..self.thresholds.len() { + let t = self.thresholds[i]; + if t >= height { + return self.tiles[i].clone(); + } + } + return self.tiles.last().unwrap().clone(); + } } create_asset_loader!( TileMapperAssetPlugin, TileMapperAssetLoader, TileMapperAsset, - &["mapper.json"], + &["mapper.json"],; + tiles_path -> tiles + ? ); diff --git a/game/main/assets b/game/main/assets index e986f1b..bcd0abb 160000 --- a/game/main/assets +++ b/game/main/assets @@ -1 +1 @@ -Subproject commit e986f1be463a903c8c8335c7eb094116e71205c4 +Subproject commit bcd0abb3b8f08ca22700eb9ce84e147dadf905d3 diff --git a/game/main/src/phos.rs b/game/main/src/phos.rs index c695d92..404d745 100644 --- a/game/main/src/phos.rs +++ b/game/main/src/phos.rs @@ -6,8 +6,10 @@ use bevy_rapier3d::plugin::{NoUserData, RapierPhysicsPlugin}; use bevy_rapier3d::render::RapierDebugRenderPlugin; use camera_system::PhosCameraPlugin; use iyes_perf_ui::prelude::*; +use world_generation::biome_painter::{BiomePainterAsset, BiomePainterPlugin}; use world_generation::hex_utils::offset_to_world; use world_generation::tile_manager::{self, TileAsset, TileAssetPlugin, TileManager}; +use world_generation::tile_mapper::TileMapperAssetPlugin; use world_generation::{ heightmap::generate_heightmap, mesh_generator::generate_chunk_mesh, prelude::*, }; @@ -36,6 +38,7 @@ impl Plugin for PhosGamePlugin { //Assets app.add_plugins(TileAssetPlugin); app.add_plugins(TileMapperAssetPlugin); + app.add_plugins(BiomePainterPlugin); //Physics app.add_plugins(RapierPhysicsPlugin::::default()) .add_plugins(RapierDebugRenderPlugin::default()); @@ -74,17 +77,13 @@ fn load_textures(mut commands: Commands, asset_server: Res) { handle: main_tex.clone(), is_loaded: false, }); - - // commands.insert_resource(TileResource(handle)); } +#[derive(Resource)] +struct Painter(Handle); -fn load_tiles( - mut commands: Commands, - mut tile_manager: ResMut, - asset_server: Res, -) { - let handle: Handle = asset_server.load("tiles/Terra/Grass.tile.json"); - tile_manager.register_tile(handle); +fn load_tiles(mut commands: Commands, asset_server: Res) { + let handle: Handle = asset_server.load("biome_painters/terra.biomes.json"); + commands.insert_resource(Painter(handle)); } fn print_tiles(tile_assets: Res>) {