From d63043aa3ac8602d29c1e6703c5b9783a80ce7a6 Mon Sep 17 00:00:00 2001 From: NiseVoid <nisevoid@gmail.com> Date: Sun, 9 Jul 2023 23:58:16 +0200 Subject: [PATCH] Upgrade to bevy 0.11 --- Cargo.toml | 9 ++- examples/main_menu.rs | 5 +- kayak_font/Cargo.toml | 6 +- kayak_font/src/bevy/mod.rs | 10 +-- .../src/bevy/renderer/font_texture_cache.rs | 6 +- kayak_font/src/font.rs | 8 ++- kayak_font/src/layout/glyph.rs | 4 +- kayak_font/src/layout/grapheme.rs | 4 +- kayak_font/src/layout/line.rs | 4 +- kayak_font/src/layout/text.rs | 8 +-- src/camera/mod.rs | 2 +- src/context.rs | 52 +++++++------- src/cursor.rs | 4 +- src/event_dispatcher.rs | 8 +-- src/input.rs | 8 ++- src/layout.rs | 4 +- src/node.rs | 7 +- src/on_change.rs | 2 +- src/on_event.rs | 2 +- src/on_layout.rs | 2 +- src/render/extract.rs | 10 +-- src/render/font/mod.rs | 4 +- src/render/material/mod.rs | 8 ++- src/render/material/plugin.rs | 27 +++---- src/render/mod.rs | 70 +++++-------------- src/render/unified/mod.rs | 58 +++++++++------ src/render/unified/pipeline.rs | 2 +- src/render/unified/shaders/bindings.wgsl | 9 +-- src/render/unified/shaders/sample_quad.wgsl | 10 ++- src/render/unified/shaders/shader.wgsl | 2 +- src/render/unified/text.rs | 11 +-- src/styles/corner.rs | 4 +- src/styles/edge.rs | 4 +- src/styles/mod.rs | 4 +- src/styles/render_command.rs | 4 +- src/styles/style.rs | 10 +-- src/styles/units.rs | 8 +-- src/widgets/mod.rs | 11 ++- 38 files changed, 205 insertions(+), 206 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1c5b8d8..18c76e6 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 0111af0..7b33cef 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 721390f..105eb11 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 97da832..68b9391 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 c61a329..8a9f22f 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 b5c1187..da5d4f6 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 a7d7f84..65b1bae 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 df0ce15..c578275 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 41e0703..0bbe393 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 8d5a590..2a80a28 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 1e02a53..f887086 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 c51cadc..ffe96d1 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 b3df333..220e924 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 4c9f4bb..35b1747 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 cf51b47..13947a0 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 52e546a..63fdf66 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 680154b..dd3c5f4 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 ae8058a..3cb9073 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 6fd441a..eb0fd54 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 43b483a..253db5c 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 f9942d8..affd675 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 86e02cb..41c693a 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 665988b..68866df 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 ba98dd2..897a4d9 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 f1da181..49a7bca 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 febfbc2..678161f 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 33febef..0c86235 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 1acc02b..ff02245 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 65f11b2..7a8adee 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 569bc4b..de7b774 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 00c0366..71f3301 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 fa02cdd..4ffbf15 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 b11e1bc..744c56f 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 5a084d9..e9260db 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 41150ac..199c519 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 60b697d..2e987fd 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 439ab70..a3d21d1 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 6a76cda..7df50cb 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); } } -- GitLab