From 62438e0d249b6a1f9c00773ce41740e445f3f066 Mon Sep 17 00:00:00 2001 From: LunarAkai Date: Tue, 5 Aug 2025 11:35:36 +0200 Subject: [PATCH] ???? --- Cargo.lock | 11 ++++++++ crates/moonhare_derives/Cargo.toml | 14 +++++++++++ crates/moonhare_derives/src/lib.rs | 32 ++++++++++++++++++++++++ crates/moonhare_derives/src/node.rs | 24 ++++++++++++++++++ crates/moonhare_derives/src/system.rs | 31 +++++++++++++++++++++++ crates/moonhare_game/Cargo.toml | 2 ++ crates/moonhare_game/src/basic/mod.rs | 1 - crates/moonhare_game/src/basic/node.rs | 3 --- crates/moonhare_game/src/lib.rs | 8 +++--- crates/moonhare_game/src/nodes/mod.rs | 2 ++ crates/moonhare_game/src/nodes/node.rs | 16 ++++++++++++ crates/moonhare_game/src/nodes/window.rs | 17 +++++++++++++ crates/moonhare_internal/Cargo.toml | 1 + crates/moonhare_internal/src/lib.rs | 1 + playground/src/main.rs | 1 + 15 files changed, 157 insertions(+), 7 deletions(-) create mode 100644 crates/moonhare_derives/Cargo.toml create mode 100644 crates/moonhare_derives/src/lib.rs create mode 100644 crates/moonhare_derives/src/node.rs create mode 100644 crates/moonhare_derives/src/system.rs delete mode 100644 crates/moonhare_game/src/basic/mod.rs delete mode 100644 crates/moonhare_game/src/basic/node.rs create mode 100644 crates/moonhare_game/src/nodes/mod.rs create mode 100644 crates/moonhare_game/src/nodes/node.rs create mode 100644 crates/moonhare_game/src/nodes/window.rs diff --git a/Cargo.lock b/Cargo.lock index 7471a01..cec3774 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -769,6 +769,15 @@ dependencies = [ "adler2", ] +[[package]] +name = "moonhare_derives" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "moonhare_ecs" version = "0.1.0" @@ -791,6 +800,7 @@ version = "0.1.0" name = "moonhare_game" version = "0.1.0" dependencies = [ + "moonhare_derives", "moonhare_ecs", "moonhare_graphics", "moonhare_log", @@ -811,6 +821,7 @@ dependencies = [ name = "moonhare_internal" version = "0.1.0" dependencies = [ + "moonhare_derives", "moonhare_ecs", "moonhare_event", "moonhare_game", diff --git a/crates/moonhare_derives/Cargo.toml b/crates/moonhare_derives/Cargo.toml new file mode 100644 index 0000000..fec5aca --- /dev/null +++ b/crates/moonhare_derives/Cargo.toml @@ -0,0 +1,14 @@ +[package] +edition = "2024" +name = "moonhare_derives" +version.workspace = true +authors.workspace = true + +[dependencies] +syn = "2.0" +proc-macro2 = "1" +quote = "1" + +[lib] +proc-macro = true + diff --git a/crates/moonhare_derives/src/lib.rs b/crates/moonhare_derives/src/lib.rs new file mode 100644 index 0000000..80fe124 --- /dev/null +++ b/crates/moonhare_derives/src/lib.rs @@ -0,0 +1,32 @@ +use proc_macro2::TokenStream as TokenStream2; +use syn::{parse_macro_input, parse_quote, DeriveInput, GenericParam, Generics}; +use proc_macro::{self, TokenStream}; + +mod node; +mod system; + +#[proc_macro_derive(System)] +pub fn system(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let input = parse_macro_input!(input as DeriveInput); + + system::system(input) +} + + + +#[proc_macro_derive(Node)] +pub fn node(input: proc_macro::TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + + TokenStream::from(node::node(input)) +} + +// Add a bound `T: Node` to every type parameter T. +fn add_trait_bounds(mut generics: Generics) -> Generics { + for param in &mut generics.params { + if let GenericParam::Type(ref mut type_param) = *param { + type_param.bounds.push(parse_quote!(node::Node)); + } + } + generics +} \ No newline at end of file diff --git a/crates/moonhare_derives/src/node.rs b/crates/moonhare_derives/src/node.rs new file mode 100644 index 0000000..ba9de90 --- /dev/null +++ b/crates/moonhare_derives/src/node.rs @@ -0,0 +1,24 @@ +use proc_macro::TokenStream; +use proc_macro2::TokenStream as TokenStream2; +use quote::quote; +use syn::DeriveInput; + +use crate::add_trait_bounds; + +pub fn node(input: DeriveInput) -> TokenStream2 { + let name = input.ident; + + let expanded = quote! { + impl Node for #name { + fn init(&mut self) { + self.init(); + } + + fn update(&mut self) { + self.update(); + } + } + }; + + expanded +} \ No newline at end of file diff --git a/crates/moonhare_derives/src/system.rs b/crates/moonhare_derives/src/system.rs new file mode 100644 index 0000000..96babea --- /dev/null +++ b/crates/moonhare_derives/src/system.rs @@ -0,0 +1,31 @@ +use proc_macro::TokenStream; +use quote::quote; +use syn::DeriveInput; + +use crate::add_trait_bounds; + + +pub fn system(input: DeriveInput) -> TokenStream { + let name = input.ident; + + let generics = add_trait_bounds(input.generics); + let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); + + let expanded = quote! { + impl #name { + fn init(&mut self) { + + } + + fn update(&mut self) { + + } + + fn add_child(&mut self, child: Self) { + + } + } + }; + + proc_macro::TokenStream::from(expanded) +} diff --git a/crates/moonhare_game/Cargo.toml b/crates/moonhare_game/Cargo.toml index 97d9f14..1d5c8e2 100644 --- a/crates/moonhare_game/Cargo.toml +++ b/crates/moonhare_game/Cargo.toml @@ -5,7 +5,9 @@ version.workspace = true authors.workspace = true [dependencies] +moonhare_derives = { path = "../moonhare_derives" } moonhare_ecs = { path = "../moonhare_ecs" } moonhare_graphics = { path = "../moonhare_graphics" } moonhare_log = { path = "../moonhare_log" } moonhare_window = { path = "../moonhare_window" } + diff --git a/crates/moonhare_game/src/basic/mod.rs b/crates/moonhare_game/src/basic/mod.rs deleted file mode 100644 index 12e2c60..0000000 --- a/crates/moonhare_game/src/basic/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod node; \ No newline at end of file diff --git a/crates/moonhare_game/src/basic/node.rs b/crates/moonhare_game/src/basic/node.rs deleted file mode 100644 index 5c30870..0000000 --- a/crates/moonhare_game/src/basic/node.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub trait Node { - -} \ No newline at end of file diff --git a/crates/moonhare_game/src/lib.rs b/crates/moonhare_game/src/lib.rs index 41ffabd..eb81bdf 100644 --- a/crates/moonhare_game/src/lib.rs +++ b/crates/moonhare_game/src/lib.rs @@ -10,9 +10,7 @@ use moonhare_window::{platforms::glfw_window::GLFWWindow}; use crate::systems::system::{BaseSystems, System}; pub mod systems; -pub mod basic; - -/// Only one Game may exist per project +pub mod nodes; /* #[derive(Debug)] pub struct Game { pub base_systems: BaseSystems, @@ -22,6 +20,7 @@ pub struct Game { pub name: String, } */ + // when creating a game, you can add systems to it, which do _things_ // BaseSystems -> Window, Update, Render @@ -73,6 +72,8 @@ impl Game { } pub fn run(self) { + + info("Running Game..."); //------------------------------ // Run Init on all Systems @@ -116,3 +117,4 @@ fn render(context: Rc) { let target = moonhare_graphics::glium::Frame::new(context.clone(), context.get_framebuffer_dimensions()); moonhare_graphics::draw_background_color(Color::color_from_rgb(255, 255, 255), target); } + diff --git a/crates/moonhare_game/src/nodes/mod.rs b/crates/moonhare_game/src/nodes/mod.rs new file mode 100644 index 0000000..6426bb0 --- /dev/null +++ b/crates/moonhare_game/src/nodes/mod.rs @@ -0,0 +1,2 @@ +pub mod node; +pub mod window; diff --git a/crates/moonhare_game/src/nodes/node.rs b/crates/moonhare_game/src/nodes/node.rs new file mode 100644 index 0000000..8ef7393 --- /dev/null +++ b/crates/moonhare_game/src/nodes/node.rs @@ -0,0 +1,16 @@ +use moonhare_derives::Node; + +pub trait Node { + fn init(&mut self); + fn update(&mut self); +} + +impl Node for Box { + fn init(&mut self) { + todo!() + } + + fn update(&mut self) { + todo!() + } +} diff --git a/crates/moonhare_game/src/nodes/window.rs b/crates/moonhare_game/src/nodes/window.rs new file mode 100644 index 0000000..7dbc7b2 --- /dev/null +++ b/crates/moonhare_game/src/nodes/window.rs @@ -0,0 +1,17 @@ +use moonhare_derives::Node; +use crate::nodes::node::Node; + +#[derive(Node)] +struct Window { + a: Box +} + +impl Window { + fn init(&mut self) { + + } + + fn update(&mut self) { + + } +} \ No newline at end of file diff --git a/crates/moonhare_internal/Cargo.toml b/crates/moonhare_internal/Cargo.toml index 7262a33..78e1e75 100644 --- a/crates/moonhare_internal/Cargo.toml +++ b/crates/moonhare_internal/Cargo.toml @@ -6,6 +6,7 @@ authors.workspace = true [dependencies] +moonhare_derives = { path = "../moonhare_derives" } moonhare_ecs = { path = "../moonhare_ecs" } moonhare_event = { path = "../moonhare_event" } moonhare_game = { path = "../moonhare_game" } diff --git a/crates/moonhare_internal/src/lib.rs b/crates/moonhare_internal/src/lib.rs index 3cc5570..51c8b7c 100644 --- a/crates/moonhare_internal/src/lib.rs +++ b/crates/moonhare_internal/src/lib.rs @@ -1,3 +1,4 @@ +pub use moonhare_derives as moon_derives; pub use moonhare_ecs as ecs; pub use moonhare_event as event; pub use moonhare_game as game; diff --git a/playground/src/main.rs b/playground/src/main.rs index 3fdd057..d195a49 100644 --- a/playground/src/main.rs +++ b/playground/src/main.rs @@ -2,6 +2,7 @@ use std::fs::File; use moonhare_engine::{game::Game, log}; + fn main() { let _ = log::configere_logger(); log::info("test");