diff --git a/engine/world_generation/src/biome_painter.rs b/engine/world_generation/src/biome_painter.rs index a5431c2..2729fd8 100644 --- a/engine/world_generation/src/biome_painter.rs +++ b/engine/world_generation/src/biome_painter.rs @@ -1,44 +1,10 @@ use asset_loader::create_asset_loader; +use bevy::prelude::*; use bevy::{asset::Asset, reflect::TypePath, render::render_resource::encase::rts_array::Length}; use serde::{Deserialize, Serialize}; use crate::{biome_asset::BiomeAsset, map::biome_map::BiomeData}; -#[derive(Serialize, Deserialize, Debug, TypePath, Asset, Clone)] -pub struct BiomePainterAsset { - #[serde(skip)] - pub biomes: Vec>, - pub biomes_path: Vec, -} - -impl BiomePainterAsset { - pub fn sample_biome(&self, assets: &Assets, data: &BiomeData) -> AssetId { - assert!(self.biomes.length() != 0, "There are no biomes"); - let mut biome = self.biomes.first().unwrap().id(); - let mut dist = f32::INFINITY; - - for b in &self.biomes { - let asset = assets.get(b.id()).unwrap(); - let d = asset.distance(data.into()); - if d < dist { - biome = b.id(); - dist = d; - } - } - - return biome; - } - - pub fn build(&self, assets: &Assets) -> BiomePainter { - let mut biomes = Vec::with_capacity(self.biomes.len()); - for b in &self.biomes { - let asset = assets.get(b.id()).unwrap(); - biomes.push(asset.clone()); - } - return BiomePainter { biomes }; - } -} - #[derive(Resource)] pub struct BiomePainter { pub biomes: Vec, @@ -78,13 +44,13 @@ impl BiomePainter { } } -create_asset_loader!( - BiomePainterPlugin, - BiomePainterLoader, - BiomePainterAsset, - BiomePainterLoadState, - &["bimoes.json"], - ; - biomes_path -> biomes - ? -); +// create_asset_loader!( +// BiomePainterPlugin, +// BiomePainterLoader, +// BiomePainterAsset, +// BiomePainterLoadState, +// &["bimoes.json"], +// ; +// biomes_path -> biomes +// ? +// ); diff --git a/game/buildings/src/building_plugin.rs b/game/buildings/src/building_plugin.rs index ef25b05..0b0922f 100644 --- a/game/buildings/src/building_plugin.rs +++ b/game/buildings/src/building_plugin.rs @@ -22,7 +22,7 @@ impl Plugin for BuildingPugin { app.insert_resource(BuildQueue::default()); app.add_plugins(BuildingAssetPlugin).add_plugins(BuildingDatabasePlugin); - app.add_systems(Startup, init.run_if(in_state(AssetLoadState::StartLoading))); + app.add_systems(Startup, init.run_if(in_state(AssetLoadState::Loading))); app.add_systems(Update, hq_placement.run_if(in_state(GameplayState::PlaceHQ))); app.add_systems(PreUpdate, process_build_queue.run_if(in_state(GameplayState::Playing))); diff --git a/game/main/src/assets/biome_painer.rs b/game/main/src/assets/biome_painer.rs new file mode 100644 index 0000000..74d628c --- /dev/null +++ b/game/main/src/assets/biome_painer.rs @@ -0,0 +1,33 @@ +#[derive(AssetCollection, Serialize, Deserialize, Debug, TypePath, Asset, Clone)] +pub struct BiomePainterAsset { + #[asset(path)] + pub biomes: Vec>, +} + +impl BiomePainterAsset { + pub fn sample_biome(&self, assets: &Assets, data: &BiomeData) -> AssetId { + assert!(self.biomes.length() != 0, "There are no biomes"); + let mut biome = self.biomes.first().unwrap().id(); + let mut dist = f32::INFINITY; + + for b in &self.biomes { + let asset = assets.get(b.id()).unwrap(); + let d = asset.distance(data.into()); + if d < dist { + biome = b.id(); + dist = d; + } + } + + return biome; + } + + pub fn build(&self, assets: &Assets) -> BiomePainter { + let mut biomes = Vec::with_capacity(self.biomes.len()); + for b in &self.biomes { + let asset = assets.get(b.id()).unwrap(); + biomes.push(asset.clone()); + } + return BiomePainter { biomes }; + } +} diff --git a/game/main/src/assets/mod.rs b/game/main/src/assets/mod.rs new file mode 100644 index 0000000..c042661 --- /dev/null +++ b/game/main/src/assets/mod.rs @@ -0,0 +1 @@ +pub mod biome_painer; diff --git a/game/main/src/main.rs b/game/main/src/main.rs index 09a015b..4111cca 100644 --- a/game/main/src/main.rs +++ b/game/main/src/main.rs @@ -11,6 +11,7 @@ mod phos; mod prelude; mod shader_extensions; mod utlis; +pub mod assets; 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 0081eb1..8ac68cd 100644 --- a/game/main/src/map_rendering/map_init.rs +++ b/game/main/src/map_rendering/map_init.rs @@ -62,8 +62,8 @@ impl Plugin for MapInitPlugin { }, )); - app.add_systems(Startup, (load_textures, load_tiles).in_set(AssetLoaderSet)); - app.configure_sets(Startup, AssetLoaderSet.run_if(in_state(AssetLoadState::StartLoading))); + //app.add_systems(Startup, (load_textures, load_tiles).in_set(AssetLoaderSet)); + //app.configure_sets(Startup, AssetLoaderSet.run_if(in_state(AssetLoadState::StartLoading))); app.add_systems( Update, @@ -96,11 +96,9 @@ struct WaterInspect(Handle>); fn load_textures( mut commands: Commands, - asset_server: Res, + mut atlas: ResMut, mut water_materials: ResMut>>, ) { - let main_tex = asset_server.load("textures/world/Terra.png"); - let water_material = water_materials.add(ExtendedMaterial { base: StandardMaterial { base_color: Color::srgba(0., 0.5, 1., 0.8), @@ -117,12 +115,7 @@ fn load_textures( }, }); commands.insert_resource(WaterInspect(water_material.clone())); - commands.insert_resource(ChunkAtlas { - handle: main_tex, - is_loaded: false, - chunk_material_handle: Handle::default(), - water_material, - }); + atlas.water_material = water_material; } fn load_tiles( @@ -192,7 +185,6 @@ fn finalize_texture( let array_layers = image.height() / image.width(); image.reinterpret_stacked_2d_as_array(array_layers); - atlas.is_loaded = true; let chunk_material = chunk_materials.add(ExtendedMaterial { base: StandardMaterial::default(), extension: ChunkMaterial { diff --git a/game/main/src/phos.rs b/game/main/src/phos.rs index 4042106..0a1c63f 100644 --- a/game/main/src/phos.rs +++ b/game/main/src/phos.rs @@ -6,13 +6,14 @@ use bevy::{ pbr::{wireframe::WireframeConfig, CascadeShadowConfig}, prelude::*, }; +use bevy_asset_loader::prelude::*; use bevy_rapier3d::dynamics::{Ccd, RigidBody, Velocity}; use bevy_rapier3d::geometry::Collider; use bevy_rapier3d::plugin::{NoUserData, RapierPhysicsPlugin}; use buildings::BuildingPugin; use iyes_perf_ui::prelude::*; -use shared::despawn::DespawnPuglin; use shared::states::{GameplayState, MenuState}; +use shared::{despawn::DespawnPuglin, states::AssetLoadState}; pub struct PhosGamePlugin; @@ -22,13 +23,18 @@ impl Plugin for PhosGamePlugin { PhosCameraPlugin, MapInitPlugin, RenderDistancePlugin, - BuildingPugin, + // BuildingPugin, DespawnPuglin, )); - app.insert_state(MenuState::Startup); + app.insert_state(AssetLoadState::Loading); + app.insert_state(MenuState::Loading); app.insert_state(GameplayState::Waiting); + app.add_loading_state( + LoadingState::new(AssetLoadState::Loading).continue_to_state(AssetLoadState::FinalizeAssets), + ); + //Systems - Startup app.add_systems(Startup, init_game); diff --git a/game/main/src/prelude.rs b/game/main/src/prelude.rs index aef111b..d9eaf2d 100644 --- a/game/main/src/prelude.rs +++ b/game/main/src/prelude.rs @@ -2,16 +2,17 @@ use bevy::asset::Handle; use bevy::pbr::ExtendedMaterial; use bevy::prelude::*; use bevy::prelude::{Component, Image, Resource}; +use bevy_asset_loader::asset_collection::AssetCollection; use crate::shader_extensions::chunk_material::ChunkMaterial; use crate::shader_extensions::water_material::WaterMaterial; -#[derive(Resource, Default)] +#[derive(AssetCollection, Resource, Default)] pub struct ChunkAtlas { + #[asset(path = "textures/world/Terra.png")] pub handle: Handle, pub chunk_material_handle: Handle>, pub water_material: Handle>, - pub is_loaded: bool, } #[derive(Component)] diff --git a/game/shared/src/states.rs b/game/shared/src/states.rs index 9526c0b..b89bd76 100644 --- a/game/shared/src/states.rs +++ b/game/shared/src/states.rs @@ -2,9 +2,9 @@ use bevy::prelude::*; #[derive(States, Debug, Clone, PartialEq, Eq, Hash)] pub enum MenuState { + Loading, Startup, MainMenu, - Loading, InGame, Paused, } @@ -18,7 +18,6 @@ pub enum GameplayState { #[derive(States, Debug, Clone, PartialEq, Eq, Hash)] pub enum AssetLoadState { - StartLoading, Loading, FinalizeAssets, LoadComplete,