diff --git a/Cargo.lock b/Cargo.lock index 10dfe69..8a5241d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -236,6 +236,7 @@ name = "asset_loader" version = "0.1.0" dependencies = [ "bevy", + "ron", "serde", "serde_json", ] @@ -1362,7 +1363,9 @@ version = "0.1.0" dependencies = [ "asset_loader", "bevy", + "bevy_asset_loader", "bevy_rapier3d", + "ron", "serde", "serde_json", "shared", @@ -3441,6 +3444,7 @@ dependencies = [ "iyes_perf_ui", "noise 0.8.2", "rayon", + "ron", "shared", "world_generation", ] @@ -5315,6 +5319,7 @@ dependencies = [ "bevy_asset_loader", "noise 0.9.0", "rayon", + "ron", "serde", "serde_json", ] diff --git a/engine/asset_loader/Cargo.toml b/engine/asset_loader/Cargo.toml index e0fc646..31a6fff 100644 --- a/engine/asset_loader/Cargo.toml +++ b/engine/asset_loader/Cargo.toml @@ -9,3 +9,4 @@ edition = "2021" serde = "1.0.204" serde_json = "1.0.120" bevy = "0.14.0" +ron = "0.8.1" diff --git a/engine/asset_loader/src/lib.rs b/engine/asset_loader/src/lib.rs index 0f5251b..091be6c 100644 --- a/engine/asset_loader/src/lib.rs +++ b/engine/asset_loader/src/lib.rs @@ -6,7 +6,6 @@ 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,52 +17,7 @@ pub mod macros { impl Plugin for $plugin_name { 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); - } - } - - 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(); - - $( - - 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])); - } - )? - 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; + .init_asset_loader::<$loader_name>(); } } @@ -81,20 +35,29 @@ pub mod macros { &'a self, reader: &'a mut Reader<'_>, _settings: &'a Self::Settings, - _load_context: &'a mut LoadContext<'_>, + load_context: &'a mut LoadContext<'_>, ) -> Result { - let mut data: String = String::new(); - let read_result = reader.read_to_string(&mut data).await; + let mut bytes = Vec::new(); + let read_result = reader.read_to_end(&mut bytes).await; if read_result.is_err() { return Err(read_result.err().unwrap().to_string()); } - let serialized: Result = - serde_json::from_str(&data); + let serialized: Result = + ron::de::from_bytes::(&bytes); if serialized.is_err() { return Err(serialized.err().unwrap().to_string()); } - let r = serialized.unwrap(); - return Ok(r); + let mut asset = serialized.unwrap(); + $( + + asset.$handle_name = load_context.load(&asset.$string_name); + )* + $( + for i in 0..asset.$string_array_name.len(){ + asset.$handle_array_name.push(load_context.load(&asset.$string_array_name[i])); + } + )? + return Ok(asset); } fn extensions(&self) -> &[&str] { diff --git a/engine/world_generation/Cargo.toml b/engine/world_generation/Cargo.toml index 0cfbe81..5232c4c 100644 --- a/engine/world_generation/Cargo.toml +++ b/engine/world_generation/Cargo.toml @@ -17,6 +17,7 @@ bevy_asset_loader = { version = "0.21.0", features = [ "standard_dynamic_assets", "3d", ] } +ron = "0.8.1" [features] tracing = ["bevy/trace_tracy"] diff --git a/engine/world_generation/src/biome_asset.rs b/engine/world_generation/src/biome_asset.rs index f612a47..de03692 100644 --- a/engine/world_generation/src/biome_asset.rs +++ b/engine/world_generation/src/biome_asset.rs @@ -26,8 +26,7 @@ create_asset_loader!( BiomeAssetPlugin, BiomeAssetLoader, BiomeAsset, - BiomeAssetLoadState, - &["bimoe.json"], + &["biome", "biome.ron"], tile_mapper_path -> tile_mapper ; ? diff --git a/engine/world_generation/src/tile_manager.rs b/engine/world_generation/src/tile_manager.rs index 2fd48af..41d0a3d 100644 --- a/engine/world_generation/src/tile_manager.rs +++ b/engine/world_generation/src/tile_manager.rs @@ -33,4 +33,4 @@ pub struct TileAsset { pub side_texture: String, } -create_asset_loader!(TileAssetPlugin, TileAssetLoader, TileAsset, TileAssetLoadState, &["tile.json"],;?); +create_asset_loader!(TileAssetPlugin, TileAssetLoader, TileAsset, &["tile", "tile.ron"],;?); diff --git a/engine/world_generation/src/tile_mapper.rs b/engine/world_generation/src/tile_mapper.rs index 2611f83..a901f2b 100644 --- a/engine/world_generation/src/tile_mapper.rs +++ b/engine/world_generation/src/tile_mapper.rs @@ -31,8 +31,7 @@ create_asset_loader!( TileMapperAssetPlugin, TileMapperAssetLoader, TileMapperAsset, - TileMapperLoadState, - &["mapper.json"],; + &["mapper", "mapper.ron"],; tiles_path -> tiles ? ); diff --git a/game/buildings/Cargo.toml b/game/buildings/Cargo.toml index 5d34b37..56fae66 100644 --- a/game/buildings/Cargo.toml +++ b/game/buildings/Cargo.toml @@ -13,7 +13,11 @@ bevy_rapier3d = "0.27.0" serde = { version = "1.0.204", features = ["derive"] } asset_loader = { path = "../../engine/asset_loader" } serde_json = "1.0.120" - +ron = "0.8.1" +bevy_asset_loader = { version = "0.21.0", features = [ + "standard_dynamic_assets", + "3d", +] } [features] tracing = [] diff --git a/game/buildings/src/assets/building_asset.rs b/game/buildings/src/assets/building_asset.rs index 339f01f..3911809 100644 --- a/game/buildings/src/assets/building_asset.rs +++ b/game/buildings/src/assets/building_asset.rs @@ -23,8 +23,7 @@ create_asset_loader!( BuildingAssetPlugin, BuildingAssetLoader, BuildingAsset, - BuildingAssetLoadState, - &["building.json"], + &["building", "building.ron"], prefab_path -> prefab ;? ); diff --git a/game/buildings/src/assets/building_database.rs b/game/buildings/src/assets/building_database.rs index 2a564b4..9a08edd 100644 --- a/game/buildings/src/assets/building_database.rs +++ b/game/buildings/src/assets/building_database.rs @@ -1,28 +1,11 @@ -use asset_loader::create_asset_loader; -use bevy::prelude::Resource; -use serde::{Deserialize, Serialize}; +use bevy::{asset::Handle, prelude::Resource}; use super::building_asset::BuildingAsset; +use bevy::prelude::*; +use bevy_asset_loader::prelude::*; -#[derive(Resource)] -pub struct BuildingDatabase{ - pub handle: Handle -} - -#[derive(Serialize, Deserialize, Debug, TypePath, Asset)] -pub struct BuildingDatabaseAsset { - pub hq: u32, - pub buildings_paths: Vec, - #[serde(skip)] +#[derive(Resource, AssetCollection)] +pub struct BuildingDatabase { + #[asset(key = "buildings", collection(typed))] pub buildings: Vec>, } - -create_asset_loader!( - BuildingDatabasePlugin, - BuildingDatabaseLoader, - BuildingDatabaseAsset, - BuildingDatabaseState, - &["buildings.db.json"],; - buildings_paths -> buildings - ? -); diff --git a/game/buildings/src/building_plugin.rs b/game/buildings/src/building_plugin.rs index 0b0922f..f9aeaff 100644 --- a/game/buildings/src/building_plugin.rs +++ b/game/buildings/src/building_plugin.rs @@ -1,4 +1,8 @@ use bevy::{prelude::*, window::PrimaryWindow}; +use bevy_asset_loader::loading_state::{ + config::{ConfigureLoadingState, LoadingStateConfig}, + LoadingStateAppExt, +}; use bevy_rapier3d::{pipeline::QueryFilter, plugin::RapierContext}; use shared::{ despawn::Despawn, @@ -8,10 +12,7 @@ use shared::{ use world_generation::{hex_utils::HexCoord, map::map::Map}; use crate::{ - assets::{ - building_asset::BuildingAssetPlugin, - building_database::{BuildingDatabase, BuildingDatabasePlugin}, - }, + assets::{building_asset::BuildingAssetPlugin, building_database::BuildingDatabase}, build_queue::{BuildQueue, QueueEntry}, }; @@ -20,7 +21,11 @@ pub struct BuildingPugin; impl Plugin for BuildingPugin { fn build(&self, app: &mut App) { app.insert_resource(BuildQueue::default()); - app.add_plugins(BuildingAssetPlugin).add_plugins(BuildingDatabasePlugin); + app.add_plugins(BuildingAssetPlugin); + + app.configure_loading_state( + LoadingStateConfig::new(AssetLoadState::Loading).load_collection::(), + ); app.add_systems(Startup, init.run_if(in_state(AssetLoadState::Loading))); app.add_systems(Update, hq_placement.run_if(in_state(GameplayState::PlaceHQ))); @@ -32,19 +37,11 @@ impl Plugin for BuildingPugin { #[derive(Resource)] struct IndicatorCube(Handle, Handle); -fn init( - mut commands: Commands, - mut meshes: ResMut>, - mut materials: ResMut>, - asset_server: Res, -) { +fn init(mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>) { let cube = Cuboid::from_size(Vec3::splat(1.)); let mesh_handle = meshes.add(cube); let mat_handle = materials.add(Color::WHITE); commands.insert_resource(IndicatorCube(mesh_handle, mat_handle)); - - let db = asset_server.load("buildings/buildings.db.json"); - commands.insert_resource(BuildingDatabase { handle: db }); } fn hq_placement( @@ -56,7 +53,7 @@ fn hq_placement( map: Res, indicator: Res, mut build_queue: ResMut, - next_state: ResMut>, + mut next_state: ResMut>, ) { let win = window.single(); let (cam_transform, camera) = cam_query.single(); @@ -87,6 +84,8 @@ fn hq_placement( building: 0.into(), pos: contact_coord, }); + + next_state.set(GameplayState::Playing); } } } diff --git a/game/main/Cargo.toml b/game/main/Cargo.toml index 6f59d8f..657cb9c 100644 --- a/game/main/Cargo.toml +++ b/game/main/Cargo.toml @@ -16,7 +16,11 @@ bevy_rapier3d = { version = "0.27.0", features = ["simd-stable", "parallel"] } rayon = "1.10.0" buildings = { path = "../buildings" } shared = { path = "../shared" } -bevy_asset_loader = {version ="0.21.0", features = ["standard_dynamic_assets", "3d"]} +bevy_asset_loader = { version = "0.21.0", features = [ + "standard_dynamic_assets", + "3d", +] } +ron = "0.8.1" [features] tracing = ["bevy/trace_tracy", "world_generation/tracing", "buildings/tracing"] diff --git a/game/main/assets b/game/main/assets index 03faad8..3bb0aaa 160000 --- a/game/main/assets +++ b/game/main/assets @@ -1 +1 @@ -Subproject commit 03faad886d1da6ce0f55bb323ad4cea8b4645f07 +Subproject commit 3bb0aaab5b5917c8c1f3ec4839c2269e62d17098 diff --git a/game/main/src/camera_system/camera_plugin.rs b/game/main/src/camera_system/camera_plugin.rs index 5e40d29..9a947ab 100644 --- a/game/main/src/camera_system/camera_plugin.rs +++ b/game/main/src/camera_system/camera_plugin.rs @@ -199,6 +199,9 @@ fn rts_camera_system( cam_targets.anim_time = cam_targets.anim_time.min(1.); } cam_pos.y = f32::lerp(cam_pos.y, desired_height, cam_targets.anim_time); + if cam_pos.y < min_height { + cam_pos.y = min_height; + } let t = cam_pos.y.remap(cam_cfg.min_height, cam_cfg.max_height, 0., 1.); if cam_targets.rotate_time < 1. { diff --git a/game/main/src/map_rendering/map_init.rs b/game/main/src/map_rendering/map_init.rs index dd2735d..51c3bd7 100644 --- a/game/main/src/map_rendering/map_init.rs +++ b/game/main/src/map_rendering/map_init.rs @@ -1,7 +1,6 @@ #[cfg(feature = "tracing")] use bevy::log::*; use bevy::{ - asset::LoadState, pbr::{ExtendedMaterial, NotShadowCaster}, prelude::*, }; @@ -11,7 +10,7 @@ use bevy_inspector_egui::quick::ResourceInspectorPlugin; use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; use shared::states::{AssetLoadState, GameplayState, MenuState}; use world_generation::{ - biome_asset::{BiomeAsset, BiomeAssetLoadState, BiomeAssetPlugin}, + biome_asset::{BiomeAsset, BiomeAssetPlugin}, biome_painter::*, heightmap::generate_heightmap, hex_utils::{offset_to_index, SHORT_DIAGONAL}, @@ -65,7 +64,7 @@ impl Plugin for MapInitPlugin { LoadingStateConfig::new(AssetLoadState::Loading) .with_dynamic_assets_file::("phos.assets.ron") .load_collection::() - .load_collection::() + .load_collection::(), ); app.add_systems(Startup, load_textures.run_if(in_state(AssetLoadState::FinalizeAssets)));