diff --git a/Cargo.lock b/Cargo.lock index db15128..523a619 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -509,6 +509,10 @@ version = "0.1.0" [[package]] name = "moonhare_game" version = "0.1.0" +dependencies = [ + "moonhare_log", + "moonhare_window", +] [[package]] name = "moonhare_graphics" @@ -538,6 +542,7 @@ dependencies = [ name = "moonhare_window" version = "0.1.0" dependencies = [ + "moonhare_log", "winit", ] diff --git a/crates/moonhare_game/Cargo.toml b/crates/moonhare_game/Cargo.toml index de3eca9..efd0f1d 100644 --- a/crates/moonhare_game/Cargo.toml +++ b/crates/moonhare_game/Cargo.toml @@ -5,3 +5,5 @@ version.workspace = true authors.workspace = true [dependencies] +moonhare_log = { path = "../moonhare_log" } +moonhare_window = { path = "../moonhare_window" } \ No newline at end of file diff --git a/crates/moonhare_game/src/basic/game_window.rs b/crates/moonhare_game/src/basic/game_window.rs new file mode 100644 index 0000000..51715ed --- /dev/null +++ b/crates/moonhare_game/src/basic/game_window.rs @@ -0,0 +1,69 @@ +use moonhare_window::{window_config, winit_window::{self, WinitWindow}}; + +use crate::{basic::node::Node, Game}; + +#[derive(Debug)] +pub struct GameWindow { + pub title: &'static str, + pub width: u32, + pub height: u32, + pub visble: bool, + pub decorations: bool, + pub winit_window: Option, +} + +impl Node for GameWindow { +} + +impl Default for GameWindow { + fn default() -> Self { + Self { + title: "window", + width: default_game_window_width(), + height: default_game_window_height(), + visble: default_game_window_visibility(), + decorations: default_game_window_decorations(), + winit_window: None, + } + } +} + +impl GameWindow { + pub fn create() -> Self { + let mut window_config = window_config::WindowConfig::default(); + moonhare_log::info(format!("creating window with config {:?}", window_config)); + let mut window = Self::default(); + window_config.title = window.title.to_owned(); + window_config.width = window.width; + window_config.height = window.height; + window_config.visble = window.visble; + window_config.decorations = window.decorations; + + let winit = winit_window::WinitWindow::new(window_config); + + window.winit_window = Some(winit); + // todo: tell winit to create a window for us + moonhare_log::info(format!("created window {:?}", window)); + window + } +} + +fn default_game_window_title() -> String { + "Moonhare Engine".to_owned() +} + +fn default_game_window_width() -> u32 { + 1280 +} + +fn default_game_window_height() -> u32 { + 720 +} + +fn default_game_window_visibility() -> bool { + true +} + +fn default_game_window_decorations() -> bool { + true +} \ No newline at end of file diff --git a/crates/moonhare_game/src/basic/mod.rs b/crates/moonhare_game/src/basic/mod.rs index 3691eae..f132570 100644 --- a/crates/moonhare_game/src/basic/mod.rs +++ b/crates/moonhare_game/src/basic/mod.rs @@ -1,2 +1,2 @@ pub mod node; -pub mod window; \ No newline at end of file +pub mod game_window; \ No newline at end of file diff --git a/crates/moonhare_game/src/basic/window.rs b/crates/moonhare_game/src/basic/window.rs deleted file mode 100644 index c26c703..0000000 --- a/crates/moonhare_game/src/basic/window.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::basic::{node::Node}; - -pub struct GameWindow { - -} - - -impl Node for GameWindow { - -} \ No newline at end of file diff --git a/crates/moonhare_game/src/lib.rs b/crates/moonhare_game/src/lib.rs index f5e41f7..20383d8 100644 --- a/crates/moonhare_game/src/lib.rs +++ b/crates/moonhare_game/src/lib.rs @@ -1,15 +1,43 @@ //! Base functionality for a Moonhare Game Engine Project + +use moonhare_log::*; + +use crate::basic::game_window::GameWindow; pub mod basic; /// Only one Game may exist per project +#[derive(Debug)] pub struct Game { - pub name: String + pub name: String, + pub primary_window: Option, } impl Default for Game { fn default() -> Self { Self { - name: default_game_name() + name: default_game_name(), + primary_window: None, + } + } +} + +impl Game { + pub fn new() -> Self { + Game::default() + } + + pub fn run(&self) { + info("Running Game..."); + loop { + + } + } + + pub fn add_window(&mut self) { + moonhare_log::info(format!("Adding window to {:?}", self)); + if self.primary_window.is_none() { + moonhare_log::trace("Primary Window is none"); + self.primary_window = Some(GameWindow::create()); } } } diff --git a/crates/moonhare_window/Cargo.toml b/crates/moonhare_window/Cargo.toml index 600902d..13440bc 100644 --- a/crates/moonhare_window/Cargo.toml +++ b/crates/moonhare_window/Cargo.toml @@ -5,4 +5,5 @@ version.workspace = true authors.workspace = true [dependencies] -winit = "0.30.12" \ No newline at end of file +winit = "0.30.12" +moonhare_log = { path = "../moonhare_log" } \ No newline at end of file diff --git a/crates/moonhare_window/src/window_config.rs b/crates/moonhare_window/src/window_config.rs index a1ffaeb..a27791f 100644 --- a/crates/moonhare_window/src/window_config.rs +++ b/crates/moonhare_window/src/window_config.rs @@ -1,4 +1,5 @@ /// General Config for [`WinitWindow`](crate::winit::winit_window::WinitWindow) +#[derive(Debug)] pub struct WindowConfig { pub title: String, pub width: u32, diff --git a/crates/moonhare_window/src/winit_window.rs b/crates/moonhare_window/src/winit_window.rs index 75b830d..466cb80 100644 --- a/crates/moonhare_window/src/winit_window.rs +++ b/crates/moonhare_window/src/winit_window.rs @@ -1,14 +1,16 @@ -use winit::{application::ApplicationHandler, dpi::LogicalSize, event::WindowEvent, event_loop::ActiveEventLoop, window::{Window, WindowAttributes}}; +use winit::{application::ApplicationHandler, dpi::LogicalSize, event::WindowEvent, event_loop::{self, ActiveEventLoop, EventLoop}, window::{Window, WindowAttributes}}; use crate::window_config::WindowConfig; -#[derive(Default)] +#[derive(Debug)] pub struct WinitWindow { - pub window: Option, + pub window: Window, } impl WinitWindow { - pub fn create_window(&mut self, event_loop: &ActiveEventLoop, config: WindowConfig) -> WinitWindow { + pub fn new(config: WindowConfig) -> Self { + moonhare_log::trace("Im inside the create window function in winit"); + let event_loop = EventLoop::new().unwrap(); let mut window_attributes = WindowAttributes::default() .with_title(config.title); @@ -20,9 +22,17 @@ impl WinitWindow { window_attributes = window_attributes.with_visible(config.visble); window_attributes = window_attributes.with_decorations(config.decorations); - let window = event_loop.create_window(window_attributes).unwrap(); + let window = match event_loop.create_window(window_attributes) { + Ok(window) => window, + Err(err) => { + moonhare_log::error("Error creating window: {err}"); + return; + }, + }; - Self { window: Some(window) } + moonhare_log::info(format!("Winit WIndow: {:?}", window)); + + Self { window: window } } } diff --git a/playground/src/main.rs b/playground/src/main.rs index 10c4bf2..02c3d1e 100644 --- a/playground/src/main.rs +++ b/playground/src/main.rs @@ -1,7 +1,15 @@ -use moonhare_engine::log::{self}; +use moonhare_engine::{game::Game, log}; fn main() { let _ = log::configere_logger(); log::info("test"); + + let mut game = Game::new(); + game.add_window(); + + log::info(format!("Game: {:?}", game)); + + // Enters Loop + game.run(); } \ No newline at end of file