use crate::{ camera, config::{GameConfig, VsyncMode}, world::generation::{ apply_terrain_blobs, generate_chunk_fauna, generate_chunk_foliage, generate_chunk_forrestry, generate_chunk_weathering_and_precipitation, spawn_terrain_tasks, TerrainBlobStorage, }, }; use bevy::prelude::*; pub mod chunks; pub mod generation; pub mod textures; pub mod tiles; pub use chunks::management::*; pub use textures::management::*; pub use tiles::{rendering::*, visibility::*}; pub fn apply_vsync_setting(config: Res, mut windows: Query<&mut Window>) { if config.is_changed() { if let Ok(mut window) = windows.single_mut() { window.present_mode = match config.display.vsync { VsyncMode::Vsync => bevy::window::PresentMode::AutoVsync, VsyncMode::Mailbox => bevy::window::PresentMode::Mailbox, VsyncMode::Uncapped => bevy::window::PresentMode::AutoNoVsync, }; } } } pub struct WorldPlugin; impl Plugin for WorldPlugin { fn build(&self, app: &mut App) { app.init_resource::() .init_resource::() .init_resource::() .init_resource::() .init_resource::() .init_resource::() .init_resource::() .add_message::() .add_message::() .add_message::() .add_message::() .add_message::() .add_message::() .add_message::() .add_message::() .add_systems(Startup, (setup_chunk_system, setup_initial_chunks).chain()) .add_systems( FixedUpdate, ( handle_chunk_events, update_chunk_connectivity, tiles::despawn_tilemap_chunks, spawn_terrain_tasks, apply_terrain_blobs, generate_chunk_weathering_and_precipitation, generate_chunk_forrestry, generate_chunk_foliage, generate_chunk_fauna, ), ) .add_systems( Update, ( compute_visibility_of_game_entities .after(crate::entities::item::item_tile_management_system), tiles::track_benchmark, tiles::render_bench_report_system, apply_vsync_setting, handle_tile_occlusion_updates, tiles::spawn_tilemap_chunks, tiles::on_camera_z_changed, tiles::update_tilemap_chunk_visibility, tiles::populate_tilemap_chunk_data, ), ); } } fn setup_initial_chunks( mut event_writer: MessageWriter, config: Res, ) { let radius = config.initial_chunk_radius; for x in -radius..=radius { for y in -radius..=radius { event_writer.write(GenerateChunkEvent { chunk_position: IVec2::new(x, y), }); } } }