From da88483c2c905cc199797d0d4862bb37e232a45d Mon Sep 17 00:00:00 2001 From: Tomas Seniunas <> Date: Wed, 17 Jan 2024 21:39:36 +0900 Subject: [PATCH 1/5] Remove bevy_ecs_tilemap --- Cargo.lock | 11 ----------- Cargo.toml | 2 -- src/lib.rs | 1 - src/story/crater_simulation/crater/ui.rs | 1 - src/story/element/ui.rs | 1 - src/story/grid/mod.rs | 1 - src/story/nest_simulation/background.rs | 1 - src/story/nest_simulation/nest/ui.rs | 1 - 8 files changed, 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 66967c8..a96580e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -506,16 +506,6 @@ dependencies = [ "syn 2.0.38", ] -[[package]] -name = "bevy_ecs_tilemap" -version = "0.12.0" -source = "git+https://github.com/MeoMix/bevy_ecs_tilemap?branch=main#d66cf2a79106421e973b27a3b7aba7435f4c378e" -dependencies = [ - "bevy", - "log", - "regex", -] - [[package]] name = "bevy_egui" version = "0.24.0" @@ -2884,7 +2874,6 @@ name = "symbiants_pkg" version = "0.1.0" dependencies = [ "bevy", - "bevy_ecs_tilemap", "bevy_egui", "bevy_save", "bevy_turborand", diff --git a/Cargo.toml b/Cargo.toml index ef81a55..030a65a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,8 +24,6 @@ bevy = { version = "0.12.1", default-features = false, features = [ "png", ] } -bevy_ecs_tilemap = { git = "https://github.com/MeoMix/bevy_ecs_tilemap", branch = "main", features=["atlas"] } - bevy_egui = { version = "0.24.0" } bevy_save = { version = "0.13.0" } bevy_turborand = { version = "0.7.0" } diff --git a/src/lib.rs b/src/lib.rs index 6082e49..7b25c79 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,7 +11,6 @@ use bevy::{ ecs::schedule::{LogLevel, ScheduleBuildSettings}, prelude::*, }; -use bevy_ecs_tilemap::TilemapPlugin; use bevy_save::SavePlugin; use bevy_turborand::prelude::*; use core_ui::CoreUIPlugin; diff --git a/src/story/crater_simulation/crater/ui.rs b/src/story/crater_simulation/crater/ui.rs index 45e9248..1719505 100644 --- a/src/story/crater_simulation/crater/ui.rs +++ b/src/story/crater_simulation/crater/ui.rs @@ -1,5 +1,4 @@ use bevy::prelude::*; -use bevy_ecs_tilemap::tiles::TileVisible; use crate::story::common::ui::{ModelViewEntityMap, VisibleGrid}; diff --git a/src/story/element/ui.rs b/src/story/element/ui.rs index 0b44be3..32087aa 100644 --- a/src/story/element/ui.rs +++ b/src/story/element/ui.rs @@ -8,7 +8,6 @@ use crate::{ }, }; use bevy::{asset::LoadState, prelude::*, utils::hashbrown::HashSet}; -use bevy_ecs_tilemap::prelude::*; #[derive(Component)] pub struct ElementTilemap; diff --git a/src/story/grid/mod.rs b/src/story/grid/mod.rs index 5a5de90..7bdecb7 100644 --- a/src/story/grid/mod.rs +++ b/src/story/grid/mod.rs @@ -1,7 +1,6 @@ pub mod elements_cache; use bevy::prelude::*; -use bevy_ecs_tilemap::tiles::TilePos; use crate::story::common::position::Position; diff --git a/src/story/nest_simulation/background.rs b/src/story/nest_simulation/background.rs index 2453f68..f2020eb 100644 --- a/src/story/nest_simulation/background.rs +++ b/src/story/nest_simulation/background.rs @@ -1,5 +1,4 @@ use bevy::prelude::*; -use bevy_ecs_tilemap::prelude::*; use crate::{ app_state::AppState, diff --git a/src/story/nest_simulation/nest/ui.rs b/src/story/nest_simulation/nest/ui.rs index 372a0ce..a27546a 100644 --- a/src/story/nest_simulation/nest/ui.rs +++ b/src/story/nest_simulation/nest/ui.rs @@ -1,5 +1,4 @@ use bevy::{prelude::*, render::view::visibility}; -use bevy_ecs_tilemap::tiles::TileVisible; use crate::story::common::ui::{ModelViewEntityMap, VisibleGrid}; From 9844889ab8f9de5c65f3cdf839a8784edf9c87d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20Seni=C5=ABnas?= Date: Wed, 7 Feb 2024 22:16:32 +0900 Subject: [PATCH 2/5] WIP - stripping and replacing tile rendering --- Cargo.lock | 1 - assets/shaders/world.wgsl | 25 ++++ rendering/Cargo.toml | 3 - rendering/src/common/mod.rs | 9 -- rendering/src/lib.rs | 5 +- .../src/nest_rendering/background/mod.rs | 113 +----------------- rendering/src/nest_rendering/element/mod.rs | 83 ++++++------- .../nest_rendering/element/sprite_sheet.rs | 37 +++--- rendering/src/nest_rendering/mod.rs | 1 + rendering/src/nest_rendering/world/mod.rs | 5 + rendering/src/nest_rendering/world/plugin.rs | 16 +++ .../src/nest_rendering/world/world_map.rs | 21 ++++ 12 files changed, 127 insertions(+), 192 deletions(-) create mode 100644 assets/shaders/world.wgsl create mode 100644 rendering/src/nest_rendering/world/mod.rs create mode 100644 rendering/src/nest_rendering/world/plugin.rs create mode 100644 rendering/src/nest_rendering/world/world_map.rs diff --git a/Cargo.lock b/Cargo.lock index 9d91dd9..105cf2a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2683,7 +2683,6 @@ name = "rendering" version = "0.1.0" dependencies = [ "bevy", - "bevy_ecs_tilemap", "bevy_turborand", "simulation", ] diff --git a/assets/shaders/world.wgsl b/assets/shaders/world.wgsl new file mode 100644 index 0000000..a22eeec --- /dev/null +++ b/assets/shaders/world.wgsl @@ -0,0 +1,25 @@ +#import bevy_sprite::mesh2d_bindings::mesh + +struct MapData { + world_size: vec2, + tile_size: vec2 + atlas_size: vec2, + +} + +@group(1) @binding(0) +var map: MapData; + +@group(1) @binding(1) +var atlas_texture: texture2d; + +#import bevy_sprite::mesh2d_bindings::{Vertex, VertexOutput} + +@vertex +fn vertex_main(in: VertexInput) -> VertexOutput { + var out: VertexOutput; + out.position = map.tile_size * in.position; + out.uv = in.uv * map.atlas_size; + return out; +} + diff --git a/rendering/Cargo.toml b/rendering/Cargo.toml index 2c97084..da131f8 100644 --- a/rendering/Cargo.toml +++ b/rendering/Cargo.toml @@ -19,7 +19,4 @@ bevy = { version = "0.12.1", default-features = false, features = [ "default_font", "png", ] } -bevy_ecs_tilemap = { git = "https://github.com/MeoMix/bevy_ecs_tilemap", branch = "main", features = [ - "atlas", -] } bevy_turborand = { version = "0.7.0" } diff --git a/rendering/src/common/mod.rs b/rendering/src/common/mod.rs index eab7a9d..16d8595 100644 --- a/rendering/src/common/mod.rs +++ b/rendering/src/common/mod.rs @@ -1,5 +1,4 @@ use bevy::{prelude::*, utils::HashMap}; -use bevy_ecs_tilemap::tiles::TilePos; use simulation::common::{grid::Grid, position::Position, Zone}; @@ -212,11 +211,3 @@ pub fn on_despawn( } } } - -// TODO: Better home? -pub fn grid_to_tile_pos(grid: &Grid, position: Position) -> TilePos { - TilePos { - x: position.x as u32, - y: (grid.height() - position.y - 1) as u32, - } -} diff --git a/rendering/src/lib.rs b/rendering/src/lib.rs index d740da7..b992e22 100644 --- a/rendering/src/lib.rs +++ b/rendering/src/lib.rs @@ -37,10 +37,11 @@ use self::{ cleanup_pheromones, on_spawn_pheromone, on_update_pheromone_visibility, rerender_pheromones, }, + world::plugin::WorldViewPlugin, }, }; use bevy::prelude::*; -use bevy_ecs_tilemap::TilemapPlugin; +use nest_rendering::ant::emote::{on_added_ant_emote, on_removed_ant_emote}; use pointer::{handle_pointer_tap, initialize_pointer_resources, remove_pointer_resources}; use simulation::{ app_state::AppState, @@ -67,7 +68,7 @@ pub struct RenderingPlugin; /// This occurs because the simulation may tick multiple times before rendering systems run. impl Plugin for RenderingPlugin { fn build(&self, app: &mut App) { - app.add_plugins((RenderingCameraPlugin, TilemapPlugin)); + app.add_plugins((RenderingCameraPlugin, WorldViewPlugin)); app.add_state::(); // Keep this off to prevent spritesheet bleed at various `projection.scale` levels. diff --git a/rendering/src/nest_rendering/background/mod.rs b/rendering/src/nest_rendering/background/mod.rs index 6c8680d..113f1aa 100644 --- a/rendering/src/nest_rendering/background/mod.rs +++ b/rendering/src/nest_rendering/background/mod.rs @@ -1,6 +1,6 @@ use bevy::prelude::*; -use crate::common::{grid_to_tile_pos, VisibleGrid}; +use crate::common::VisibleGrid; use simulation::{ app_state::AppState, @@ -95,7 +95,6 @@ fn get_sky_gradient_color( } pub fn update_sky_background( - mut sky_tile_query: Query<(&mut TileColor, &Position), With>, // TODO: Relying on Local<> while trying to support "Reset Sandbox" without the ability to remove systems entirely is challenging. // Probably rewrite this to be a resource instead of a Local. mut last_run_time_info: Local, @@ -142,129 +141,21 @@ pub fn update_sky_background( sunrise_decimal_hours, sunset_decimal_hours, ); - for (mut tile_color, position) in sky_tile_query.iter_mut() { - let t_y: f32 = position.y as f32 / nest.surface_level() as f32; - let color = interpolate_color(north_color, south_color, t_y); - - *tile_color = color.into(); - } *last_run_time_info = time_info; } pub fn spawn_background_tilemap(mut commands: Commands, nest_query: Query<&Grid, With>) { - let grid = nest_query.single(); - - let map_size = TilemapSize { - x: grid.width() as u32, - y: grid.height() as u32, - }; - let grid_size = TilemapGridSize { x: 1.0, y: 1.0 }; - let map_type = TilemapType::default(); - - commands.spawn(( - BackgroundTilemap, - TilemapBundle { - grid_size, - size: map_size, - storage: TileStorage::empty(map_size), - physical_tile_size: TilemapPhysicalTileSize { x: 1.0, y: 1.0 }, - // Doesn't need to be 128x128 here since not reading from spritesheet. - tile_size: TilemapTileSize { x: 1.0, y: 1.0 }, - map_type: TilemapType::Square, - // Background tiles go at z: 0 because they should render behind elements/ants. - transform: get_tilemap_center_transform(&map_size, &grid_size, &map_type, 0.0), - ..Default::default() - }, - )); + } // Spawn non-interactive background (sky blue / tunnel brown) pub fn spawn_background( mut commands: Commands, nest_query: Query<(&Grid, &Nest)>, - mut tilemap_query: Query<(Entity, &mut TileStorage), With>, story_time: Res, ) { - let (grid, nest) = nest_query.single(); - let air_height = nest.surface_level() + 1; - - let (tilemap_entity, mut tile_storage) = tilemap_query.single_mut(); - let current_decimal_hours = story_time.as_time_info().get_decimal_hours(); - let (sunrise_decimal_hours, sunset_decimal_hours) = - story_time.get_sunrise_sunset_decimal_hours(); - - let (north_color, south_color) = get_sky_gradient_color( - current_decimal_hours, - sunrise_decimal_hours, - sunset_decimal_hours, - ); - - let width = grid.width(); - let height = air_height; - - for x in 0..width { - for y in 0..height { - let position = Position::new(x, y); - - let t_y: f32 = position.y as f32 / nest.surface_level() as f32; - let color = interpolate_color(north_color, south_color, t_y); - let tile_pos = grid_to_tile_pos(grid, position); - - let tile_entity = commands - .spawn(( - TileBundle { - position: tile_pos, - tilemap_id: TilemapId(tilemap_entity), - color: color.into(), - ..default() - }, - position, - SkyBackground, - Background, - AtNest, - )) - .id(); - - tile_storage.set(&tile_pos, tile_entity); - } - } - - // Create background sprites - let width = grid.width(); - let height = grid.height() - air_height; - let y_offset = air_height; - - let top_color: Color = Color::rgba(0.373, 0.290, 0.165, 1.0); - let bottom_color = Color::rgba(0.24, 0.186, 0.106, 1.0); - - for x in 0..width { - for y in 0..height { - let position = Position::new(x, y + y_offset); - - let color = interpolate_color(top_color, bottom_color, y as f32 / height as f32); - - let tile_pos = grid_to_tile_pos(grid, position); - - let tile_entity = commands - .spawn(( - TileBundle { - position: tile_pos, - tilemap_id: TilemapId(tilemap_entity), - color: color.into(), - ..default() - }, - position, - TunnelBackground, - Background, - AtNest, - )) - .id(); - - tile_storage.set(&tile_pos, tile_entity); - } - } } pub fn cleanup_background() { diff --git a/rendering/src/nest_rendering/element/mod.rs b/rendering/src/nest_rendering/element/mod.rs index a6836a1..359d3f7 100644 --- a/rendering/src/nest_rendering/element/mod.rs +++ b/rendering/src/nest_rendering/element/mod.rs @@ -1,9 +1,8 @@ pub mod sprite_sheet; use self::sprite_sheet::{get_element_index, ElementTilemap}; -use crate::common::{grid_to_tile_pos, ModelViewEntityMap, VisibleGrid}; +use crate::common::{ModelViewEntityMap, VisibleGrid}; use bevy::prelude::*; -use bevy_ecs_tilemap::prelude::*; use simulation::{ common::{grid::Grid, position::Position}, nest_simulation::{ @@ -21,7 +20,6 @@ pub fn on_spawn_element( >, nest_query: Query<&Grid, With>, mut commands: Commands, - mut tilemap_query: Query<(Entity, &mut TileStorage), With>, mut model_view_entity_map: ResMut, visible_grid: Res, ) { @@ -47,7 +45,6 @@ pub fn on_spawn_element( element_exposure, &grid, &mut commands, - &mut tilemap_query, &mut model_view_entity_map, ); } @@ -61,7 +58,6 @@ pub fn on_update_element_position( element_query: Query<(Ref, Entity), (With, Without)>, nest_query: Query<&Grid, With>, mut commands: Commands, - mut tilemap_query: Query<&mut TileStorage, With>, model_view_entity_map: Res, visible_grid: Res, ) { @@ -77,25 +73,25 @@ pub fn on_update_element_position( Err(_) => return, }; - let mut tile_storage = tilemap_query.single_mut(); - - for (element_position, element_model_entity) in element_query.iter() { - // `on_spawn_element` handles `Added` - if element_position.is_added() || !element_position.is_changed() { - continue; - } - - let element_view_entity = match model_view_entity_map.get(&element_model_entity) { - Some(&element_view_entity) => element_view_entity, - None => panic!("Expected to find view entity for model entity."), - }; - - let tile_pos = grid_to_tile_pos(grid, *element_position); - commands.entity(element_view_entity).insert(tile_pos); - // NOTE: This leaves the previous `tile_pos` stale, but that's fine because it's just Air which isn't rendered. - // TODO: Consider benefits of tracking PreviousPosition in Element and using that to clear stale tile_pos. - tile_storage.set(&tile_pos, element_view_entity); - } + // let mut tile_storage = tilemap_query.single_mut(); + + // for (element_position, element_model_entity) in element_query.iter() { + // // `on_spawn_element` handles `Added` + // if element_position.is_added() || !element_position.is_changed() { + // continue; + // } + + // let element_view_entity = match model_view_entity_map.get(&element_model_entity) { + // Some(&element_view_entity) => element_view_entity, + // None => panic!("Expected to find view entity for model entity."), + // }; + + // let tile_pos = grid_to_tile_pos(grid, *element_position); + // commands.entity(element_view_entity).insert(tile_pos); + // // NOTE: This leaves the previous `tile_pos` stale, but that's fine because it's just Air which isn't rendered. + // // TODO: Consider benefits of tracking PreviousPosition in Element and using that to clear stale tile_pos. + // tile_storage.set(&tile_pos, element_view_entity); + // } } /// When an Element model has its ElementExposure updated, reflect the change in Position by updating the TileTextureIndex @@ -130,10 +126,6 @@ pub fn on_update_element_exposure( Some(&element_view_entity) => element_view_entity, None => panic!("Expected to find view entity for model entity."), }; - - let texture_index = TileTextureIndex(get_element_index(*element_exposure, *element) as u32); - - commands.entity(element_view_entity).insert(texture_index); } } @@ -147,7 +139,6 @@ pub fn rerender_elements( >, nest_query: Query<&Grid, With>, mut commands: Commands, - mut tilemap_query: Query<(Entity, &mut TileStorage), With>, mut model_view_entity_map: ResMut, ) { let grid = nest_query.single(); @@ -160,7 +151,6 @@ pub fn rerender_elements( element_exposure, &grid, &mut commands, - &mut tilemap_query, &mut model_view_entity_map, ); } @@ -180,23 +170,22 @@ fn spawn_element_sprite( element_exposure: &ElementExposure, grid: &Grid, commands: &mut Commands, - tilemap_query: &mut Query<(Entity, &mut TileStorage), With>, model_view_entity_map: &mut ResMut, ) { - let (tilemap_entity, mut tile_storage) = tilemap_query.single_mut(); - let tile_pos = grid_to_tile_pos(grid, *element_position); - - let tile_bundle = ( - AtNest, - TileBundle { - position: tile_pos, - tilemap_id: TilemapId(tilemap_entity), - texture_index: TileTextureIndex(get_element_index(*element_exposure, *element) as u32), - ..default() - }, - ); - - let element_view_entity = commands.spawn(tile_bundle).id(); - model_view_entity_map.insert(element_model_entity, element_view_entity); - tile_storage.set(&tile_pos, element_view_entity); + // let (tilemap_entity, mut tile_storage) = tilemap_query.single_mut(); + // let tile_pos = grid_to_tile_pos(grid, *element_position); + + // let tile_bundle = ( + // AtNest, + // TileBundle { + // position: tile_pos, + // tilemap_id: TilemapId(tilemap_entity), + // texture_index: TileTextureIndex(get_element_index(*element_exposure, *element) as u32), + // ..default() + // }, + // ); + + // let element_view_entity = commands.spawn(tile_bundle).id(); + // model_view_entity_map.insert(element_model_entity, element_view_entity); + // tile_storage.set(&tile_pos, element_view_entity); } diff --git a/rendering/src/nest_rendering/element/sprite_sheet.rs b/rendering/src/nest_rendering/element/sprite_sheet.rs index d40ce91..ea99cb5 100644 --- a/rendering/src/nest_rendering/element/sprite_sheet.rs +++ b/rendering/src/nest_rendering/element/sprite_sheet.rs @@ -1,5 +1,4 @@ use bevy::{asset::LoadState, prelude::*}; -use bevy_ecs_tilemap::prelude::*; use simulation::{ app_state::AppState, @@ -46,25 +45,25 @@ pub fn check_element_sprite_sheet_loaded( // TODO: I'm not convinced I should spawn ElementTilemap here. // Creating a Tilemap from resources is distinct from loading its associated assets. - let grid_size = TilemapGridSize { x: 1.0, y: 1.0 }; - let map_type = TilemapType::default(); - let map_size = TilemapSize { x: 144, y: 144 }; + // let grid_size = TilemapGridSize { x: 1.0, y: 1.0 }; + // let map_type = TilemapType::default(); + // let map_size = TilemapSize { x: 144, y: 144 }; - commands.spawn(( - ElementTilemap, - TilemapBundle { - grid_size, - map_type, - size: map_size, - storage: TileStorage::empty(map_size), - texture: TilemapTexture::Single(element_sprite_sheet_handle.0.clone()), - tile_size: TilemapTileSize { x: 128.0, y: 128.0 }, - physical_tile_size: TilemapPhysicalTileSize { x: 1.0, y: 1.0 }, - // Element tiles go at z: 1 because they should appear above the background which is rendered at z: 0. - transform: get_tilemap_center_transform(&map_size, &grid_size, &map_type, 1.0), - ..default() - }, - )); + // commands.spawn(( + // ElementTilemap, + // TilemapBundle { + // grid_size, + // map_type, + // size: map_size, + // storage: TileStorage::empty(map_size), + // texture: TilemapTexture::Single(element_sprite_sheet_handle.0.clone()), + // tile_size: TilemapTileSize { x: 128.0, y: 128.0 }, + // physical_tile_size: TilemapPhysicalTileSize { x: 1.0, y: 1.0 }, + // // Element tiles go at z: 1 because they should appear above the background which is rendered at z: 0. + // transform: get_tilemap_center_transform(&map_size, &grid_size, &map_type, 1.0), + // ..default() + // }, + // )); next_state.set(AppState::TryLoadSave); } diff --git a/rendering/src/nest_rendering/mod.rs b/rendering/src/nest_rendering/mod.rs index 923a981..85805b9 100644 --- a/rendering/src/nest_rendering/mod.rs +++ b/rendering/src/nest_rendering/mod.rs @@ -3,3 +3,4 @@ pub mod background; pub mod element; pub mod nest; pub mod pheromone; +pub mod world; diff --git a/rendering/src/nest_rendering/world/mod.rs b/rendering/src/nest_rendering/world/mod.rs new file mode 100644 index 0000000..ba85457 --- /dev/null +++ b/rendering/src/nest_rendering/world/mod.rs @@ -0,0 +1,5 @@ +pub mod world_map; +pub use self::world_map::WorldMap; + +pub mod plugin; +pub use self::plugin::WorldViewPlugin; diff --git a/rendering/src/nest_rendering/world/plugin.rs b/rendering/src/nest_rendering/world/plugin.rs new file mode 100644 index 0000000..3c612ab --- /dev/null +++ b/rendering/src/nest_rendering/world/plugin.rs @@ -0,0 +1,16 @@ +use bevy::{prelude::*, sprite::Material2dPlugin}; + +use super::world_map::WorldMap; + +#[derive(Default)] +pub struct WorldViewPlugin; + +impl Plugin for WorldViewPlugin { + fn build(&self, app: &mut App) { + app.add_plugins(Material2dPlugin::::default()); + // app.add_systems( + // Update, + // ().chain(), //TODO: Put in setup stuff here when implemented + // ) + } +} \ No newline at end of file diff --git a/rendering/src/nest_rendering/world/world_map.rs b/rendering/src/nest_rendering/world/world_map.rs new file mode 100644 index 0000000..38953ff --- /dev/null +++ b/rendering/src/nest_rendering/world/world_map.rs @@ -0,0 +1,21 @@ +use bevy::{ + math::vec2, + ecs::reflect, prelude::*, render::render_resource::{ + AsBindGroup, ShaderRef + }, sprite::Material2d +}; + +#[derive(Component, Asset, Default, Debug, Clone, Reflect, AsBindGroup)] +#[reflect(Component)] +pub struct WorldMap { + pub world_size: UVec2, + pub tile_size: Vec2, + pub atlas_size: Vec2, + +} + +impl Material2d for WorldMap { + fn fragment_shader() -> ShaderRef { + "shaders/world.wgsl".into() + } +} \ No newline at end of file From 436c1dde2bfc7b798943ad80ca78a18b08955786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20Seni=C5=ABnas?= <> Date: Thu, 8 Feb 2024 12:06:28 +0900 Subject: [PATCH 3/5] Fixed bad merge lines --- rendering/src/lib.rs | 1 - simulation/src/common/grid/mod.rs | 2 -- src/lib.rs | 16 +--------------- 3 files changed, 1 insertion(+), 18 deletions(-) diff --git a/rendering/src/lib.rs b/rendering/src/lib.rs index b992e22..9263126 100644 --- a/rendering/src/lib.rs +++ b/rendering/src/lib.rs @@ -41,7 +41,6 @@ use self::{ }, }; use bevy::prelude::*; -use nest_rendering::ant::emote::{on_added_ant_emote, on_removed_ant_emote}; use pointer::{handle_pointer_tap, initialize_pointer_resources, remove_pointer_resources}; use simulation::{ app_state::AppState, diff --git a/simulation/src/common/grid/mod.rs b/simulation/src/common/grid/mod.rs index 4ff129d..581a29c 100644 --- a/simulation/src/common/grid/mod.rs +++ b/simulation/src/common/grid/mod.rs @@ -2,8 +2,6 @@ pub mod elements_cache; use bevy::prelude::*; -use crate::story::common::position::Position; - use self::elements_cache::ElementsCache; use crate::common::position::Position; use bevy::prelude::*; diff --git a/src/lib.rs b/src/lib.rs index 6fc0b67..8f76348 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,18 +1,4 @@ -mod app_state; -mod core_ui; -mod main_camera; -mod main_menu; -mod save; -mod settings; -mod story; - -use app_state::AppState; -use bevy::{ - asset::AssetMetaCheck, - ecs::schedule::{LogLevel, ScheduleBuildSettings}, - prelude::*, -}; -use bevy_save::SavePlugin; +use bevy::{asset::AssetMetaCheck, prelude::*}; use bevy_turborand::prelude::*; use rendering::RenderingPlugin; use simulation::SimulationPlugin; From 4cbcebb5db56ea22cdfb6b73a1840b61731d2266 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20Seni=C5=ABnas?= <> Date: Thu, 8 Feb 2024 12:08:34 +0900 Subject: [PATCH 4/5] Removed even more element rendering code --- rendering/src/lib.rs | 16 +- rendering/src/nest_rendering/element/mod.rs | 179 ------------------ rendering/src/nest_rendering/world/mod.rs | 15 +- rendering/src/nest_rendering/world/plugin.rs | 16 -- .../src/nest_rendering/world/world_map.rs | 45 ++++- 5 files changed, 55 insertions(+), 216 deletions(-) delete mode 100644 rendering/src/nest_rendering/world/plugin.rs diff --git a/rendering/src/lib.rs b/rendering/src/lib.rs index 9263126..691165f 100644 --- a/rendering/src/lib.rs +++ b/rendering/src/lib.rs @@ -25,19 +25,15 @@ use self::{ cleanup_background, spawn_background, spawn_background_tilemap, update_sky_background, Background, BackgroundTilemap, }, - element::{ - cleanup_elements, on_spawn_element, on_update_element_exposure, - on_update_element_position, rerender_elements, - sprite_sheet::{ - check_element_sprite_sheet_loaded, start_load_element_sprite_sheet, ElementTilemap, - }, + element::sprite_sheet::{ + check_element_sprite_sheet_loaded, start_load_element_sprite_sheet, ElementTilemap, }, nest::{mark_nest_hidden, mark_nest_visible}, pheromone::{ cleanup_pheromones, on_spawn_pheromone, on_update_pheromone_visibility, rerender_pheromones, }, - world::plugin::WorldViewPlugin, + world::WorldViewPlugin, }, }; use bevy::prelude::*; @@ -160,7 +156,7 @@ fn build_nest_systems(app: &mut App) { Update, ( // Spawn - (on_spawn_ant, on_spawn_element, on_spawn_pheromone), + (on_spawn_ant, on_spawn_pheromone), // Despawn ( on_despawn::, @@ -186,8 +182,6 @@ fn build_nest_systems(app: &mut App) { ), on_ant_wake_up, on_tick_emote, - on_update_element_position, - on_update_element_exposure, on_update_pheromone_visibility, ), ) @@ -202,7 +196,6 @@ fn build_nest_systems(app: &mut App) { ( (spawn_background_tilemap, apply_deferred, spawn_background).chain(), rerender_ants, - rerender_elements, rerender_pheromones, mark_nest_visible, ) @@ -234,7 +227,6 @@ fn build_nest_systems(app: &mut App) { cleanup_ants, despawn_view_by_model::, despawn_view::, - cleanup_elements, despawn_view_by_model::, cleanup_pheromones, ) diff --git a/rendering/src/nest_rendering/element/mod.rs b/rendering/src/nest_rendering/element/mod.rs index 359d3f7..5221cb6 100644 --- a/rendering/src/nest_rendering/element/mod.rs +++ b/rendering/src/nest_rendering/element/mod.rs @@ -10,182 +10,3 @@ use simulation::{ nest::{AtNest, Nest}, }, }; - -/// When an Element model is added to the simulation, render an associated Element sprite. -/// This *only* handles the initial rendering of the Element sprite. Updates are handled by other systems. -pub fn on_spawn_element( - mut element_query: Query< - (&Position, &Element, &ElementExposure, Entity), - (Added, With, Without), - >, - nest_query: Query<&Grid, With>, - mut commands: Commands, - mut model_view_entity_map: ResMut, - visible_grid: Res, -) { - let visible_grid_entity = match visible_grid.0 { - Some(visible_grid_entity) => visible_grid_entity, - None => return, - }; - - // Early exit when Nest isn't visible because there's no view to update. - // Exit, rather than skipping system run, to prevent change detection from becoming backlogged. - let grid = match nest_query.get(visible_grid_entity) { - Ok(grid) => grid, - Err(_) => return, - }; - - for (element_position, element, element_exposure, element_model_entity) in - element_query.iter_mut() - { - spawn_element_sprite( - element_model_entity, - element, - element_position, - element_exposure, - &grid, - &mut commands, - &mut model_view_entity_map, - ); - } -} - -/// When an Element model has its Position updated, reflect the change in Position by updating the Translation -/// on its associated view. Update TileStorage to reflect the change in position, too. -/// This does not include the initial spawn of the Element model, which is handled by `on_spawn_element`. -/// This relies on Ref instead of Changed to be able to filter against `is_added()` -pub fn on_update_element_position( - element_query: Query<(Ref, Entity), (With, Without)>, - nest_query: Query<&Grid, With>, - mut commands: Commands, - model_view_entity_map: Res, - visible_grid: Res, -) { - let visible_grid_entity = match visible_grid.0 { - Some(visible_grid_entity) => visible_grid_entity, - None => return, - }; - - // Early exit when Nest isn't visible because there's no view to update. - // Exit, rather than skipping system run, to prevent change detection from becoming backlogged. - let grid = match nest_query.get(visible_grid_entity) { - Ok(grid) => grid, - Err(_) => return, - }; - - // let mut tile_storage = tilemap_query.single_mut(); - - // for (element_position, element_model_entity) in element_query.iter() { - // // `on_spawn_element` handles `Added` - // if element_position.is_added() || !element_position.is_changed() { - // continue; - // } - - // let element_view_entity = match model_view_entity_map.get(&element_model_entity) { - // Some(&element_view_entity) => element_view_entity, - // None => panic!("Expected to find view entity for model entity."), - // }; - - // let tile_pos = grid_to_tile_pos(grid, *element_position); - // commands.entity(element_view_entity).insert(tile_pos); - // // NOTE: This leaves the previous `tile_pos` stale, but that's fine because it's just Air which isn't rendered. - // // TODO: Consider benefits of tracking PreviousPosition in Element and using that to clear stale tile_pos. - // tile_storage.set(&tile_pos, element_view_entity); - // } -} - -/// When an Element model has its ElementExposure updated, reflect the change in Position by updating the TileTextureIndex -/// on its associated view. -/// This does not include the initial spawn of the Element model, which is handled by `on_spawn_element`. -/// This relies on Ref instead of Changed to be able to filter against `is_added()` -pub fn on_update_element_exposure( - element_query: Query<(Ref, &Element, Entity), (With, Without)>, - nest_query: Query<&Grid, With>, - mut commands: Commands, - model_view_entity_map: Res, - visible_grid: Res, -) { - let visible_grid_entity = match visible_grid.0 { - Some(visible_grid_entity) => visible_grid_entity, - None => return, - }; - - // Early exit when Nest isn't visible because there's no view to update. - // Exit, rather than skipping system run, to prevent change detection from becoming backlogged. - if nest_query.get(visible_grid_entity).is_err() { - return; - } - - for (element_exposure, element, element_model_entity) in element_query.iter() { - // `on_spawn_element` handles `Added` - if element_exposure.is_added() || !element_exposure.is_changed() { - continue; - } - - let element_view_entity = match model_view_entity_map.get(&element_model_entity) { - Some(&element_view_entity) => element_view_entity, - None => panic!("Expected to find view entity for model entity."), - }; - } -} - -/// When user switches to a different scene (Nest->Crater) all Nest views are despawned. -/// Thus, when switching back to Nest, all Elements need to be redrawn once. Their underlying models -/// have not been changed or added, though, so a separate rerender system is needed. -pub fn rerender_elements( - mut element_query: Query< - (&Position, &Element, &ElementExposure, Entity), - (With, Without), - >, - nest_query: Query<&Grid, With>, - mut commands: Commands, - mut model_view_entity_map: ResMut, -) { - let grid = nest_query.single(); - - for (element_position, element, element_exposure, entity) in element_query.iter_mut() { - spawn_element_sprite( - entity, - element, - element_position, - element_exposure, - &grid, - &mut commands, - &mut model_view_entity_map, - ); - } -} - -pub fn cleanup_elements() { - // TODO: remove ElementTextureAtlasHandle and ElementSpriteSheetHandle if committing to the full cleanup process -} - -/// Non-System Helper Functions: - -/// Spawn an Element Sprite at the given Position. Update ModelViewEntityMap and TileStorage to reflect the new view. -fn spawn_element_sprite( - element_model_entity: Entity, - element: &Element, - element_position: &Position, - element_exposure: &ElementExposure, - grid: &Grid, - commands: &mut Commands, - model_view_entity_map: &mut ResMut, -) { - // let (tilemap_entity, mut tile_storage) = tilemap_query.single_mut(); - // let tile_pos = grid_to_tile_pos(grid, *element_position); - - // let tile_bundle = ( - // AtNest, - // TileBundle { - // position: tile_pos, - // tilemap_id: TilemapId(tilemap_entity), - // texture_index: TileTextureIndex(get_element_index(*element_exposure, *element) as u32), - // ..default() - // }, - // ); - - // let element_view_entity = commands.spawn(tile_bundle).id(); - // model_view_entity_map.insert(element_model_entity, element_view_entity); - // tile_storage.set(&tile_pos, element_view_entity); -} diff --git a/rendering/src/nest_rendering/world/mod.rs b/rendering/src/nest_rendering/world/mod.rs index ba85457..d801096 100644 --- a/rendering/src/nest_rendering/world/mod.rs +++ b/rendering/src/nest_rendering/world/mod.rs @@ -1,5 +1,14 @@ pub mod world_map; -pub use self::world_map::WorldMap; +pub use self::world_map::{initialize_world_assets, WorldMap}; -pub mod plugin; -pub use self::plugin::WorldViewPlugin; +use bevy::{prelude::*, sprite::Material2dPlugin}; + +#[derive(Default)] +pub struct WorldViewPlugin; + +impl Plugin for WorldViewPlugin { + fn build(&self, app: &mut App) { + app.add_plugins(Material2dPlugin::::default()); + app.add_systems(Update, initialize_world_assets); + } +} diff --git a/rendering/src/nest_rendering/world/plugin.rs b/rendering/src/nest_rendering/world/plugin.rs deleted file mode 100644 index 3c612ab..0000000 --- a/rendering/src/nest_rendering/world/plugin.rs +++ /dev/null @@ -1,16 +0,0 @@ -use bevy::{prelude::*, sprite::Material2dPlugin}; - -use super::world_map::WorldMap; - -#[derive(Default)] -pub struct WorldViewPlugin; - -impl Plugin for WorldViewPlugin { - fn build(&self, app: &mut App) { - app.add_plugins(Material2dPlugin::::default()); - // app.add_systems( - // Update, - // ().chain(), //TODO: Put in setup stuff here when implemented - // ) - } -} \ No newline at end of file diff --git a/rendering/src/nest_rendering/world/world_map.rs b/rendering/src/nest_rendering/world/world_map.rs index 38953ff..1532b97 100644 --- a/rendering/src/nest_rendering/world/world_map.rs +++ b/rendering/src/nest_rendering/world/world_map.rs @@ -1,8 +1,9 @@ +use std::panic::AssertUnwindSafe; + use bevy::{ - math::vec2, - ecs::reflect, prelude::*, render::render_resource::{ - AsBindGroup, ShaderRef - }, sprite::Material2d + prelude::*, + render::render_resource::{AsBindGroup, ShaderRef}, + sprite::Material2d, }; #[derive(Component, Asset, Default, Debug, Clone, Reflect, AsBindGroup)] @@ -11,11 +12,43 @@ pub struct WorldMap { pub world_size: UVec2, pub tile_size: Vec2, pub atlas_size: Vec2, - + pub tile_atlas: Handle, } impl Material2d for WorldMap { fn fragment_shader() -> ShaderRef { "shaders/world.wgsl".into() } -} \ No newline at end of file +} + +impl WorldMap { + pub fn new( + world_size: UVec2, + tile_size: Vec2, + atlas_size: Vec2, + tile_atlas: Handle, + ) -> Self { + Self { + world_size, + tile_size, + atlas_size, + tile_atlas, + } + } +} + +pub fn initialize_world_assets( + map: ResMut>, + map_handles: Query<&Handle>, + mut images: ResMut>, + mut ev_asset: EventReader>, +) { + for ev in ev_asset.iter() { + for handle in map_handles.iter() { + let Some(map) = map.get(handle) else { + /* World has no texture atlas */ + continue; + }; + } + } +} From 7c67b63461a65b2eb49e7a3a55424bfb7f61ab7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20Seni=C5=ABnas?= <> Date: Thu, 8 Feb 2024 16:56:48 +0900 Subject: [PATCH 5/5] Restructuring tile rendering for shader use --- rendering/src/nest_rendering/world/mod.rs | 6 +- .../src/nest_rendering/world/world_map.rs | 106 +++++++++++++----- 2 files changed, 80 insertions(+), 32 deletions(-) diff --git a/rendering/src/nest_rendering/world/mod.rs b/rendering/src/nest_rendering/world/mod.rs index d801096..3bdd12e 100644 --- a/rendering/src/nest_rendering/world/mod.rs +++ b/rendering/src/nest_rendering/world/mod.rs @@ -1,5 +1,5 @@ pub mod world_map; -pub use self::world_map::{initialize_world_assets, WorldMap}; +pub use self::world_map::{create_new_world, initialize_tile_worlds, WorldMap}; use bevy::{prelude::*, sprite::Material2dPlugin}; @@ -9,6 +9,8 @@ pub struct WorldViewPlugin; impl Plugin for WorldViewPlugin { fn build(&self, app: &mut App) { app.add_plugins(Material2dPlugin::::default()); - app.add_systems(Update, initialize_world_assets); + app.add_systems(Update, (create_new_world, initialize_tile_worlds).chain()); } + + } diff --git a/rendering/src/nest_rendering/world/world_map.rs b/rendering/src/nest_rendering/world/world_map.rs index 1532b97..4f78c91 100644 --- a/rendering/src/nest_rendering/world/world_map.rs +++ b/rendering/src/nest_rendering/world/world_map.rs @@ -1,18 +1,47 @@ -use std::panic::AssertUnwindSafe; +use bevy::log::debug; +use bevy::render; use bevy::{ prelude::*, - render::render_resource::{AsBindGroup, ShaderRef}, + render::render_resource::{AsBindGroup, ShaderRef, ShaderType}, sprite::Material2d, }; +#[derive(ShaderType, Clone, Debug, Reflect, AsBindGroup)] +pub struct MapDataUniform { + pub map_size: UVec2, + pub tile_size: Vec2, + pub atlas_size: Vec2, + pub transform_local: Mat3, + pub transform_world: Mat3, + pub size_world: Vec2, +} + +impl Default for MapDataUniform { + fn default() -> Self { + Self { + map_size: default(), + tile_size: default(), + atlas_size: default(), + transform_local: Mat3::IDENTITY, + transform_world: default(), + size_world: default(), + } + } +} + #[derive(Component, Asset, Default, Debug, Clone, Reflect, AsBindGroup)] #[reflect(Component)] pub struct WorldMap { - pub world_size: UVec2, - pub tile_size: Vec2, - pub atlas_size: Vec2, - pub tile_atlas: Handle, + #[uniform(0)] + pub map_data: MapDataUniform, + + #[storage(32)] + pub tile_map: Vec, + + #[texture(33)] + #[sampler(34)] + pub atlas: Handle, } impl Material2d for WorldMap { @@ -22,33 +51,50 @@ impl Material2d for WorldMap { } impl WorldMap { - pub fn new( - world_size: UVec2, - tile_size: Vec2, - atlas_size: Vec2, - tile_atlas: Handle, - ) -> Self { - Self { - world_size, - tile_size, - atlas_size, - tile_atlas, - } + pub fn update(&mut self, images: &Assets) -> bool { + let atlas = match images.get(&self.atlas) { + Some(atlas) => atlas, + None => return false, + }; + + self.map_data.atlas_size = atlas.size().as_vec2(); + true } } -pub fn initialize_world_assets( - map: ResMut>, - map_handles: Query<&Handle>, - mut images: ResMut>, - mut ev_asset: EventReader>, +// TODO: This probably needs to stay here, while the rest of world handling +// can be moved to the parent module so it can be re-used for crater rendering. +pub fn create_new_world( + mut commands: Commands, + asset_server: Res, + mut materials: ResMut>, ) { - for ev in ev_asset.iter() { - for handle in map_handles.iter() { - let Some(map) = map.get(handle) else { - /* World has no texture atlas */ - continue; - }; - } + let world_map = WorldMap { + map_data: MapDataUniform { + tile_size: Vec2::new(32.0, 32.0), + ..Default::default() + }, + tile_map: vec![0; 100], + atlas: asset_server.load("textures/element/sprite_sheet.png"), + }; + + materials.add(world_map); +} + +pub fn initialize_tile_worlds( + mut assets: ResMut>, + worlds: Query<(Entity, &Handle)>, + images: Res>, +) { + debug!(target: "world", "Initializing tile worlds"); + for (entity, handle) in worlds.iter() { + let Some(map) = assets.get_mut(handle) else { + warn!(target: "world", "WorldMap not loaded yet: {:?}", handle); + continue; + // Not loaded yet, probably. Need to handle. + }; + + map.update(images.as_ref()); + warn!(target: "world", "WorldMap updated: {:?}", map); } }