diff --git a/Cargo.toml b/Cargo.toml index 46bf689..cc40e2e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,23 +1,9 @@ -[package] -name = "ui" -version = "0.1.0" -authors = ["hodasemi "] -edition = "2024" +[workspace] +resolver = "2" -[dependencies] -quick-xml = "0.31.0" -serde = { version = "1.0.203", features = ["derive"] } -serde_json = { version = "1.0.120" } -paste = "1.0.15" -anyhow = { version = "1.0.86", features = ["backtrace"] } +members = ["ui", "ui_proc_macro"] -vulkan-rs = { git = "https://gavania.de/hodasemi/vulkan_lib.git" } -utilities = { git = "https://gavania.de/hodasemi/utilities.git" } -assetpath = { git = "https://gavania.de/hodasemi/vulkan_lib.git" } -ecs = { git = "https://gavania.de/hodasemi/ecs.git" } - -# optional -audio = { git = "https://gavania.de/hodasemi/audio.git", optional = true } - -[features] -default = ["audio"] +[workspace.dependencies] +syn = { version = "2.0.67", features = ["extra-traits", "full"] } +quote = "1.0.35" +proc-macro2 = "1.0.86" diff --git a/ui/Cargo.toml b/ui/Cargo.toml new file mode 100644 index 0000000..46bf689 --- /dev/null +++ b/ui/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "ui" +version = "0.1.0" +authors = ["hodasemi "] +edition = "2024" + +[dependencies] +quick-xml = "0.31.0" +serde = { version = "1.0.203", features = ["derive"] } +serde_json = { version = "1.0.120" } +paste = "1.0.15" +anyhow = { version = "1.0.86", features = ["backtrace"] } + +vulkan-rs = { git = "https://gavania.de/hodasemi/vulkan_lib.git" } +utilities = { git = "https://gavania.de/hodasemi/utilities.git" } +assetpath = { git = "https://gavania.de/hodasemi/vulkan_lib.git" } +ecs = { git = "https://gavania.de/hodasemi/ecs.git" } + +# optional +audio = { git = "https://gavania.de/hodasemi/audio.git", optional = true } + +[features] +default = ["audio"] diff --git a/build.rs b/ui/build.rs similarity index 100% rename from build.rs rename to ui/build.rs diff --git a/gui_doc.Rmd b/ui/gui_doc.Rmd similarity index 100% rename from gui_doc.Rmd rename to ui/gui_doc.Rmd diff --git a/gui_doc.pdf b/ui/gui_doc.pdf similarity index 100% rename from gui_doc.pdf rename to ui/gui_doc.pdf diff --git a/src/builder/builder.rs b/ui/src/builder/builder.rs similarity index 100% rename from src/builder/builder.rs rename to ui/src/builder/builder.rs diff --git a/src/builder/mod.rs b/ui/src/builder/mod.rs similarity index 100% rename from src/builder/mod.rs rename to ui/src/builder/mod.rs diff --git a/src/builder/snippet.rs b/ui/src/builder/snippet.rs similarity index 100% rename from src/builder/snippet.rs rename to ui/src/builder/snippet.rs diff --git a/src/builder/validator/buttoninfo.rs b/ui/src/builder/validator/buttoninfo.rs similarity index 100% rename from src/builder/validator/buttoninfo.rs rename to ui/src/builder/validator/buttoninfo.rs diff --git a/src/builder/validator/gridinfo.rs b/ui/src/builder/validator/gridinfo.rs similarity index 100% rename from src/builder/validator/gridinfo.rs rename to ui/src/builder/validator/gridinfo.rs diff --git a/src/builder/validator/iconinfo.rs b/ui/src/builder/validator/iconinfo.rs similarity index 100% rename from src/builder/validator/iconinfo.rs rename to ui/src/builder/validator/iconinfo.rs diff --git a/src/builder/validator/labelinfo.rs b/ui/src/builder/validator/labelinfo.rs similarity index 100% rename from src/builder/validator/labelinfo.rs rename to ui/src/builder/validator/labelinfo.rs diff --git a/src/builder/validator/mandatory.rs b/ui/src/builder/validator/mandatory.rs similarity index 100% rename from src/builder/validator/mandatory.rs rename to ui/src/builder/validator/mandatory.rs diff --git a/src/builder/validator/mod.rs b/ui/src/builder/validator/mod.rs similarity index 100% rename from src/builder/validator/mod.rs rename to ui/src/builder/validator/mod.rs diff --git a/src/builder/validator/multi_line_labelinfo.rs b/ui/src/builder/validator/multi_line_labelinfo.rs similarity index 100% rename from src/builder/validator/multi_line_labelinfo.rs rename to ui/src/builder/validator/multi_line_labelinfo.rs diff --git a/src/builder/validator/multi_line_text_field_info.rs b/ui/src/builder/validator/multi_line_text_field_info.rs similarity index 100% rename from src/builder/validator/multi_line_text_field_info.rs rename to ui/src/builder/validator/multi_line_text_field_info.rs diff --git a/src/builder/validator/progressbar_info.rs b/ui/src/builder/validator/progressbar_info.rs similarity index 100% rename from src/builder/validator/progressbar_info.rs rename to ui/src/builder/validator/progressbar_info.rs diff --git a/src/builder/validator/rootinfo.rs b/ui/src/builder/validator/rootinfo.rs similarity index 100% rename from src/builder/validator/rootinfo.rs rename to ui/src/builder/validator/rootinfo.rs diff --git a/src/builder/validator/textfieldinfo.rs b/ui/src/builder/validator/textfieldinfo.rs similarity index 100% rename from src/builder/validator/textfieldinfo.rs rename to ui/src/builder/validator/textfieldinfo.rs diff --git a/src/builder/validator/uiinfoelement.rs b/ui/src/builder/validator/uiinfoelement.rs similarity index 100% rename from src/builder/validator/uiinfoelement.rs rename to ui/src/builder/validator/uiinfoelement.rs diff --git a/src/builder/validator/validator.rs b/ui/src/builder/validator/validator.rs similarity index 100% rename from src/builder/validator/validator.rs rename to ui/src/builder/validator/validator.rs diff --git a/src/context_interface.rs b/ui/src/context_interface.rs similarity index 100% rename from src/context_interface.rs rename to ui/src/context_interface.rs diff --git a/src/controller_button.rs b/ui/src/controller_button.rs similarity index 100% rename from src/controller_button.rs rename to ui/src/controller_button.rs diff --git a/src/element_creator/generator.frag b/ui/src/element_creator/generator.frag similarity index 100% rename from src/element_creator/generator.frag rename to ui/src/element_creator/generator.frag diff --git a/src/element_creator/generator.rs b/ui/src/element_creator/generator.rs similarity index 100% rename from src/element_creator/generator.rs rename to ui/src/element_creator/generator.rs diff --git a/src/element_creator/generator.vert b/ui/src/element_creator/generator.vert similarity index 100% rename from src/element_creator/generator.vert rename to ui/src/element_creator/generator.vert diff --git a/src/element_creator/mod.rs b/ui/src/element_creator/mod.rs similarity index 100% rename from src/element_creator/mod.rs rename to ui/src/element_creator/mod.rs diff --git a/src/element_creator/position_only.rs b/ui/src/element_creator/position_only.rs similarity index 100% rename from src/element_creator/position_only.rs rename to ui/src/element_creator/position_only.rs diff --git a/src/elements/button.rs b/ui/src/elements/button.rs similarity index 100% rename from src/elements/button.rs rename to ui/src/elements/button.rs diff --git a/src/elements/callback_builder.rs b/ui/src/elements/callback_builder.rs similarity index 100% rename from src/elements/callback_builder.rs rename to ui/src/elements/callback_builder.rs diff --git a/src/elements/fill_type.rs b/ui/src/elements/fill_type.rs similarity index 100% rename from src/elements/fill_type.rs rename to ui/src/elements/fill_type.rs diff --git a/src/elements/grid.rs b/ui/src/elements/grid.rs similarity index 100% rename from src/elements/grid.rs rename to ui/src/elements/grid.rs diff --git a/src/elements/icon.rs b/ui/src/elements/icon.rs similarity index 100% rename from src/elements/icon.rs rename to ui/src/elements/icon.rs diff --git a/src/elements/label.rs b/ui/src/elements/label.rs similarity index 100% rename from src/elements/label.rs rename to ui/src/elements/label.rs diff --git a/src/elements/mod.rs b/ui/src/elements/mod.rs similarity index 100% rename from src/elements/mod.rs rename to ui/src/elements/mod.rs diff --git a/src/elements/multi_line_label.rs b/ui/src/elements/multi_line_label.rs similarity index 100% rename from src/elements/multi_line_label.rs rename to ui/src/elements/multi_line_label.rs diff --git a/src/elements/multi_line_textfield.rs b/ui/src/elements/multi_line_textfield.rs similarity index 100% rename from src/elements/multi_line_textfield.rs rename to ui/src/elements/multi_line_textfield.rs diff --git a/src/elements/prelude.rs b/ui/src/elements/prelude.rs similarity index 100% rename from src/elements/prelude.rs rename to ui/src/elements/prelude.rs diff --git a/src/elements/progress_bar.rs b/ui/src/elements/progress_bar.rs similarity index 100% rename from src/elements/progress_bar.rs rename to ui/src/elements/progress_bar.rs diff --git a/src/elements/textfield.rs b/ui/src/elements/textfield.rs similarity index 100% rename from src/elements/textfield.rs rename to ui/src/elements/textfield.rs diff --git a/src/elements/traits.rs b/ui/src/elements/traits.rs similarity index 100% rename from src/elements/traits.rs rename to ui/src/elements/traits.rs diff --git a/src/elements/ui_element.rs b/ui/src/elements/ui_element.rs similarity index 100% rename from src/elements/ui_element.rs rename to ui/src/elements/ui_element.rs diff --git a/src/elements/wrapper.rs b/ui/src/elements/wrapper.rs similarity index 100% rename from src/elements/wrapper.rs rename to ui/src/elements/wrapper.rs diff --git a/src/gui_direction.rs b/ui/src/gui_direction.rs similarity index 100% rename from src/gui_direction.rs rename to ui/src/gui_direction.rs diff --git a/src/gui_handler/default_font.png b/ui/src/gui_handler/default_font.png similarity index 100% rename from src/gui_handler/default_font.png rename to ui/src/gui_handler/default_font.png diff --git a/src/gui_handler/elements.rs b/ui/src/gui_handler/elements.rs similarity index 100% rename from src/gui_handler/elements.rs rename to ui/src/gui_handler/elements.rs diff --git a/src/gui_handler/gui/audible.rs b/ui/src/gui_handler/gui/audible.rs similarity index 100% rename from src/gui_handler/gui/audible.rs rename to ui/src/gui_handler/gui/audible.rs diff --git a/src/gui_handler/gui/clickable.rs b/ui/src/gui_handler/gui/clickable.rs similarity index 100% rename from src/gui_handler/gui/clickable.rs rename to ui/src/gui_handler/gui/clickable.rs diff --git a/src/gui_handler/gui/colorable.rs b/ui/src/gui_handler/gui/colorable.rs similarity index 100% rename from src/gui_handler/gui/colorable.rs rename to ui/src/gui_handler/gui/colorable.rs diff --git a/src/gui_handler/gui/displayable.rs b/ui/src/gui_handler/gui/displayable.rs similarity index 100% rename from src/gui_handler/gui/displayable.rs rename to ui/src/gui_handler/gui/displayable.rs diff --git a/src/gui_handler/gui/executable.rs b/ui/src/gui_handler/gui/executable.rs similarity index 100% rename from src/gui_handler/gui/executable.rs rename to ui/src/gui_handler/gui/executable.rs diff --git a/src/gui_handler/gui/framable.rs b/ui/src/gui_handler/gui/framable.rs similarity index 100% rename from src/gui_handler/gui/framable.rs rename to ui/src/gui_handler/gui/framable.rs diff --git a/src/gui_handler/gui/hoverable.rs b/ui/src/gui_handler/gui/hoverable.rs similarity index 100% rename from src/gui_handler/gui/hoverable.rs rename to ui/src/gui_handler/gui/hoverable.rs diff --git a/src/gui_handler/gui/iconizable.rs b/ui/src/gui_handler/gui/iconizable.rs similarity index 100% rename from src/gui_handler/gui/iconizable.rs rename to ui/src/gui_handler/gui/iconizable.rs diff --git a/src/gui_handler/gui/mod.rs b/ui/src/gui_handler/gui/mod.rs similarity index 100% rename from src/gui_handler/gui/mod.rs rename to ui/src/gui_handler/gui/mod.rs diff --git a/src/gui_handler/gui/selectable.rs b/ui/src/gui_handler/gui/selectable.rs similarity index 100% rename from src/gui_handler/gui/selectable.rs rename to ui/src/gui_handler/gui/selectable.rs diff --git a/src/gui_handler/gui/textable.rs b/ui/src/gui_handler/gui/textable.rs similarity index 100% rename from src/gui_handler/gui/textable.rs rename to ui/src/gui_handler/gui/textable.rs diff --git a/src/gui_handler/gui/texturedvertex.rs b/ui/src/gui_handler/gui/texturedvertex.rs similarity index 100% rename from src/gui_handler/gui/texturedvertex.rs rename to ui/src/gui_handler/gui/texturedvertex.rs diff --git a/src/gui_handler/gui/topgui.rs b/ui/src/gui_handler/gui/topgui.rs similarity index 100% rename from src/gui_handler/gui/topgui.rs rename to ui/src/gui_handler/gui/topgui.rs diff --git a/src/gui_handler/gui/writeable.rs b/ui/src/gui_handler/gui/writeable.rs similarity index 100% rename from src/gui_handler/gui/writeable.rs rename to ui/src/gui_handler/gui/writeable.rs diff --git a/src/gui_handler/gui_handler.rs b/ui/src/gui_handler/gui_handler.rs similarity index 99% rename from src/gui_handler/gui_handler.rs rename to ui/src/gui_handler/gui_handler.rs index f6e6f2d..e0bd334 100644 --- a/src/gui_handler/gui_handler.rs +++ b/ui/src/gui_handler/gui_handler.rs @@ -936,12 +936,11 @@ impl GuiHandler { } pub fn process_callbacks(&mut self, commands: &mut Commands) -> Result<()> { - let callback_self = unsafe { remove_life_time_mut(self) }; let callbacks = mem::take(&mut self.callback_list); callbacks .into_iter() - .try_for_each(|callback| callback(commands, callback_self)) + .try_for_each(|callback| callback(commands, self)) } fn render( diff --git a/src/gui_handler/gui_shader/input_rect.frag b/ui/src/gui_handler/gui_shader/input_rect.frag similarity index 100% rename from src/gui_handler/gui_shader/input_rect.frag rename to ui/src/gui_handler/gui_shader/input_rect.frag diff --git a/src/gui_handler/gui_shader/rect.frag b/ui/src/gui_handler/gui_shader/rect.frag similarity index 100% rename from src/gui_handler/gui_shader/rect.frag rename to ui/src/gui_handler/gui_shader/rect.frag diff --git a/src/gui_handler/gui_shader/rect.vert b/ui/src/gui_handler/gui_shader/rect.vert similarity index 100% rename from src/gui_handler/gui_shader/rect.vert rename to ui/src/gui_handler/gui_shader/rect.vert diff --git a/src/gui_handler/gui_shader/single_color.frag b/ui/src/gui_handler/gui_shader/single_color.frag similarity index 100% rename from src/gui_handler/gui_shader/single_color.frag rename to ui/src/gui_handler/gui_shader/single_color.frag diff --git a/src/gui_handler/gui_shader/single_color.vert b/ui/src/gui_handler/gui_shader/single_color.vert similarity index 100% rename from src/gui_handler/gui_shader/single_color.vert rename to ui/src/gui_handler/gui_shader/single_color.vert diff --git a/src/gui_handler/gui_shader/text.frag b/ui/src/gui_handler/gui_shader/text.frag similarity index 100% rename from src/gui_handler/gui_shader/text.frag rename to ui/src/gui_handler/gui_shader/text.frag diff --git a/src/gui_handler/gui_shader/text.vert b/ui/src/gui_handler/gui_shader/text.vert similarity index 100% rename from src/gui_handler/gui_shader/text.vert rename to ui/src/gui_handler/gui_shader/text.vert diff --git a/src/gui_handler/mod.rs b/ui/src/gui_handler/mod.rs similarity index 100% rename from src/gui_handler/mod.rs rename to ui/src/gui_handler/mod.rs diff --git a/src/gui_handler/prelude.rs b/ui/src/gui_handler/prelude.rs similarity index 100% rename from src/gui_handler/prelude.rs rename to ui/src/gui_handler/prelude.rs diff --git a/src/keyboard/lower_case.xml b/ui/src/keyboard/lower_case.xml similarity index 100% rename from src/keyboard/lower_case.xml rename to ui/src/keyboard/lower_case.xml diff --git a/src/keyboard/mod.rs b/ui/src/keyboard/mod.rs similarity index 100% rename from src/keyboard/mod.rs rename to ui/src/keyboard/mod.rs diff --git a/src/keyboard/specials.xml b/ui/src/keyboard/specials.xml similarity index 100% rename from src/keyboard/specials.xml rename to ui/src/keyboard/specials.xml diff --git a/src/keyboard/text_field.xml b/ui/src/keyboard/text_field.xml similarity index 100% rename from src/keyboard/text_field.xml rename to ui/src/keyboard/text_field.xml diff --git a/src/keyboard/upper_case.xml b/ui/src/keyboard/upper_case.xml similarity index 100% rename from src/keyboard/upper_case.xml rename to ui/src/keyboard/upper_case.xml diff --git a/src/lib.rs b/ui/src/lib.rs similarity index 100% rename from src/lib.rs rename to ui/src/lib.rs diff --git a/src/mouse_button.rs b/ui/src/mouse_button.rs similarity index 100% rename from src/mouse_button.rs rename to ui/src/mouse_button.rs diff --git a/src/prelude.rs b/ui/src/prelude.rs similarity index 100% rename from src/prelude.rs rename to ui/src/prelude.rs diff --git a/src/state.rs b/ui/src/state.rs similarity index 100% rename from src/state.rs rename to ui/src/state.rs diff --git a/src/states.rs b/ui/src/states.rs similarity index 100% rename from src/states.rs rename to ui/src/states.rs diff --git a/src/tab_control.rs b/ui/src/tab_control.rs similarity index 100% rename from src/tab_control.rs rename to ui/src/tab_control.rs diff --git a/ui_proc_macro/Cargo.toml b/ui_proc_macro/Cargo.toml new file mode 100644 index 0000000..0ad510b --- /dev/null +++ b/ui_proc_macro/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "ui_proc_macro" +version = "0.1.0" +edition = "2024" + +[lib] +proc-macro = true + +[dependencies] +syn = { workspace = true } +quote = { workspace = true } +proc-macro2 = { workspace = true } +update_macro_base = { git = "https://gavania.de/hodasemi/ecs" } diff --git a/ui_proc_macro/src/lib.rs b/ui_proc_macro/src/lib.rs new file mode 100644 index 0000000..18adf4d --- /dev/null +++ b/ui_proc_macro/src/lib.rs @@ -0,0 +1,37 @@ +mod update; + +use update::update; + +use proc_macro::TokenStream; +use quote::quote; +use syn::{ + DeriveInput, LitInt, Result, + parse::{Parse, ParseStream}, + parse_macro_input, + token::Comma, +}; + +struct UpdateInfo { + max_components: usize, + max_resources: usize, +} + +impl Parse for UpdateInfo { + fn parse(input: ParseStream) -> Result { + let max_components = input.parse::()?.base10_parse()?; + input.parse::()?; + let max_resources = input.parse::()?.base10_parse()?; + + Ok(Self { + max_components, + max_resources, + }) + } +} + +#[proc_macro] +pub fn implement_updates(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as UpdateInfo); + + update(input.max_components, input.max_resources) +} diff --git a/ui_proc_macro/src/update.rs b/ui_proc_macro/src/update.rs new file mode 100644 index 0000000..c8b5660 --- /dev/null +++ b/ui_proc_macro/src/update.rs @@ -0,0 +1,105 @@ +use proc_macro2::TokenStream as TokenStream2; +use update_macro_base::*; + +fn resource_only_events_and_systems(update: &Update) -> TokenStream2 { + let resource_tokens = update.resourece_tokens(); + + let resource_types = &resource_tokens.resource_types; + let resource_type_impls = &resource_tokens.resource_type_impls; + let resources = &resource_tokens.resources; + let resource_requirement = &resource_tokens.resource_requirement; + let resource_store = &resource_tokens.resource_store; + let resource_idents = &resource_tokens.resource_idents; + + todo!() +} + +fn events_and_systems(update: &Update) -> TokenStream2 { + let query_tokens = update.query_tokens(); + + let filter_types = &query_tokens.filter_types; + let filter_type_impls = &query_tokens.filter_type_impls; + let query_types = &query_tokens.query_types; + let query_type_impls = &query_tokens.query_type_impls; + let queries = query_tokens.queries; + let filter_requirements = &query_tokens.filter_requirements; + let component_requirements = &query_tokens.component_requirements; + let query_count = query_tokens.query_count; + let verify_dedup = &query_tokens.verify_dedup; + let check_entities = &query_tokens.check_entities; + let component_stores = &query_tokens.component_stores; + let query_structs = &query_tokens.query_structs; + let query_idents = &query_tokens.query_idents; + + let resource_tokens = update.resourece_tokens(); + + let resource_types = &resource_tokens.resource_types; + let resource_type_impls = &resource_tokens.resource_type_impls; + let resources = &resource_tokens.resources; + let resource_requirement = &resource_tokens.resource_requirement; + let resource_store = &resource_tokens.resource_store; + let resource_idents = &resource_tokens.resource_idents; + + todo!() +} + +fn update(max_components: usize, max_resources: usize) -> TokenStream2 { + let mut queries: Vec> = Vec::new(); + + for c in Update::MIN_COMPONENTS..=max_components { + queries.push(vec![c]); + } + + for x in Update::MIN_COMPONENTS..=max_components { + for y in Update::MIN_COMPONENTS..=max_components { + queries.push(vec![x, y]); + } + } + + for x in Update::MIN_COMPONENTS..=max_components { + for y in Update::MIN_COMPONENTS..=max_components { + for z in Update::MIN_COMPONENTS..=max_components { + queries.push(vec![x, y, z]); + } + } + } + + let mut resources = Vec::new(); + + for resource in Update::MIN_RESOURCE..=max_resources { + resources.push(resource); + } + + let mut updates = Vec::new(); + + for query in queries.iter() { + for resource_count in resources.iter() { + updates.push(events_and_systems(&Update::new( + query.iter().cloned(), + *resource_count, + ))); + } + } + + let mut events = Vec::new(); + + for resource_count in resources.iter() { + let q = + resource_only_events_and_systems(&Update::new(vec![1].into_iter(), *resource_count)); + + events.push(q); + } + + // updates.push(Update::new(vec![1].into_iter(), 0)); + + // let q = quote! { + // #( #updates )* + // }; + + // panic!("{q}"); + + TokenStream::from(quote! { + #( #updates )* + #( #events )* + }) +}