diff --git a/engine/world_generation/src/mesh_generator.rs b/engine/world_generation/src/mesh_generator.rs index b49583c..fa776e1 100644 --- a/engine/world_generation/src/mesh_generator.rs +++ b/engine/world_generation/src/mesh_generator.rs @@ -1,4 +1,6 @@ use crate::hex_utils::HexCoord; +use crate::tile_manager::TileAsset; +use crate::tile_mapper::TileMapperAsset; use crate::{ hex_utils::{offset3d_to_world, INNER_RADIUS, OUTER_RADIUS}, prelude::*, @@ -21,7 +23,12 @@ const HEX_CORNERS: [Vec3; 6] = [ Vec3::new(-INNER_RADIUS, 0., 0.5 * OUTER_RADIUS), ]; -pub fn generate_chunk_mesh(chunk: &Chunk, map: &Map) -> Mesh { +pub fn generate_chunk_mesh( + chunk: &Chunk, + map: &Map, + tile_mapper: &TileMapperAsset, + tiles: &Res>, +) -> Mesh { let vertex_count: usize = Chunk::SIZE * Chunk::SIZE * 6; let mut verts = Vec::with_capacity(vertex_count); let mut uvs = Vec::with_capacity(vertex_count); @@ -36,6 +43,9 @@ pub fn generate_chunk_mesh(chunk: &Chunk, map: &Map) -> Mesh { 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 tile = tiles.get(tile_handle).unwrap(); + create_tile( tile_pos, &n, @@ -43,7 +53,8 @@ pub fn generate_chunk_mesh(chunk: &Chunk, map: &Map) -> Mesh { &mut uvs, &mut indices, // &mut tex, - (height % 7.) as u32, + tile.texture_id, + tile.side_texture_id, ); } } @@ -67,9 +78,11 @@ fn create_tile( uvs: &mut Vec, indices: &mut Vec, texture_index: u32, + side_texture_index: u32, ) { let uv_offset = Vec2::splat(0.5); let tex_off = Vec2::new(texture_index as f32, 0.); + let side_tex_off = Vec2::new(side_texture_index as f32, 0.); let idx = verts.len() as u32; uvs.push(uv_offset + tex_off); @@ -89,7 +102,7 @@ fn create_tile( match cur_n { Some(n_height) => { if n_height < pos.y { - create_tile_wall(pos, i, n_height, verts, uvs, indices, tex_off); + create_tile_wall(pos, i, n_height, verts, uvs, indices, side_tex_off); } } _ => {} diff --git a/game/main/src/phos.rs b/game/main/src/phos.rs index 404d745..1d66be3 100644 --- a/game/main/src/phos.rs +++ b/game/main/src/phos.rs @@ -9,7 +9,7 @@ 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::tile_mapper::{TileMapperAsset, TileMapperAssetPlugin}; use world_generation::{ heightmap::generate_heightmap, mesh_generator::generate_chunk_mesh, prelude::*, }; @@ -27,7 +27,7 @@ impl Plugin for PhosGamePlugin { app.add_systems(Startup, init_game) .add_systems(Startup, (load_textures, load_tiles, create_map).chain()); //Systems - Update - app.add_systems(Update, (check_texture, spawn_map, print_tiles)); + app.add_systems(Update, (finalize_texture, spawn_map, print_tiles)); //Perf UI app.add_plugins(bevy::diagnostic::FrameTimeDiagnosticsPlugin) @@ -92,11 +92,12 @@ fn print_tiles(tile_assets: Res>) { } } -fn check_texture( +fn finalize_texture( asset_server: Res, mut atlas: ResMut, mut map: ResMut, mut images: ResMut>, + painter: Res, ) { if atlas.is_loaded { return; @@ -105,9 +106,12 @@ fn check_texture( if asset_server.load_state(atlas.handle.clone()) != LoadState::Loaded { return; } + if asset_server.load_state(painter.0.clone()) != LoadState::Loaded { + return; + } let image = images.get_mut(&atlas.handle).unwrap(); - let array_layers = 7; + let array_layers = 14; image.reinterpret_stacked_2d_as_array(array_layers); atlas.is_loaded = true; @@ -186,10 +190,24 @@ fn spawn_map( mut meshes: ResMut>, atlas: Res, mut map: ResMut, + tile_assets: Res>, + tile_mapper: Res>, ) { if !map.ready || !map.regenerate { + return; + } + let mapper_opt = tile_mapper.iter().next(); + if mapper_opt.is_none() { return; } + let mapper = mapper_opt.unwrap().1; + + for tile_handle in &mapper.tiles { + let t = tile_assets.get(tile_handle); + if t.is_none() { + return; + } + } map.regenerate = false; let chunk_material = materials.add(ExtendedMaterial { base: StandardMaterial { @@ -202,7 +220,7 @@ fn spawn_map( }); for chunk in &heightmap.chunks { - let mesh = generate_chunk_mesh(&chunk, &heightmap); + let mesh = generate_chunk_mesh(&chunk, &heightmap, mapper, &tile_assets); let pos = offset_to_world(chunk.chunk_offset * Chunk::SIZE as i32, 0.); commands.spawn(( MaterialMeshBundle {