diff --git a/Cargo.toml b/Cargo.toml index 1c5b8d8622eb58ec75ee244a7330d599c630d3a3..18c76e6a91d519ae989d1b726b6c4c264af06a55 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ members = ["kayak_ui_macros", "kayak_font"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -bevy = { version = "0.10", default-features = false, features = ["bevy_render", "bevy_sprite", "bevy_asset", "bevy_winit", "bevy_core_pipeline"] } +bevy = { version = "0.11", default-features = false, features = ["bevy_render", "bevy_sprite", "bevy_asset", "bevy_winit", "bevy_core_pipeline"] } bevy_svg = { version="0.10.1", default-features = false } bitflags = "1.3.2" bytemuck = "1.12" @@ -37,7 +37,7 @@ uuid = { version = "1.3", features = ["v4"] } [dev-dependencies] fastrand = "1.8" bevy-inspector-egui = "0.18" -bevy = { version = "0.10", default-features = true } +bevy = { version = "0.11", default-features = true } [[example]] name = "tabs" @@ -48,4 +48,7 @@ name = "todo" path = "examples/todo/todo.rs" [package.metadata.docs.rs] -features = ["bevy/x11"] \ No newline at end of file +features = ["bevy/x11"] + +[patch.crates-io] +bevy_svg = {git = "https://github.com/NiseVoid/bevy_svg", branch="bevy_svg"} diff --git a/examples/main_menu.rs b/examples/main_menu.rs index 0111af0de38a09f9ab100d1bfb953bcc228a2a2e..7b33cef605f934275f3cb28e085174dcf2dd6cb5 100644 --- a/examples/main_menu.rs +++ b/examples/main_menu.rs @@ -215,8 +215,7 @@ fn main() { App::new() .init_resource::<PreloadResource>() .add_plugins(DefaultPlugins.set(ImagePlugin::default_nearest())) - .add_plugin(KayakContextPlugin) - .add_plugin(KayakWidgets) - .add_startup_system(startup) + .add_plugins((KayakContextPlugin, KayakWidgets)) + .add_systems(Startup, startup) .run() } diff --git a/kayak_font/Cargo.toml b/kayak_font/Cargo.toml index 721390f3f1482d9f10667cb31001546a39b1e9f3..105eb1138309878e78ccac0c72fc0003a2c2a713 100644 --- a/kayak_font/Cargo.toml +++ b/kayak_font/Cargo.toml @@ -27,11 +27,11 @@ image = "0.24" # Provides UAX #14 line break segmentation xi-unicode = "0.3" -bevy = { version = "0.10", optional = true, default-features = false, features = ["bevy_asset", "bevy_render", "bevy_core_pipeline"] } +bevy = { version = "0.11", optional = true, default-features = false, features = ["bevy_asset", "bevy_render", "bevy_core_pipeline"] } [dev-dependencies] -bevy = { version = "0.10" } +bevy = { version = "0.11" } bytemuck = "1.12.0" [package.metadata.docs.rs] -features = ["bevy/x11"] \ No newline at end of file +features = ["bevy/x11"] diff --git a/kayak_font/src/bevy/mod.rs b/kayak_font/src/bevy/mod.rs index 97da83234b987dc4c5a330f4a1d4382327641f8a..68b9391274feaa3df2b0bbaa8ddd66f70cb2a08c 100644 --- a/kayak_font/src/bevy/mod.rs +++ b/kayak_font/src/bevy/mod.rs @@ -11,8 +11,8 @@ mod loader; mod renderer; mod plugin { - use bevy::prelude::{AddAsset, IntoSystemAppConfig, IntoSystemConfig, Plugin}; - use bevy::render::{ExtractSchedule, RenderApp, RenderSet}; + use bevy::prelude::{AddAsset, IntoSystemConfigs, Plugin, Update}; + use bevy::render::{ExtractSchedule, Render, RenderApp, RenderSet}; use crate::bevy::font_texture::init_font_texture; use crate::KayakFont; @@ -26,14 +26,14 @@ mod plugin { app.add_asset::<KayakFont>() .add_asset_loader(crate::ttf::loader::TTFLoader) .add_asset_loader(KayakFontLoader) - .add_system(init_font_texture); + .add_systems(Update, init_font_texture); let render_app = app.sub_app_mut(RenderApp); render_app .init_resource::<FontTextureCache>() .init_resource::<ExtractedFonts>() - .add_system(extract_fonts.in_schedule(ExtractSchedule)) - .add_system(prepare_fonts.in_set(RenderSet::Prepare)); + .add_systems(ExtractSchedule, extract_fonts) + .add_systems(Render, prepare_fonts.in_set(RenderSet::Prepare)); } } } diff --git a/kayak_font/src/bevy/renderer/font_texture_cache.rs b/kayak_font/src/bevy/renderer/font_texture_cache.rs index c61a329e24ef0148b4e9dc1ffbb5fac4268e0689..8a9f22fbfdaa9821b95a2f9851e92bd5cf1f971f 100644 --- a/kayak_font/src/bevy/renderer/font_texture_cache.rs +++ b/kayak_font/src/bevy/renderer/font_texture_cache.rs @@ -137,7 +137,7 @@ impl FontTextureCache { lod_min_clamp: 0.0, lod_max_clamp: std::f32::MAX, compare: None, - anisotropy_clamp: None, + anisotropy_clamp: 1, border_color: None, }; @@ -152,7 +152,7 @@ impl FontTextureCache { base_mip_level: 0, base_array_layer: 0, mip_level_count: None, - array_layer_count: std::num::NonZeroU32::new(MAX_CHARACTERS), + array_layer_count: Some(MAX_CHARACTERS), }); let image = GpuImage { @@ -199,7 +199,7 @@ impl FontTextureCache { base_mip_level: 0, base_array_layer: 0, mip_level_count: None, - array_layer_count: std::num::NonZeroU32::new(MAX_CHARACTERS), + array_layer_count: Some(MAX_CHARACTERS), }); GpuImage { diff --git a/kayak_font/src/font.rs b/kayak_font/src/font.rs index b5c11872667df47565c8eedfad328af073d09fa9..da5d4f60fa5f720bea5213854242bcc94b97880c 100644 --- a/kayak_font/src/font.rs +++ b/kayak_font/src/font.rs @@ -1,7 +1,11 @@ use std::collections::HashMap; #[cfg(feature = "bevy_renderer")] -use bevy::{prelude::Handle, reflect::TypeUuid, render::texture::Image}; +use bevy::{ + prelude::Handle, + reflect::{TypePath, TypeUuid}, + render::texture::Image, +}; use unicode_segmentation::UnicodeSegmentation; use crate::utility::{BreakableWord, MISSING, SPACE}; @@ -10,7 +14,7 @@ use crate::{ }; #[cfg(feature = "bevy_renderer")] -#[derive(Debug, Clone, TypeUuid, PartialEq)] +#[derive(Debug, Clone, TypeUuid, TypePath, PartialEq)] #[uuid = "4fe4732c-6731-49bb-bafc-4690d636b848"] pub struct KayakFont { pub sdf: Sdf, diff --git a/kayak_font/src/layout/glyph.rs b/kayak_font/src/layout/glyph.rs index a7d7f8429634d18e409ad23cbfa7cdb29f96151f..65b1baea64b93fc8a624793231a38d4e849757a9 100644 --- a/kayak_font/src/layout/glyph.rs +++ b/kayak_font/src/layout/glyph.rs @@ -1,7 +1,7 @@ -use bevy::reflect::{FromReflect, Reflect}; +use bevy::reflect::Reflect; /// Layout information for a renderable glyph. -#[derive(Default, Reflect, FromReflect, Debug, Clone, Copy, PartialEq)] +#[derive(Default, Reflect, Debug, Clone, Copy, PartialEq)] pub struct GlyphRect { pub position: (f32, f32), pub size: (f32, f32), diff --git a/kayak_font/src/layout/grapheme.rs b/kayak_font/src/layout/grapheme.rs index df0ce15308f14e0dc548cdb1558b17415aa106cc..c578275cba5102a6051eafca253fac3bfc471f8b 100644 --- a/kayak_font/src/layout/grapheme.rs +++ b/kayak_font/src/layout/grapheme.rs @@ -1,11 +1,11 @@ use std::cmp::Ordering; -use bevy::reflect::{FromReflect, Reflect}; +use bevy::reflect::Reflect; /// A representation of a grapheme cluster, as defined by [Unicode UAX #29]. /// /// [Unicode UAX #29]: https://unicode.org/reports/tr29/ -#[derive(Default, Debug, Reflect, FromReflect, Copy, Clone, PartialEq)] +#[derive(Default, Debug, Reflect, Copy, Clone, PartialEq)] pub struct Grapheme { /// The index of the starting char within this grapheme, relative to the entire text content. pub char_index: usize, diff --git a/kayak_font/src/layout/line.rs b/kayak_font/src/layout/line.rs index 41e07030599b773aa1bb757189c6f3bbf2482f72..0bbe3938497085f90975113dcd75fbeaa4596b4c 100644 --- a/kayak_font/src/layout/line.rs +++ b/kayak_font/src/layout/line.rs @@ -1,4 +1,4 @@ -use bevy::reflect::{FromReflect, Reflect}; +use bevy::reflect::Reflect; use crate::layout::grapheme::Grapheme; use std::cmp::Ordering; @@ -6,7 +6,7 @@ use std::ops::Index; use std::slice::SliceIndex; /// Contains details for a calculated line of text. -#[derive(Clone, Reflect, FromReflect, Debug, PartialEq)] +#[derive(Clone, Reflect, Debug, PartialEq)] pub struct Line { grapheme_index: usize, graphemes: Vec<Grapheme>, diff --git a/kayak_font/src/layout/text.rs b/kayak_font/src/layout/text.rs index 8d5a59031799cf9979a846bcf526b518e2dd116d..2a80a28bdcd84594f1cf0a9c8e490e198a5f9ba0 100644 --- a/kayak_font/src/layout/text.rs +++ b/kayak_font/src/layout/text.rs @@ -1,10 +1,10 @@ -use bevy::reflect::{FromReflect, Reflect}; +use bevy::reflect::Reflect; use crate::{GlyphRect, Line, RowCol}; use std::cmp::Ordering; /// The text alignment. -#[derive(Copy, Clone, Reflect, FromReflect, Debug, PartialEq, Eq)] +#[derive(Copy, Clone, Reflect, Debug, PartialEq, Eq)] pub enum Alignment { Start, Middle, @@ -12,7 +12,7 @@ pub enum Alignment { } /// Properties to control text layout. -#[derive(Copy, Clone, Reflect, FromReflect, Debug, PartialEq)] +#[derive(Copy, Clone, Reflect, Debug, PartialEq)] pub struct TextProperties { /// The font size (in pixels). pub font_size: f32, @@ -41,7 +41,7 @@ impl Default for TextProperties { /// Calculated text layout. /// /// This can be retrieved using [`measure`](crate::KayakFont::measure). -#[derive(Clone, Reflect, FromReflect, Debug, Default, PartialEq)] +#[derive(Clone, Reflect, Debug, Default, PartialEq)] pub struct TextLayout { glyphs: Vec<GlyphRect>, lines: Vec<Line>, diff --git a/src/camera/mod.rs b/src/camera/mod.rs index 1e02a5305fe0ec7bc3a67965ec61dbeef937294b..f887086963603e71534f8a9da8f853c08247d3b4 100644 --- a/src/camera/mod.rs +++ b/src/camera/mod.rs @@ -19,6 +19,6 @@ impl ExtractComponent for CameraUIKayak { pub struct KayakUICameraPlugin; impl Plugin for KayakUICameraPlugin { fn build(&self, app: &mut bevy::prelude::App) { - app.add_plugin(ExtractComponentPlugin::<CameraUIKayak>::default()); + app.add_plugins(ExtractComponentPlugin::<CameraUIKayak>::default()); } } diff --git a/src/context.rs b/src/context.rs index c51cadc472adae47e24f23dad6bb3cb6514d54a4..ffe96d155338a9b8f92ba8225d293b87ef228892 100644 --- a/src/context.rs +++ b/src/context.rs @@ -667,11 +667,11 @@ pub fn update_widgets_sys(world: &mut World) { for (key, system) in context.systems.iter_mut() { if let Some(new_tick) = new_ticks.get(key) { - system.0.set_last_change_tick(*new_tick); - system.1.set_last_change_tick(*new_tick); + system.0.set_last_run(*new_tick); + system.1.set_last_run(*new_tick); } else { - system.0.set_last_change_tick(tick); - system.1.set_last_change_tick(tick); + system.0.set_last_run(tick); + system.1.set_last_run(tick); } } @@ -694,7 +694,7 @@ fn update_widgets( clone_systems: &Arc<RwLock<EntityCloneSystems>>, cloned_widget_entities: &Arc<DashMap<Entity, Entity>>, widget_state: &WidgetState, - new_ticks: &mut HashMap<String, u32>, + new_ticks: &mut HashMap<String, bevy::ecs::component::Tick>, order_tree: &Arc<RwLock<Tree>>, index: &Arc<DashMap<Entity, usize>>, unique_ids: &Arc<DashMap<Entity, DashMap<String, Entity>>>, @@ -1114,7 +1114,7 @@ fn update_widget( clone_systems: &Arc<RwLock<EntityCloneSystems>>, cloned_widget_entities: &DashMap<Entity, Entity>, widget_state: &WidgetState, - new_ticks: &mut HashMap<String, u32>, + new_ticks: &mut HashMap<String, bevy::ecs::component::Tick>, ) -> (Tree, bool) { // Check if we should update this widget let should_rerender = { @@ -1164,15 +1164,15 @@ fn update_widget( ) }) .0; - let old_tick = widget_update_system.get_last_change_tick(); + let old_tick = widget_update_system.get_last_run(); // Insert context as a bevy resource. world.insert_resource(widget_context); let should_rerender = widget_update_system.run((entity.0, old_props_entity), world); - let new_tick = widget_update_system.get_last_change_tick(); + let new_tick = widget_update_system.get_last_run(); new_ticks.insert(widget_type.clone(), new_tick); - widget_update_system.set_last_change_tick(old_tick); - widget_update_system.apply_buffers(world); + widget_update_system.set_last_run(old_tick); + widget_update_system.apply_deferred(world); // Extract context widget_context = world.remove_resource::<KayakWidgetContext>().unwrap(); @@ -1247,14 +1247,14 @@ fn update_widget( // Remove children from previous render. widget_context.remove_children(previous_children); let widget_render_system = &mut systems.get_mut(&widget_type).unwrap().1; - let old_tick = widget_render_system.get_last_change_tick(); + let old_tick = widget_render_system.get_last_run(); world.insert_resource(widget_context.clone()); world.insert_resource(focus_tree.clone()); should_update_children = widget_render_system.run(entity.0, world); - let new_tick = widget_render_system.get_last_change_tick(); + let new_tick = widget_render_system.get_last_run(); new_ticks.insert(widget_type.clone(), new_tick); - widget_render_system.set_last_change_tick(old_tick); - widget_render_system.apply_buffers(world); + widget_render_system.set_last_run(old_tick); + widget_render_system.apply_deferred(world); world.remove_resource::<KayakWidgetContext>(); world.remove_resource::<FocusTree>(); @@ -1300,16 +1300,18 @@ impl Plugin for KayakContextPlugin { .insert_resource(CustomEventReader(ManualEventReader::< bevy::input::keyboard::KeyboardInput, >::default())) - .add_plugin(crate::camera::KayakUICameraPlugin) - .add_plugin(crate::render::BevyKayakUIRenderPlugin) - .add_system(crate::input::process_events.in_base_set(CoreSet::Update)) - .add_system(update_widgets_sys.in_base_set(CoreSet::PostUpdate)) - .add_system( - calculate_ui - .after(update_widgets_sys) - .in_base_set(CoreSet::PostUpdate), + .add_plugins(( + crate::camera::KayakUICameraPlugin, + crate::render::BevyKayakUIRenderPlugin, + )) + .add_systems( + Update, + ( + crate::input::process_events, + crate::window_size::update_window_size, + ), ) - .add_system(crate::window_size::update_window_size); + .add_systems(PostUpdate, (calculate_ui, update_widgets_sys).chain()); // Register reflection types. // A bit annoying.. @@ -1360,10 +1362,10 @@ fn calculate_ui(world: &mut World) { for _ in 0..2 { context = node_system.run(context, world); - node_system.apply_buffers(world); + node_system.apply_deferred(world); context = layout_system.run(context, world); - layout_system.apply_buffers(world); + layout_system.apply_deferred(world); LayoutEventDispatcher::dispatch(&mut context, world); } diff --git a/src/cursor.rs b/src/cursor.rs index b3df333cc497d41e653d6f4e4973ea23acf92010..220e92424155d954dc0556c0ada9881bb8901b0d 100644 --- a/src/cursor.rs +++ b/src/cursor.rs @@ -1,7 +1,7 @@ -use bevy::reflect::{FromReflect, Reflect}; +use bevy::reflect::Reflect; /// Controls how the cursor interacts on a given node -#[derive(Debug, Reflect, FromReflect, Copy, Clone, PartialEq, Eq)] +#[derive(Debug, Reflect, Copy, Clone, PartialEq, Eq)] pub enum PointerEvents { /// Allow all pointer events on this node and its children All, diff --git a/src/event_dispatcher.rs b/src/event_dispatcher.rs index 4c9f4bb93e1759be710b8a0ba8666894c86bbac8..35b174753f1176b68d941a7d0d30a7c60c4a9109 100644 --- a/src/event_dispatcher.rs +++ b/src/event_dispatcher.rs @@ -700,16 +700,16 @@ impl EventDispatcher { InputEvent::Keyboard { key, is_pressed } => { // === Modifers === // match key { - KeyCode::LControl | KeyCode::RControl => { + KeyCode::ControlLeft | KeyCode::ControlRight => { self.keyboard_modifiers.is_ctrl_pressed = *is_pressed } - KeyCode::LShift | KeyCode::RShift => { + KeyCode::ShiftLeft | KeyCode::ShiftRight => { self.keyboard_modifiers.is_shift_pressed = *is_pressed } - KeyCode::LAlt | KeyCode::RAlt => { + KeyCode::AltLeft | KeyCode::AltRight => { self.keyboard_modifiers.is_alt_pressed = *is_pressed } - KeyCode::LWin | KeyCode::RWin => { + KeyCode::SuperLeft | KeyCode::SuperRight => { self.keyboard_modifiers.is_meta_pressed = *is_pressed } _ => {} diff --git a/src/input.rs b/src/input.rs index cf51b47ab4b5093f05b7e63e17d674d4e3e37cd1..13947a09d6f218e21394643ce461f26119ee7ac5 100644 --- a/src/input.rs +++ b/src/input.rs @@ -78,7 +78,13 @@ pub(crate) fn process_events(world: &mut World) { } } - for MouseWheel { x, y, unit } in custom_event_mouse_wheel.0.iter(&mouse_wheel_events) { + for MouseWheel { + x, + y, + unit, + window: _, + } in custom_event_mouse_wheel.0.iter(&mouse_wheel_events) + { input_events.push(InputEvent::Scroll { dx: *x, dy: *y, diff --git a/src/layout.rs b/src/layout.rs index 52e546aacf0234da77a3e048db7ea4eef2de0812..63fdf66626b35e543655ac2080b608fd686521eb 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -3,14 +3,14 @@ use std::collections::HashMap; use bevy::{ prelude::{Entity, Query}, - reflect::{FromReflect, Reflect}, + reflect::Reflect, }; use morphorm::Cache; pub use morphorm::GeometryChanged; use crate::node::WrappedIndex; -#[derive(Debug, Reflect, FromReflect, Default, Clone, Copy, PartialEq)] +#[derive(Debug, Reflect, Default, Clone, Copy, PartialEq)] pub struct Rect { pub posx: f32, pub posy: f32, diff --git a/src/node.rs b/src/node.rs index 680154b6ff3ef0c0cf539a78d5ad180ccade6e91..dd3c5f485b47012b68d1c16b9ffc9c3fcf28ff95 100644 --- a/src/node.rs +++ b/src/node.rs @@ -1,7 +1,4 @@ -use bevy::{ - prelude::{Component, Entity, Query, Reflect, ReflectComponent}, - reflect::FromReflect, -}; +use bevy::prelude::{Component, Entity, Query, Reflect, ReflectComponent}; use crate::styles::{KStyle, StyleProp}; @@ -106,7 +103,7 @@ impl NodeBuilder { } } -#[derive(Debug, Reflect, FromReflect, Clone, Copy, Hash, PartialEq, Eq)] +#[derive(Debug, Reflect, Clone, Copy, Hash, PartialEq, Eq)] pub struct WrappedIndex(pub Entity); impl<'a> morphorm::Node<'a> for WrappedIndex { diff --git a/src/on_change.rs b/src/on_change.rs index ae8058a17131a50875f768b20912a001772e2a39..3cb9073379376f4dcffbe158b752e69595628bf7 100644 --- a/src/on_change.rs +++ b/src/on_change.rs @@ -57,7 +57,7 @@ impl OnChange { } world.insert_resource(widget_context); system.run((entity, value.clone()), world); - system.apply_buffers(world); + system.apply_deferred(world); } } } diff --git a/src/on_event.rs b/src/on_event.rs index 6fd441a92c5c3a611317db72e627b5f38f95266f..eb0fd54d6af3097743f7530cd8765f514aba5206 100644 --- a/src/on_event.rs +++ b/src/on_event.rs @@ -62,7 +62,7 @@ impl OnEvent { world.insert_resource(focus_tree); system.run(entity, world); - system.apply_buffers(world); + system.apply_deferred(world); event_dispatcher_context = world.remove_resource::<EventDispatcherContext>().unwrap(); event = world.remove_resource::<KEvent>().unwrap(); diff --git a/src/on_layout.rs b/src/on_layout.rs index 43b483a47fc1b4e06f3e3c41d536098be124216a..253db5cbb9944e8610809648fc2eb2cf579457b5 100644 --- a/src/on_layout.rs +++ b/src/on_layout.rs @@ -50,7 +50,7 @@ impl OnLayout { self.has_initialized = true; } event = system.run((event, entity), world); - system.apply_buffers(world); + system.apply_deferred(world); } event } diff --git a/src/render/extract.rs b/src/render/extract.rs index f9942d8cc14f07030e8715c16c9fdd9d217bfb94..affd6750ee6c97491bef70e13593e5904e2fc35b 100644 --- a/src/render/extract.rs +++ b/src/render/extract.rs @@ -10,7 +10,7 @@ use bevy::{ render_resource::{DynamicUniformBuffer, ShaderType}, renderer::{RenderDevice, RenderQueue}, view::ColorGrading, - Extract, ExtractSchedule, RenderApp, RenderSet, + Extract, ExtractSchedule, Render, RenderApp, RenderSet, }, window::{PrimaryWindow, Window, WindowRef}, }; @@ -28,15 +28,15 @@ impl Plugin for BevyKayakUIExtractPlugin { let render_app = app.sub_app_mut(RenderApp); render_app .init_resource::<UIViewUniforms>() - .add_system(extract.in_schedule(ExtractSchedule)) .add_systems( + ExtractSchedule, ( + extract, extract_default_ui_camera_view::<Camera2d>, extract_default_ui_camera_view::<Camera3d>, - ) - .in_schedule(ExtractSchedule), + ), ) - .add_system(prepare_view_uniforms.in_set(RenderSet::Prepare)); + .add_systems(Render, prepare_view_uniforms.in_set(RenderSet::Prepare)); } } diff --git a/src/render/font/mod.rs b/src/render/font/mod.rs index 86e02cb7a3fa388c1405cb3bf9ca3da4072cbb1f..41c693ae8b1b0d710070f7897d3abcbff887f1a9 100644 --- a/src/render/font/mod.rs +++ b/src/render/font/mod.rs @@ -1,4 +1,4 @@ -use bevy::prelude::{Added, Entity, Plugin, Query, ResMut}; +use bevy::prelude::{Added, Entity, Plugin, Query, ResMut, Update}; mod extract; mod font_mapping; @@ -14,7 +14,7 @@ pub struct TextRendererPlugin; impl Plugin for TextRendererPlugin { fn build(&self, app: &mut bevy::prelude::App) { app.init_resource::<FontMapping>() - .add_system(process_loaded_fonts); + .add_systems(Update, process_loaded_fonts); } } diff --git a/src/render/material/mod.rs b/src/render/material/mod.rs index 665988bc3a96a299ef13470f516629b91239ddc1..68866dfc3b1d0bd986b521aaecca442d8112a845 100644 --- a/src/render/material/mod.rs +++ b/src/render/material/mod.rs @@ -6,7 +6,7 @@ use std::sync::Arc; use bevy::{ prelude::{Commands, Entity}, - reflect::{FromReflect, Reflect, TypeUuid}, + reflect::{Reflect, TypePath, TypeUuid}, render::render_resource::{AsBindGroup, RenderPipelineDescriptor, ShaderRef}, }; @@ -14,7 +14,9 @@ pub use key::*; pub use pipeline::*; pub use plugin::*; -pub trait MaterialUI: AsBindGroup + Send + Sync + Clone + TypeUuid + Sized + 'static { +pub trait MaterialUI: + AsBindGroup + Send + Sync + Clone + TypeUuid + TypePath + Sized + 'static +{ /// Returns this material's vertex shader. If [`ShaderRef::Default`] is returned, the default mesh vertex shader /// will be used. fn vertex_shader() -> ShaderRef { @@ -33,7 +35,7 @@ pub trait MaterialUI: AsBindGroup + Send + Sync + Clone + TypeUuid + Sized + 'st fn specialize(descriptor: &mut RenderPipelineDescriptor, key: MaterialUIKey<Self>) {} } -#[derive(Default, Clone, Reflect, FromReflect)] +#[derive(Default, Clone, Reflect)] pub struct MaterialHandle { uuid: String, #[reflect(ignore)] diff --git a/src/render/material/plugin.rs b/src/render/material/plugin.rs index ba98dd2b3ee71ecbb701fcaefcaff9095e83f329..897a4d9f62d269bfbfbc12e96a0514e9601bb4e4 100644 --- a/src/render/material/plugin.rs +++ b/src/render/material/plugin.rs @@ -2,8 +2,8 @@ use bevy::{ prelude::*, render::{ extract_component::ExtractComponentPlugin, render_asset::PrepareAssetSet, - render_phase::AddRenderCommand, render_resource::SpecializedRenderPipelines, RenderApp, - RenderSet, + render_phase::AddRenderCommand, render_resource::SpecializedRenderPipelines, Render, + RenderApp, RenderSet, }, }; use std::hash::Hash; @@ -35,7 +35,7 @@ where { fn build(&self, app: &mut App) { app.add_asset::<M>() - .add_plugin(ExtractComponentPlugin::<Handle<M>>::extract_visible()); + .add_plugins(ExtractComponentPlugin::<Handle<M>>::extract_visible()); if let Ok(render_app) = app.get_sub_app_mut(RenderApp) { render_app @@ -45,15 +45,18 @@ where .init_resource::<ExtractedMaterialsUI<M>>() .init_resource::<RenderMaterialsUI<M>>() .init_resource::<SpecializedRenderPipelines<MaterialUIPipeline<M>>>() - .add_system(extract_materials_ui::<M>.in_schedule(ExtractSchedule)) - .add_systems(( - prepare_materials_ui::<M> - .in_set(RenderSet::Prepare) - .after(PrepareAssetSet::PreAssetPrepare), - queue_material_ui_quads::<M> - .in_set(RenderSet::Queue) - .after(crate::render::unified::pipeline::queue_quads), - )); + .add_systems(ExtractSchedule, extract_materials_ui::<M>) + .add_systems( + Render, + ( + prepare_materials_ui::<M> + .in_set(RenderSet::Prepare) + .after(PrepareAssetSet::PreAssetPrepare), + queue_material_ui_quads::<M> + .in_set(RenderSet::Queue) + .after(crate::render::unified::pipeline::queue_quads), + ), + ); } } } diff --git a/src/render/mod.rs b/src/render/mod.rs index f1da1813f7c1c44d65bec395dc8192ca69eb385d..49a7bca4ab4b35612212f72006bd97f97d25f999 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -3,9 +3,9 @@ use bevy::{ render::{ camera::RenderTarget, render_asset::RenderAssets, - render_graph::{RenderGraph, RunGraphOnViewNode, SlotInfo, SlotType}, + render_graph::{RenderGraph, RunGraphOnViewNode}, render_phase::{batch_phase_system, sort_phase_system, DrawFunctions, RenderPhase}, - Extract, ExtractSchedule, RenderApp, RenderSet, + Extract, ExtractSchedule, Render, RenderApp, RenderSet, }, window::{PrimaryWindow, Window, WindowRef}, }; @@ -53,26 +53,26 @@ pub struct BevyKayakUIRenderPlugin; impl Plugin for BevyKayakUIRenderPlugin { fn build(&self, app: &mut bevy::prelude::App) { app.init_resource::<OpacityLayerManager>() - .add_system(update_opacity_layer_cameras); + .add_systems(Update, update_opacity_layer_cameras); let render_app = app.sub_app_mut(RenderApp); render_app .init_resource::<DrawFunctions<TransparentUI>>() .init_resource::<DrawFunctions<TransparentOpacityUI>>() - .add_system(extract_core_pipeline_camera_phases.in_schedule(ExtractSchedule)) - .add_system( + .add_systems(ExtractSchedule, extract_core_pipeline_camera_phases) + .add_systems( + Render, prepare_opacity_layers .in_set(RenderSet::Queue) .before(unified::pipeline::queue_quads), ) - .add_system( - batch_phase_system::<TransparentUI> - .after(sort_phase_system::<TransparentUI>) - .in_set(RenderSet::PhaseSort), - ) - .add_system( - batch_phase_system::<TransparentOpacityUI> - .after(sort_phase_system::<TransparentOpacityUI>) + .add_systems( + Render, + ( + batch_phase_system::<TransparentUI>.after(sort_phase_system::<TransparentUI>), + batch_phase_system::<TransparentOpacityUI> + .after(sort_phase_system::<TransparentOpacityUI>), + ) .in_set(RenderSet::PhaseSort), ); @@ -81,18 +81,6 @@ impl Plugin for BevyKayakUIRenderPlugin { // let mut draw_ui_graph = RenderGraph::default(); // draw_ui_graph.add_node(draw_ui_graph::node::MAIN_PASS, pass_node_ui); - // let input_node_id = draw_ui_graph.set_input(vec![SlotInfo::new( - // draw_ui_graph::input::VIEW_ENTITY, - // SlotType::Entity, - // )]); - // draw_ui_graph - // .add_slot_edge( - // input_node_id, - // draw_ui_graph::input::VIEW_ENTITY, - // draw_ui_graph::node::MAIN_PASS, - // MainPassUINode::IN_VIEW, - // ) - // .unwrap(); // graph.add_sub_graph(draw_ui_graph::NAME, draw_ui_graph); // // graph.add_node_edge(MAIN_PASS, draw_ui_graph::NAME).unwrap(); @@ -112,12 +100,6 @@ impl Plugin for BevyKayakUIRenderPlugin { bevy::core_pipeline::core_2d::graph::node::MAIN_PASS, draw_ui_graph::node::MAIN_PASS, ); - graph_2d.add_slot_edge( - graph_2d.input_node().id, - bevy::core_pipeline::core_2d::graph::input::VIEW_ENTITY, - draw_ui_graph::node::MAIN_PASS, - RunGraphOnViewNode::IN_VIEW, - ); graph_2d.add_node_edge( bevy::core_pipeline::core_2d::graph::node::TONEMAPPING, draw_ui_graph::node::MAIN_PASS, @@ -135,7 +117,7 @@ impl Plugin for BevyKayakUIRenderPlugin { RunGraphOnViewNode::new(draw_ui_graph::NAME), ); graph_3d.add_node_edge( - bevy::core_pipeline::core_3d::graph::node::MAIN_PASS, + bevy::core_pipeline::core_3d::graph::node::END_MAIN_PASS, draw_ui_graph::node::MAIN_PASS, ); graph_3d.add_node_edge( @@ -146,17 +128,13 @@ impl Plugin for BevyKayakUIRenderPlugin { draw_ui_graph::node::MAIN_PASS, bevy::core_pipeline::core_3d::graph::node::UPSCALING, ); - graph_3d.add_slot_edge( - graph_3d.input_node().id, - bevy::core_pipeline::core_3d::graph::input::VIEW_ENTITY, - draw_ui_graph::node::MAIN_PASS, - RunGraphOnViewNode::IN_VIEW, - ); } - app.add_plugin(font::TextRendererPlugin) - .add_plugin(UnifiedRenderPlugin) - .add_plugin(BevyKayakUIExtractPlugin); + app.add_plugins(( + font::TextRendererPlugin, + UnifiedRenderPlugin, + BevyKayakUIExtractPlugin, + )); } } @@ -164,16 +142,6 @@ fn get_ui_graph(render_app: &mut App) -> RenderGraph { let ui_pass_node = MainPassUINode::new(&mut render_app.world); let mut ui_graph = RenderGraph::default(); ui_graph.add_node(draw_ui_graph::node::MAIN_PASS, ui_pass_node); - let input_node_id = ui_graph.set_input(vec![SlotInfo::new( - draw_ui_graph::input::VIEW_ENTITY, - SlotType::Entity, - )]); - ui_graph.add_slot_edge( - input_node_id, - draw_ui_graph::input::VIEW_ENTITY, - draw_ui_graph::node::MAIN_PASS, - MainPassUINode::IN_VIEW, - ); ui_graph } diff --git a/src/render/unified/mod.rs b/src/render/unified/mod.rs index febfbc25a2fabd8d4f5cffaf74df482fd4b2bc11..678161fcb833d013d56ddf69516a27411957ea70 100644 --- a/src/render/unified/mod.rs +++ b/src/render/unified/mod.rs @@ -1,14 +1,14 @@ use bevy::{ prelude::{ - AddAsset, Assets, Commands, HandleUntyped, IntoSystemAppConfig, IntoSystemConfig, Plugin, - Query, Res, ResMut, Resource, With, + AddAsset, Assets, Commands, HandleUntyped, IntoSystemConfigs, Plugin, Query, Res, ResMut, + Resource, With, }, reflect::TypeUuid, render::{ render_phase::AddRenderCommand, render_resource::{Shader, SpecializedRenderPipelines}, renderer::{RenderDevice, RenderQueue}, - Extract, ExtractSchedule, RenderApp, RenderSet, + Extract, ExtractSchedule, Render, RenderApp, RenderSet, }, window::{PrimaryWindow, Window}, }; @@ -47,16 +47,26 @@ pub const VERTEX_OUTPUT_HANDLE: HandleUntyped = pub struct UnifiedRenderPlugin; impl Plugin for UnifiedRenderPlugin { fn build(&self, app: &mut bevy::prelude::App) { - app.add_asset::<Svg>().add_plugin(text::TextRendererPlugin); + app.add_asset::<Svg>().add_plugins(text::TextRendererPlugin); let mut shaders = app.world.get_resource_mut::<Assets<Shader>>().unwrap(); - let bindings_include = Shader::from_wgsl(include_str!("shaders/bindings.wgsl")); + let bindings_include = Shader::from_wgsl( + include_str!("shaders/bindings.wgsl"), + "shaders/bindings.wgsl", + ); shaders.set_untracked(UNIFIED_BINDINGS_HANDLE, bindings_include); - let sample_quad_include = Shader::from_wgsl(include_str!("shaders/sample_quad.wgsl")); + let sample_quad_include = Shader::from_wgsl( + include_str!("shaders/sample_quad.wgsl"), + "shaders/sample_quad.wgsl", + ); shaders.set_untracked(SAMPLE_QUAD_HANDLE, sample_quad_include); - let vertex_output_include = Shader::from_wgsl(include_str!("shaders/vertex_output.wgsl")); + let vertex_output_include = Shader::from_wgsl( + include_str!("shaders/vertex_output.wgsl"), + "shaders/vertex_output.wgsl", + ); shaders.set_untracked(VERTEX_OUTPUT_HANDLE, vertex_output_include); - let unified_shader = Shader::from_wgsl(include_str!("shaders/shader.wgsl")); + let unified_shader = + Shader::from_wgsl(include_str!("shaders/shader.wgsl"), "shaders/shader.wgsl"); shaders.set_untracked(UNIFIED_SHADER_HANDLE, unified_shader); let render_app = app.sub_app_mut(RenderApp); @@ -64,30 +74,34 @@ impl Plugin for UnifiedRenderPlugin { .init_resource::<QuadTypeOffsets>() .init_resource::<ExtractedQuads>() .init_resource::<ImageBindGroups>() - .init_resource::<UnifiedPipeline>() - .init_resource::<SpecializedRenderPipelines<UnifiedPipeline>>() .init_resource::<QuadMeta>() .init_resource::<RenderSvgs>() .init_resource::<PreviousClip>() .init_resource::<PreviousIndex>() - .add_system(super::svg::extract_svg_asset.in_schedule(ExtractSchedule)) - .add_system(extract_baseline.in_schedule(ExtractSchedule)) - .add_system(queue_quad_types.in_set(RenderSet::Queue)) - .add_system( - pipeline::queue_quads - .in_set(RenderSet::Queue) - .after(queue_quad_types), + .add_systems( + ExtractSchedule, + (super::svg::extract_svg_asset, extract_baseline), ) - .add_system( - queue_ui_view_bind_groups - .in_set(RenderSet::Queue) - .after(pipeline::queue_quads), + .add_systems( + Render, + ( + queue_quad_types, + (pipeline::queue_quads, queue_ui_view_bind_groups), + ) + .chain() + .in_set(RenderSet::Queue), ) - .add_system(queue_vertices.in_set(RenderSet::QueueFlush)); + .add_systems(Render, queue_vertices.in_set(RenderSet::QueueFlush)); render_app.add_render_command::<TransparentUI, DrawUI>(); render_app.add_render_command::<TransparentOpacityUI, DrawUITransparent>(); } + + fn finish(&self, app: &mut bevy::prelude::App) { + app.sub_app_mut(RenderApp) + .init_resource::<UnifiedPipeline>() + .init_resource::<SpecializedRenderPipelines<UnifiedPipeline>>(); + } } #[derive(Resource)] diff --git a/src/render/unified/pipeline.rs b/src/render/unified/pipeline.rs index 33febefa614692ce05e4d694964f7bde38b96ca0..0c862353abf3fd966ae8e911dd80baaf695ce9da 100644 --- a/src/render/unified/pipeline.rs +++ b/src/render/unified/pipeline.rs @@ -87,7 +87,7 @@ pub struct UnifiedPipelineKey { impl FromWorld for UnifiedPipeline { fn from_world(world: &mut World) -> Self { let world = world.cell(); - let render_device = world.get_resource::<RenderDevice>().unwrap(); + let render_device = world.resource::<RenderDevice>(); let view_layout = render_device.create_bind_group_layout(&BindGroupLayoutDescriptor { entries: &[ diff --git a/src/render/unified/shaders/bindings.wgsl b/src/render/unified/shaders/bindings.wgsl index 1acc02bd545085094c7d7d7dc1c4adcbdfe1a142..ff02245ed819811dc0aee948e01c24ed728b3ef8 100644 --- a/src/render/unified/shaders/bindings.wgsl +++ b/src/render/unified/shaders/bindings.wgsl @@ -7,8 +7,8 @@ // @group(0) @binding(0) // var<uniform> view: View; -#import bevy_render::view -#import bevy_render::globals +#import bevy_render::view View +#import bevy_render::globals Globals @group(0) @binding(0) var<uniform> view: View; @@ -18,9 +18,6 @@ var<uniform> globals: Globals; struct QuadType { t: i32, - _padding_1: i32, - _padding_2: i32, - _padding_3: i32, }; @group(2) @binding(0) @@ -34,4 +31,4 @@ var image_sampler: sampler; @group(1) @binding(2) var font_texture: texture_2d_array<f32>; @group(1) @binding(3) -var font_sampler: sampler; \ No newline at end of file +var font_sampler: sampler; diff --git a/src/render/unified/shaders/sample_quad.wgsl b/src/render/unified/shaders/sample_quad.wgsl index 65f11b2f8b482c1f29eac100acc06ff94ec13848..7a8adee5d46b7e8e1a956695cd1a617272cbdf7c 100644 --- a/src/render/unified/shaders/sample_quad.wgsl +++ b/src/render/unified/shaders/sample_quad.wgsl @@ -1,5 +1,13 @@ #define_import_path kayak_ui::sample_quad +#import kayak_ui::bindings font_texture +#import kayak_ui::bindings font_sampler +#import kayak_ui::bindings image_texture +#import kayak_ui::bindings image_sampler +#import kayak_ui::bindings quad_type + +#import kayak_ui::vertex_output VertexOutput + // Where P is the position in pixel space, B is the size of the box adn R is the radius of the current corner. fn sdRoundBox(p: vec2<f32>, b: vec2<f32>, r: f32) -> f32 { var q = abs(p) - b + r; @@ -94,4 +102,4 @@ fn sample_quad(in: VertexOutput) -> vec4<f32> { } return output_color; -} \ No newline at end of file +} diff --git a/src/render/unified/shaders/shader.wgsl b/src/render/unified/shaders/shader.wgsl index 569bc4b404ba49b4359cfa34fcb23ee6ba2a7a64..de7b77442a5e7c31a60a006f5765257f78aee54b 100644 --- a/src/render/unified/shaders/shader.wgsl +++ b/src/render/unified/shaders/shader.wgsl @@ -1,6 +1,6 @@ #import kayak_ui::bindings -#import kayak_ui::vertex_output +#import kayak_ui::vertex_output VertexOutput @vertex fn vertex( diff --git a/src/render/unified/text.rs b/src/render/unified/text.rs index 00c0366563312135db05298172298fbf739521b2..71f3301f8da3d48d7468093f5e0c68b49f0f6f3c 100644 --- a/src/render/unified/text.rs +++ b/src/render/unified/text.rs @@ -1,10 +1,10 @@ use bevy::{ - prelude::{IntoSystemConfig, Plugin, Res, ResMut}, + prelude::{IntoSystemConfigs, Plugin, Res, ResMut}, render::{ render_asset::RenderAssets, renderer::{RenderDevice, RenderQueue}, texture::Image, - RenderApp, RenderSet, + Render, RenderApp, RenderSet, }, }; use kayak_font::bevy::{FontTextureCache, KayakFontPlugin}; @@ -14,10 +14,13 @@ pub struct TextRendererPlugin; impl Plugin for TextRendererPlugin { fn build(&self, app: &mut bevy::prelude::App) { - app.add_plugin(KayakFontPlugin); + app.add_plugins(KayakFontPlugin); let render_app = app.sub_app_mut(RenderApp); - render_app.add_system(create_and_update_font_cache_texture.in_set(RenderSet::Queue)); + render_app.add_systems( + Render, + create_and_update_font_cache_texture.in_set(RenderSet::Queue), + ); } } fn create_and_update_font_cache_texture( diff --git a/src/styles/corner.rs b/src/styles/corner.rs index fa02cdd1f73f6542bce7e84fced2185c68ab332a..4ffbf158299760f743de185d1941a771705d3f84 100644 --- a/src/styles/corner.rs +++ b/src/styles/corner.rs @@ -1,11 +1,11 @@ use std::ops::{Mul, MulAssign}; -use bevy::reflect::{FromReflect, Reflect}; +use bevy::reflect::Reflect; /// A struct for defining properties related to the corners of widgets /// /// This is useful for things like border radii, etc. -#[derive(Debug, Default, Reflect, FromReflect, Copy, Clone, PartialEq, Eq)] +#[derive(Debug, Default, Reflect, Copy, Clone, PartialEq, Eq)] pub struct Corner<T> where T: Copy + Default + PartialEq + Reflect, diff --git a/src/styles/edge.rs b/src/styles/edge.rs index b11e1bc2de636b494bfbdf7e04807179ecdf784e..744c56f83cc02901e987e2ded1d32797872eabbd 100644 --- a/src/styles/edge.rs +++ b/src/styles/edge.rs @@ -1,11 +1,11 @@ use std::ops::{Mul, MulAssign}; -use bevy::reflect::{FromReflect, Reflect}; +use bevy::reflect::Reflect; /// A struct for defining properties related to the edges of widgets /// /// This is useful for things like borders, padding, etc. -#[derive(Debug, Default, Reflect, FromReflect, Copy, Clone, PartialEq, Eq)] +#[derive(Debug, Default, Reflect, Copy, Clone, PartialEq, Eq)] pub struct Edge<T> where T: Copy + Default + PartialEq + Reflect, diff --git a/src/styles/mod.rs b/src/styles/mod.rs index 5a084d9a59b3105c9c53606678911e9fd19ee0ca..e9260db11e743dbb65605bd603fd639048d977ae 100644 --- a/src/styles/mod.rs +++ b/src/styles/mod.rs @@ -1,6 +1,6 @@ use bevy::{ prelude::{Color, Component, Vec2}, - reflect::{FromReflect, Reflect}, + reflect::Reflect, }; mod corner; @@ -27,7 +27,7 @@ impl From<KStyle> for ComputedStyles { } } -#[derive(FromReflect, Reflect, Clone, Copy, Default, Debug, PartialEq)] +#[derive(Reflect, Clone, Copy, Default, Debug, PartialEq)] pub struct BoxShadow { pub color: Color, pub radius: f32, diff --git a/src/styles/render_command.rs b/src/styles/render_command.rs index 41150acd9fffcd9bd2cf8c38dd85f966e29b9ca1..199c5196a5af82aafbc8c2ac77cb84a5607a3da0 100644 --- a/src/styles/render_command.rs +++ b/src/styles/render_command.rs @@ -1,13 +1,13 @@ use bevy::{ prelude::{Handle, Image, Vec2}, - reflect::{FromReflect, Reflect}, + reflect::Reflect, }; use bevy_svg::prelude::Svg; use kayak_font::{Alignment, TextLayout, TextProperties}; use super::Edge; -#[derive(Debug, Reflect, FromReflect, Clone, PartialEq)] +#[derive(Debug, Reflect, Clone, PartialEq)] pub enum RenderCommand { Empty, /// Represents a node that has no renderable object but contributes to the layout. diff --git a/src/styles/style.rs b/src/styles/style.rs index 60b697d5caa0e0bf3852adca62bc2f19afaf0e0c..2e987fd43834eaa0a53e2ad385f93cbf13c08a27 100644 --- a/src/styles/style.rs +++ b/src/styles/style.rs @@ -26,12 +26,6 @@ use super::RenderCommand; #[derive(Debug, Reflect, Clone, PartialEq, Eq)] pub struct KCursorIcon(#[reflect(ignore)] pub CursorIcon); -impl FromReflect for KCursorIcon { - fn from_reflect(_reflect: &dyn Reflect) -> Option<Self> { - None - } -} - impl Default for KCursorIcon { fn default() -> Self { Self(CursorIcon::Default) @@ -41,7 +35,7 @@ impl Default for KCursorIcon { /// The base container of all style properties /// /// The default value for this enum is [`StyleProp::Unset`]. -#[derive(Debug, Reflect, FromReflect, Clone, PartialEq, Eq)] +#[derive(Debug, Reflect, Clone, PartialEq, Eq)] pub enum StyleProp<T: Default + Clone + Reflect + FromReflect> { /// This prop is unset, meaning its actual value is not determined until style resolution, /// wherein it will be set to the property's default value. @@ -265,7 +259,7 @@ define_styles! { /// // Applied second (sets any remaining `StyleProp::Unset` fields) /// .with_style(&style_b); /// ``` - #[derive(Component, Reflect, FromReflect, Debug, Default, Clone, PartialEq)] + #[derive(Component, Reflect, Debug, Default, Clone, PartialEq)] #[reflect(Component)] pub struct KStyle { /// The background color of this widget diff --git a/src/styles/units.rs b/src/styles/units.rs index 439ab70acb6e1202cf4c5b9d3622e9ef8dba4037..a3d21d12194087d6a11fc1f17ceca3e23308a6d6 100644 --- a/src/styles/units.rs +++ b/src/styles/units.rs @@ -1,7 +1,7 @@ -use bevy::reflect::{FromReflect, Reflect}; +use bevy::reflect::Reflect; /// The layout type determines how nodes will be positioned when directed by the parent -#[derive(Default, Debug, FromReflect, Reflect, Clone, Copy, PartialEq)] +#[derive(Default, Debug, Reflect, Clone, Copy, PartialEq)] pub enum LayoutType { /// Stack child elements horizontally Row, @@ -23,7 +23,7 @@ impl From<LayoutType> for morphorm::LayoutType { } /// The position type determines whether a node will be positioned in-line with its siblings or seperate -#[derive(Default, Debug, Reflect, FromReflect, Clone, Copy, PartialEq)] +#[derive(Default, Debug, Reflect, Clone, Copy, PartialEq)] pub enum KPositionType { /// Node is positioned relative to parent but ignores its siblings SelfDirected, @@ -42,7 +42,7 @@ impl From<KPositionType> for morphorm::PositionType { } /// Units which describe spacing and size -#[derive(Default, Debug, FromReflect, Reflect, Clone, Copy, PartialEq)] +#[derive(Default, Debug, Reflect, Clone, Copy, PartialEq)] pub enum Units { /// A number of pixels Pixels(f32), diff --git a/src/widgets/mod.rs b/src/widgets/mod.rs index 6a76cdaef529d117543ed27695173ec6b79f499c..7df50cb41ff8a3c1d7fc13f2510c45ac14e789f9 100644 --- a/src/widgets/mod.rs +++ b/src/widgets/mod.rs @@ -101,13 +101,12 @@ pub struct KayakWidgets; impl Plugin for KayakWidgets { fn build(&self, app: &mut bevy::prelude::App) { - app.add_plugin(icons::IconsPlugin); - app.add_system( - transition::update_transitions - .after(update_widgets_sys) - .in_base_set(CoreSet::PostUpdate), + app.add_plugins(icons::IconsPlugin); + app.add_systems( + PostUpdate, + transition::update_transitions.after(update_widgets_sys), ) - .add_system(text_box::cursor_animation_system); + .add_systems(Update, text_box::cursor_animation_system); } }