diff --git a/engine/world_generation/src/consts.rs b/engine/world_generation/src/consts.rs index 8b1f737..2302bf9 100644 --- a/engine/world_generation/src/consts.rs +++ b/engine/world_generation/src/consts.rs @@ -41,9 +41,9 @@ pub const HEX_NORMALS: [Vec3; 6] = [ ]; pub const ATTRIBUTE_PACKED_VERTEX_DATA: MeshVertexAttribute = - MeshVertexAttribute::new("PackedVertexData", 988540817, VertexFormat::Uint32); + MeshVertexAttribute::new("PackedVertexData", 7, VertexFormat::Uint32); pub const ATTRIBUTE_VERTEX_HEIGHT: MeshVertexAttribute = - MeshVertexAttribute::new("VertexHeight", 988540717, VertexFormat::Float32); + MeshVertexAttribute::new("VertexHeight", 8, VertexFormat::Float32); pub const ATTRIBUTE_TEXTURE_INDEX: MeshVertexAttribute = MeshVertexAttribute::new("TextureIndex", 988540917, VertexFormat::Uint32); diff --git a/engine/world_generation/src/generators/packed_mesh_generator.rs b/engine/world_generation/src/generators/packed_mesh_generator.rs index df3c141..c0e0dae 100644 --- a/engine/world_generation/src/generators/packed_mesh_generator.rs +++ b/engine/world_generation/src/generators/packed_mesh_generator.rs @@ -1,9 +1,5 @@ -use crate::hex_utils::HexCoord; -use crate::map::biome_map::BiomeChunk; +use crate::hex_utils::{offset3d_to_world, HexCoord}; use crate::prelude::*; -use crate::tile_manager::TileAsset; -use crate::tile_mapper::TileMapperAsset; -use crate::{biome_asset::BiomeAsset, biome_painter::BiomePainterAsset}; use bevy::{ prelude::*, render::{ @@ -12,15 +8,7 @@ use bevy::{ }, }; -pub fn generate_packed_chunk_mesh( - chunk: &Chunk, - map: &Map, - biome_chunk: &BiomeChunk, - painter: &BiomePainterAsset, - tiles: &Res>, - biomes: &Res>, - mappers: &Res>, -) -> Mesh { +pub fn generate_packed_chunk_mesh(chunk: &MeshChunkData) -> Mesh { let vertex_count: usize = Chunk::SIZE * Chunk::SIZE * 6; let mut packed_data = Vec::with_capacity(vertex_count); let mut indices = Vec::with_capacity(vertex_count); @@ -28,16 +16,10 @@ pub fn generate_packed_chunk_mesh( for z in 0..Chunk::SIZE { for x in 0..Chunk::SIZE { - let height = chunk.heights[x + z * Chunk::SIZE]; - let data = biome_chunk.data[x + z * Chunk::SIZE]; - 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 biome = biomes.get(painter.sample_biome(biomes, &data)).unwrap(); - - let mapper = mappers.get(biome.tile_mapper.id()); - let tile_handle = mapper.unwrap().sample_tile(height); - let tile = tiles.get(tile_handle).unwrap(); + let idx = x + z * Chunk::SIZE; + let height = chunk.heights[idx]; + let coord = HexCoord::from_grid_pos(x, z); + let n = chunk.get_neighbors(&coord); create_packed_tile( UVec2::new(x as u32, z as u32), @@ -46,8 +28,8 @@ pub fn generate_packed_chunk_mesh( &mut packed_data, &mut indices, &mut heights, - tile.texture_id, - tile.side_texture_id, + chunk.textures[idx][0], + chunk.textures[idx][1], ); } } @@ -65,7 +47,7 @@ pub fn generate_packed_chunk_mesh( fn create_packed_tile( offset: UVec2, height: f32, - neighbors: &[Option; 6], + neighbors: &[f32; 6], packed_data: &mut Vec, indices: &mut Vec, heights: &mut Vec, @@ -85,23 +67,18 @@ fn create_packed_tile( } for i in 0..neighbors.len() { - let cur_n = neighbors[i]; - match cur_n { - Some(n_height) => { - if n_height < height { - create_packed_tile_wall( - offset, - height, - n_height, - i, - packed_data, - indices, - heights, - side_texture_index, - ); - } - } - _ => {} + let n_height = neighbors[i]; + if n_height < height { + create_packed_tile_wall( + offset, + height, + n_height, + i, + packed_data, + indices, + heights, + side_texture_index, + ); } } } diff --git a/game/main/assets b/game/main/assets index 3606ca0..4082df1 160000 --- a/game/main/assets +++ b/game/main/assets @@ -1 +1 @@ -Subproject commit 3606ca032461db3f8d0a9573af36ce51d90b6352 +Subproject commit 4082df18e0ce89bab1ab7f2f1b0de11125cfc697 diff --git a/game/main/src/main.rs b/game/main/src/main.rs index d758662..7181fca 100644 --- a/game/main/src/main.rs +++ b/game/main/src/main.rs @@ -14,6 +14,7 @@ mod prelude; mod shader_extensions; mod ui; mod utlis; +mod ui; fn main() { App::new() diff --git a/game/main/src/map_rendering/map_init.rs b/game/main/src/map_rendering/map_init.rs index 28e6646..63c1049 100644 --- a/game/main/src/map_rendering/map_init.rs +++ b/game/main/src/map_rendering/map_init.rs @@ -3,6 +3,7 @@ use bevy::log::*; use bevy::{ pbr::{ExtendedMaterial, NotShadowCaster}, prelude::*, + render::render_resource::{ColorTargetState, FragmentState, RenderPipelineDescriptor}, }; use bevy_asset_loader::prelude::*; @@ -219,6 +220,7 @@ fn spawn_map( ) { paint_map(&mut heightmap, &biome_painter, &tile_assets, &tile_mappers); + //Prepare Mesh Data let map_size = UVec2::new(heightmap.width as u32, heightmap.height as u32); let chunk_meshes: Vec<_> = heightmap .chunks @@ -236,6 +238,8 @@ fn spawn_map( .collect(); let mut registry = PhosChunkRegistry::new(chunk_meshes.len()); + + //Spawn Chunks { #[cfg(feature = "tracing")] let _spawn_span = info_span!("Spawn Chunks").entered(); @@ -277,20 +281,6 @@ fn spawn_map( } } - // commands.spawn(( - // MaterialMeshBundle { - // transform: Transform::from_translation(heightmap.get_center()), - // mesh: meshes.add( - // Plane3d::default() - // .mesh() - // .size(heightmap.get_world_width(), heightmap.get_world_height()), - // ), - // material: atlas.water_material.clone(), - // ..default() - // }, - // NotShadowCaster, - // )); - commands.insert_resource(registry); generator_state.set(GeneratorState::Idle); if cur_game_state.get() != &MenuState::InGame { diff --git a/game/main/src/shader_extensions/chunk_material.rs b/game/main/src/shader_extensions/chunk_material.rs index 223c4f6..4733ad9 100644 --- a/game/main/src/shader_extensions/chunk_material.rs +++ b/game/main/src/shader_extensions/chunk_material.rs @@ -1,8 +1,10 @@ use bevy::asset::{Asset, Handle}; -use bevy::pbr::MaterialExtension; +use bevy::pbr::{Material, MaterialExtension}; use bevy::reflect::TypePath; +use bevy::render::mesh::{MeshVertexAttribute, MeshVertexBufferLayoutRef}; use bevy::render::render_resource::{AsBindGroup, ShaderRef}; use bevy::render::texture::Image; +use world_generation::consts::{ATTRIBUTE_PACKED_VERTEX_DATA, ATTRIBUTE_VERTEX_HEIGHT}; #[derive(Asset, TypePath, AsBindGroup, Debug, Clone)] pub struct ChunkMaterial { @@ -15,25 +17,50 @@ impl MaterialExtension for ChunkMaterial { fn fragment_shader() -> ShaderRef { "shaders/world/chunk.wgsl".into() } +} - // fn vertex_shader() -> ShaderRef { +#[derive(Asset, TypePath, AsBindGroup, Debug, Clone)] +pub struct PackedChunkMaterial { + #[texture(100, dimension = "2d_array")] + #[sampler(101)] + pub array_texture: Handle, +} + +impl Material for PackedChunkMaterial { + fn fragment_shader() -> ShaderRef { + "shaders/world/chunk.wgsl".into() + } + + fn vertex_shader() -> ShaderRef { + "shaders/world/chunk_packed.wgsl".into() + } + + fn prepass_vertex_shader() -> ShaderRef { + "shaders/world/chunk_packed.wgsl".into() + } + + // fn deferred_vertex_shader() -> ShaderRef { // "shaders/world/chunk_packed.wgsl".into() // } - // fn specialize( - // _pipeline: &bevy::pbr::MaterialExtensionPipeline, - // descriptor: &mut bevy::render::render_resource::RenderPipelineDescriptor, - // layout: &bevy::render::mesh::MeshVertexBufferLayout, - // _key: bevy::pbr::MaterialExtensionKey, - // ) -> Result<(), bevy::render::render_resource::SpecializedMeshPipelineError> { - // let vertex_layout = layout.get_layout(&[ - // // Mesh::ATTRIBUTE_POSITION.at_shader_location(0), - // // Mesh::ATTRIBUTE_UV_0.at_shader_location(1), - // // Mesh::ATTRIBUTE_NORMAL.at_shader_location(2), - // ATTRIBUTE_PACKED_VERTEX_DATA.at_shader_location(7), - // ATTRIBUTE_VERTEX_HEIGHT.at_shader_location(8), - // ])?; - // descriptor.vertex.buffers = vec![vertex_layout]; - // Ok(()) + // fn opaque_render_method(&self) -> bevy::pbr::OpaqueRendererMethod { + // return OpaqueRendererMethod::Auto; // } + + fn specialize( + _pipeline: &bevy::pbr::MaterialPipeline, + descriptor: &mut bevy::render::render_resource::RenderPipelineDescriptor, + layout: &MeshVertexBufferLayoutRef, + _key: bevy::pbr::MaterialPipelineKey, + ) -> Result<(), bevy::render::render_resource::SpecializedMeshPipelineError> { + let vertex_layout = layout.0.get_layout(&[ + // Mesh::ATTRIBUTE_POSITION.at_shader_location(0), + // Mesh::ATTRIBUTE_UV_0.at_shader_location(1), + // Mesh::ATTRIBUTE_NORMAL.at_shader_location(2), + ATTRIBUTE_PACKED_VERTEX_DATA.at_shader_location(7), + ATTRIBUTE_VERTEX_HEIGHT.at_shader_location(8), + ])?; + descriptor.vertex.buffers = vec![vertex_layout]; + Ok(()) + } } diff --git a/game/main/src/utlis/chunk_utils.rs b/game/main/src/utlis/chunk_utils.rs index 942e81d..b10b003 100644 --- a/game/main/src/utlis/chunk_utils.rs +++ b/game/main/src/utlis/chunk_utils.rs @@ -13,6 +13,7 @@ use world_generation::{ generators::{ chunk_colliders::generate_chunk_collider, mesh_generator::{generate_chunk_mesh, generate_chunk_water_mesh}, + packed_mesh_generator::generate_packed_chunk_mesh, }, hex_utils::offset_to_world, prelude::{Chunk, Map, MeshChunkData},