From 7d77f6152107ae11eacd194d0fa6ee750253e15d Mon Sep 17 00:00:00 2001 From: James Gayfer <10660608+jgayfer@users.noreply.github.com> Date: Wed, 29 May 2024 14:52:23 -0700 Subject: [PATCH 1/2] Upgrade to Bevy 0.14.0-rc.2 Brings us up to date with the "first" release candidate for 0.14. The only breaking change is that our PointLight2d API is affected by the migration from `LegacyColor` to `bevy_color::Color`. https://bevyengine.org/learn/migration-guides/0-13-to-0-14/#migrate-from-legacycolor-to-bevy-color-color --- Cargo.toml | 5 +++- examples/basic.rs | 2 +- examples/dungeon.rs | 38 ++++++++++++++++--------------- examples/multiple.rs | 6 ++--- src/light.rs | 6 ++--- src/plugin.rs | 13 +++++++---- src/render/extract.rs | 12 +++++----- src/render/gpu.rs | 2 +- src/render/lighting/lighting.wgsl | 6 ++--- 9 files changed, 49 insertions(+), 41 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9f7709b..8cbcc45 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,12 +11,15 @@ readme = "README.md" exclude = ["assets/*", "static/*"] [dependencies] -bevy = { version = "0.13", default-features = false, features = [ +bevy = { version = "0.14.0-rc.2", default-features = false, features = [ "bevy_render", "bevy_core_pipeline", "bevy_winit", "bevy_sprite", + "bevy_pbr", "png", + "ktx2", + "zstd", "x11" ] } diff --git a/examples/basic.rs b/examples/basic.rs index c4bfad9..1829db6 100644 --- a/examples/basic.rs +++ b/examples/basic.rs @@ -5,7 +5,7 @@ fn main() { App::new() .add_plugins((DefaultPlugins, Light2dPlugin)) .add_systems(Startup, setup) - .run() + .run(); } fn setup(mut commands: Commands) { diff --git a/examples/dungeon.rs b/examples/dungeon.rs index 0d92793..817b643 100644 --- a/examples/dungeon.rs +++ b/examples/dungeon.rs @@ -1,4 +1,4 @@ -use bevy::prelude::*; +use bevy::{color::palettes::css::YELLOW, prelude::*}; use bevy_light_2d::prelude::*; const TILE_INDEX: f32 = 0.0; @@ -16,7 +16,7 @@ fn main() { .add_systems(Startup, (setup_dungeon_tileset, spawn_tiles).chain()) .add_systems(Startup, (setup_candle_spritesheet, spawn_candles).chain()) .add_systems(Update, animate_candles) - .run() + .run(); } #[derive(Resource, Default)] @@ -50,7 +50,7 @@ fn setup_camera(mut commands: Commands) { } fn set_clear_color(mut clear_color: ResMut) { - clear_color.0 = Color::rgb_u8(37, 19, 26); + clear_color.0 = Color::srgb_u8(37, 19, 26); } fn animate_candles( @@ -71,7 +71,7 @@ fn spawn_candles(mut commands: Commands, spritesheet: Res) { transform: Transform::from_xyz(0.0, 4.0, ENTITY_INDEX), point_light: PointLight2d { radius: 48.0, - color: Color::YELLOW, + color: Color::Srgba(YELLOW), intensity: 25.0, falloff: 4.0, }, @@ -83,13 +83,13 @@ fn spawn_candles(mut commands: Commands, spritesheet: Res) { .spawn(( Candle, AnimationTimer(Timer::from_seconds(0.2, TimerMode::Repeating)), - SpriteSheetBundle { + SpriteBundle { transform: Transform::from_xyz(0., 2., ENTITY_INDEX), texture: spritesheet.texture.clone(), - atlas: TextureAtlas { - layout: spritesheet.layout.clone(), - ..default() - }, + ..default() + }, + TextureAtlas { + layout: spritesheet.layout.clone(), ..default() }, )) @@ -164,18 +164,20 @@ fn spawn_from_atlas( atlas_handle: Handle, texture: Handle, ) { - commands.spawn(SpriteSheetBundle { - transform: Transform { - translation, + commands.spawn(( + SpriteBundle { + transform: Transform { + translation, + ..default() + }, + texture, ..default() }, - texture, - atlas: TextureAtlas { + TextureAtlas { index: sprite_index, layout: atlas_handle, }, - ..default() - }); + )); } fn setup_dungeon_tileset( @@ -185,7 +187,7 @@ fn setup_dungeon_tileset( ) { dungeon_tileset.texture = asset_server.load("dungeon_tiles.png"); dungeon_tileset.layout = texture_atlas_layouts.add(TextureAtlasLayout::from_grid( - Vec2::new(16.0, 16.0), + UVec2::new(16, 16), 10, 10, None, @@ -200,7 +202,7 @@ fn setup_candle_spritesheet( ) { candle_spritesheet.texture = asset_server.load("candle.png"); candle_spritesheet.layout = texture_atlas_layouts.add(TextureAtlasLayout::from_grid( - Vec2::new(16.0, 16.0), + UVec2::new(16, 16), 4, 1, None, diff --git a/examples/multiple.rs b/examples/multiple.rs index d081420..1abb906 100644 --- a/examples/multiple.rs +++ b/examples/multiple.rs @@ -5,7 +5,7 @@ fn main() { App::new() .add_plugins((DefaultPlugins, Light2dPlugin)) .add_systems(Startup, setup) - .run() + .run(); } fn setup(mut commands: Commands) { @@ -28,7 +28,7 @@ fn setup(mut commands: Commands) { commands.spawn(PointLight2dBundle { point_light: PointLight2d { - color: Color::RED, + color: Color::Srgba(Srgba::RED), radius: 50., intensity: 5.0, ..default() @@ -50,7 +50,7 @@ fn setup(mut commands: Commands) { commands.spawn(PointLight2dBundle { point_light: PointLight2d { - color: Color::GREEN, + color: Color::Srgba(Srgba::GREEN), radius: 75., intensity: 5.0, ..default() diff --git a/src/light.rs b/src/light.rs index 608f241..e7b3dfd 100644 --- a/src/light.rs +++ b/src/light.rs @@ -1,12 +1,10 @@ //! A module which contains lighting components. use bevy::{ + color::Color, ecs::{bundle::Bundle, component::Component}, reflect::Reflect, - render::{ - color::Color, - view::{InheritedVisibility, ViewVisibility, Visibility}, - }, + render::view::{InheritedVisibility, ViewVisibility, Visibility}, transform::components::{GlobalTransform, Transform}, }; diff --git a/src/plugin.rs b/src/plugin.rs index 8a9cd78..ac20b3c 100644 --- a/src/plugin.rs +++ b/src/plugin.rs @@ -7,6 +7,7 @@ use bevy::{ render::{ extract_component::UniformComponentPlugin, render_graph::{RenderGraphApp, ViewNodeRunner}, + view::{check_visibility, VisibilitySystems}, Render, RenderApp, RenderSet, }, }; @@ -34,9 +35,13 @@ impl Plugin for Light2dPlugin { app.add_plugins(UniformComponentPlugin::::default()) .register_type::() - .register_type::(); + .register_type::() + .add_systems( + PostUpdate, + check_visibility::>.in_set(VisibilitySystems::CheckVisibility), + ); - let Ok(render_app) = app.get_sub_app_mut(RenderApp) else { + let Some(render_app) = app.get_sub_app_mut(RenderApp) else { return; }; @@ -47,11 +52,11 @@ impl Plugin for Light2dPlugin { ) .add_systems(Render, (prepare_point_lights).in_set(RenderSet::Prepare)) .add_render_graph_node::>(Core2d, LightingPass) - .add_render_graph_edge(Core2d, Node2d::MainPass, LightingPass); + .add_render_graph_edge(Core2d, Node2d::MainTransparentPass, LightingPass); } fn finish(&self, app: &mut App) { - let Ok(render_app) = app.get_sub_app_mut(RenderApp) else { + let Some(render_app) = app.get_sub_app_mut(RenderApp) else { return; }; diff --git a/src/render/extract.rs b/src/render/extract.rs index ac57844..49b6960 100644 --- a/src/render/extract.rs +++ b/src/render/extract.rs @@ -1,4 +1,5 @@ use bevy::{ + color::{Color, LinearRgba}, core_pipeline::core_2d::Camera2d, ecs::{ component::Component, @@ -6,7 +7,6 @@ use bevy::{ query::{With, Without}, system::{Commands, Query}, }, - math::Vec4, render::{render_resource::ShaderType, view::ViewVisibility, Extract}, transform::components::GlobalTransform, }; @@ -17,14 +17,14 @@ use crate::light::{AmbientLight2d, PointLight2d}; pub struct ExtractedPointLight2d { pub transform: GlobalTransform, pub radius: f32, - pub color: Vec4, + pub color: LinearRgba, pub intensity: f32, pub falloff: f32, } #[derive(Component, Default, Clone, ShaderType)] pub struct ExtractedAmbientLight2d { - pub color: Vec4, + pub color: LinearRgba, } pub fn extract_point_lights( @@ -36,7 +36,7 @@ pub fn extract_point_lights( continue; } commands.get_or_spawn(entity).insert(ExtractedPointLight2d { - color: point_light.color.rgba_linear_to_vec4(), + color: point_light.color.linear(), transform: *global_transform, radius: point_light.radius, intensity: point_light.intensity, @@ -54,7 +54,7 @@ pub fn extract_ambient_lights( commands .get_or_spawn(entity) .insert(ExtractedAmbientLight2d { - color: ambient_light.color.rgba_linear_to_vec4() * ambient_light.brightness, + color: ambient_light.color.linear() * ambient_light.brightness, }); } @@ -64,7 +64,7 @@ pub fn extract_ambient_lights( commands .get_or_spawn(entity) .insert(ExtractedAmbientLight2d { - color: Vec4::new(1.0, 1.0, 1.0, 0.0), + color: Color::WHITE.into(), }); } } diff --git a/src/render/gpu.rs b/src/render/gpu.rs index c8c27ad..b190ac4 100644 --- a/src/render/gpu.rs +++ b/src/render/gpu.rs @@ -16,7 +16,7 @@ pub struct GpuPointLights { pub struct GpuPointLight2d { pub center: Vec2, pub radius: f32, - pub color: Vec4, + pub color: LinearRgba, pub intensity: f32, pub falloff: f32, } diff --git a/src/render/lighting/lighting.wgsl b/src/render/lighting/lighting.wgsl index 9d46c5e..d89e663 100644 --- a/src/render/lighting/lighting.wgsl +++ b/src/render/lighting/lighting.wgsl @@ -10,7 +10,7 @@ struct PointLight2d { } struct AmbientLight2d { - color: vec3 + color: vec4 } fn world_to_ndc(world_position: vec2, view_projection: mat4x4) -> vec2 { @@ -32,7 +32,7 @@ fn world_to_screen( fn scale_factor(view: View) -> f32 { let screen_size = - 2.0 * vec2f(view.inverse_projection[0][0], view.inverse_projection[1][1]); + 2.0 * vec2f(view.view_from_clip[0][0], view.view_from_clip[1][1]); return screen_size.y / view.viewport.w; } @@ -65,7 +65,7 @@ fn fragment(vo: FullscreenVertexOutput) -> @location(0) vec4 { // it to screen space in order to do things like compute distances (let // alone render it in the correct place). let point_light_screen_center = - world_to_screen(point_light.center, view.viewport.zw, view.view_proj); + world_to_screen(point_light.center, view.viewport.zw, view.clip_from_world); // Compute the distance between the current position and the light's center. // We multiply by the scale factor as otherwise our distance will always be From 00e09a770a4160c1af4935412f618b49e9e6e04c Mon Sep 17 00:00:00 2001 From: James Gayfer <10660608+jgayfer@users.noreply.github.com> Date: Fri, 7 Jun 2024 21:38:50 -0700 Subject: [PATCH 2/2] Cut release candidate for 0.2.0-rc.1 Our first release candiate for 0.2.0, featuring support for Bevy 0.14. --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 8cbcc45..ebaa494 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bevy_light_2d" -version = "0.1.3" +version = "0.2.0-rc.1" edition = "2021" categories = ["game-engines", "graphics", "rendering", "gamedev"] description = "General purpose 2d lighting for the Bevy game engine."