diff --git a/Cargo.lock b/Cargo.lock index 523a619..d7f1b07 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18,6 +18,21 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2187590a23ab1e3df8681afdf0987c48504d80291f002fcdb651f0ef5e25169" +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + [[package]] name = "ahash" version = "0.8.12" @@ -76,12 +91,42 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + [[package]] name = "atomic-waker" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -100,7 +145,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ - "objc2", + "objc2 0.5.2", ] [[package]] @@ -176,6 +221,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + [[package]] name = "colored" version = "2.2.0" @@ -263,6 +317,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.9.1", + "objc2 0.6.1", +] + [[package]] name = "dlib" version = "0.5.2" @@ -310,6 +374,12 @@ dependencies = [ "log", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "foreign-types" version = "0.5.0" @@ -359,6 +429,106 @@ dependencies = [ "wasi", ] +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glium" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf52ce4f5ce1501bb056627f35484a819e812d1d93f0f3da413676421b1bbe0" +dependencies = [ + "backtrace", + "fnv", + "gl_generator", + "glutin", + "glutin-winit", + "memoffset", + "raw-window-handle", + "smallvec", + "winit", +] + +[[package]] +name = "glutin" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" +dependencies = [ + "bitflags 2.9.1", + "cfg_aliases", + "cgl", + "dispatch2", + "glutin_egl_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "libloading", + "objc2 0.6.1", + "objc2-app-kit 0.3.1", + "objc2-core-foundation", + "objc2-foundation 0.3.1", + "once_cell", + "raw-window-handle", + "wayland-sys", + "windows-sys 0.52.0", + "x11-dl", +] + +[[package]] +name = "glutin-winit" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" +dependencies = [ + "cfg_aliases", + "glutin", + "raw-window-handle", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2" +dependencies = [ + "gl_generator", + "windows-sys 0.52.0", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + [[package]] name = "hashbrown" version = "0.15.4" @@ -429,6 +599,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + [[package]] name = "lazy_static" version = "1.5.0" @@ -495,6 +671,24 @@ dependencies = [ "libc", ] +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + [[package]] name = "moonhare_engine" version = "0.1.0" @@ -542,8 +736,9 @@ dependencies = [ name = "moonhare_window" version = "0.1.0" dependencies = [ + "ash", + "glium", "moonhare_log", - "winit", ] [[package]] @@ -614,6 +809,15 @@ dependencies = [ "objc2-encode", ] +[[package]] +name = "objc2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" +dependencies = [ + "objc2-encode", +] + [[package]] name = "objc2-app-kit" version = "0.2.2" @@ -623,13 +827,25 @@ dependencies = [ "bitflags 2.9.1", "block2", "libc", - "objc2", + "objc2 0.5.2", "objc2-core-data", "objc2-core-image", - "objc2-foundation", + "objc2-foundation 0.2.2", "objc2-quartz-core", ] +[[package]] +name = "objc2-app-kit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" +dependencies = [ + "bitflags 2.9.1", + "objc2 0.6.1", + "objc2-core-foundation", + "objc2-foundation 0.3.1", +] + [[package]] name = "objc2-cloud-kit" version = "0.2.2" @@ -638,9 +854,9 @@ checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ "bitflags 2.9.1", "block2", - "objc2", + "objc2 0.5.2", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", ] [[package]] @@ -650,8 +866,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" dependencies = [ "block2", - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -662,8 +878,19 @@ checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ "bitflags 2.9.1", "block2", - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +dependencies = [ + "bitflags 2.9.1", + "dispatch2", + "objc2 0.6.1", ] [[package]] @@ -673,8 +900,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" dependencies = [ "block2", - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", "objc2-metal", ] @@ -685,9 +912,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" dependencies = [ "block2", - "objc2", + "objc2 0.5.2", "objc2-contacts", - "objc2-foundation", + "objc2-foundation 0.2.2", ] [[package]] @@ -706,7 +933,18 @@ dependencies = [ "block2", "dispatch", "libc", - "objc2", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" +dependencies = [ + "bitflags 2.9.1", + "objc2 0.6.1", + "objc2-core-foundation", ] [[package]] @@ -716,9 +954,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" dependencies = [ "block2", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -729,8 +967,8 @@ checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ "bitflags 2.9.1", "block2", - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -741,8 +979,8 @@ checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ "bitflags 2.9.1", "block2", - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", "objc2-metal", ] @@ -752,8 +990,8 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" dependencies = [ - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -764,12 +1002,12 @@ checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ "bitflags 2.9.1", "block2", - "objc2", + "objc2 0.5.2", "objc2-cloud-kit", "objc2-core-data", "objc2-core-image", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", "objc2-link-presentation", "objc2-quartz-core", "objc2-symbols", @@ -784,8 +1022,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" dependencies = [ "block2", - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -796,9 +1034,18 @@ checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ "bitflags 2.9.1", "block2", - "objc2", + "objc2 0.5.2", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", ] [[package]] @@ -950,6 +1197,12 @@ dependencies = [ "bitflags 2.9.1", ] +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + [[package]] name = "rustix" version = "0.38.44" @@ -1730,9 +1983,9 @@ dependencies = [ "libc", "memmap2", "ndk", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", "objc2-ui-kit", "orbclient", "percent-encoding", @@ -1834,6 +2087,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" +[[package]] +name = "xml-rs" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" + [[package]] name = "zerocopy" version = "0.8.26" diff --git a/crates/moonhare_game/src/basic/game_window.rs b/crates/moonhare_game/src/basic/game_window.rs index 51715ed..1a44d70 100644 --- a/crates/moonhare_game/src/basic/game_window.rs +++ b/crates/moonhare_game/src/basic/game_window.rs @@ -1,4 +1,4 @@ -use moonhare_window::{window_config, winit_window::{self, WinitWindow}}; +use moonhare_window::{window_config, MoonhareWindow}; use crate::{basic::node::Node, Game}; @@ -9,7 +9,7 @@ pub struct GameWindow { pub height: u32, pub visble: bool, pub decorations: bool, - pub winit_window: Option, + pub winit_window: Option, } impl Node for GameWindow { @@ -39,9 +39,10 @@ impl GameWindow { window_config.visble = window.visble; window_config.decorations = window.decorations; - let winit = winit_window::WinitWindow::new(window_config); + let _w = moonhare_window::MoonhareWindow::define_context(moonhare_window::WindowRenderContext::OPENGL); + _w.create_window_from_context(); - window.winit_window = Some(winit); + window.winit_window = Some(_w); // todo: tell winit to create a window for us moonhare_log::info(format!("created window {:?}", window)); window diff --git a/crates/moonhare_window/Cargo.toml b/crates/moonhare_window/Cargo.toml index 13440bc..925a5e0 100644 --- a/crates/moonhare_window/Cargo.toml +++ b/crates/moonhare_window/Cargo.toml @@ -5,5 +5,6 @@ version.workspace = true authors.workspace = true [dependencies] -winit = "0.30.12" +ash = "0.38" +glium = "0.36" moonhare_log = { path = "../moonhare_log" } \ No newline at end of file diff --git a/crates/moonhare_window/src/lib.rs b/crates/moonhare_window/src/lib.rs index 9844da4..4c3103c 100644 --- a/crates/moonhare_window/src/lib.rs +++ b/crates/moonhare_window/src/lib.rs @@ -1,3 +1,35 @@ -//! Provides an abstraction above Winit functionality +//! Provides functionality to create either a vulkan or opengl window + +use crate::opengl_window::create_open_gl_window; pub mod window_config; -pub mod winit_window; \ No newline at end of file +pub mod opengl_window; + +#[derive(Debug, Clone, Copy)] +pub enum WindowRenderContext { + VULKAN, // TODO + OPENGL, +} + +#[derive(Debug, Clone, Copy)] +pub struct MoonhareWindow { + render_context: WindowRenderContext +} + +impl MoonhareWindow { + pub fn define_context(context: WindowRenderContext) -> Self { + Self { + render_context: context + } + } + + pub fn create_window_from_context(self) { + match self.render_context { + WindowRenderContext::VULKAN => { + todo!("Vulkan not implemented yet") + }, + WindowRenderContext::OPENGL => { + create_open_gl_window(); + } + } + } +} \ No newline at end of file diff --git a/crates/moonhare_window/src/opengl_window.rs b/crates/moonhare_window/src/opengl_window.rs new file mode 100644 index 0000000..509a19a --- /dev/null +++ b/crates/moonhare_window/src/opengl_window.rs @@ -0,0 +1,32 @@ +use glium::{winit::dpi::{LogicalPosition, LogicalSize}, Surface}; + +use crate::window_config::WindowConfig; + +pub fn create_open_gl_window() { + let event_loop = glium::winit::event_loop::EventLoopBuilder::new().build().expect("event loop building"); + let (mut _window, display) = glium::backend::glutin::SimpleWindowBuilder::new().build(&event_loop); + + let config = WindowConfig::default(); + _window.set_title(format!("{} OpenGL", &config.title).as_str()); + _window.set_decorations(config.decorations); + _window.set_visible(config.visble); + //_window.set_min_inner_size(Some(LogicalSize::new(config.width, config.height))); + + + let mut frame = display.draw(); + frame.clear_color(0.0, 0.0, 1.0, 1.0); + frame.finish().unwrap(); + + let _ = event_loop.run(move | event, window_target| { + match event { + glium::winit::event::Event::WindowEvent { event, .. } => match event { + glium::winit::event::WindowEvent::CloseRequested => { + window_target.exit() + }, + _ => (), + } + _ => (), + } + }); +} + diff --git a/crates/moonhare_window/src/vulkan_window.rs b/crates/moonhare_window/src/vulkan_window.rs new file mode 100644 index 0000000..e69de29 diff --git a/crates/moonhare_window/src/winit_window.rs b/crates/moonhare_window/src/winit_window.rs deleted file mode 100644 index 466cb80..0000000 --- a/crates/moonhare_window/src/winit_window.rs +++ /dev/null @@ -1,62 +0,0 @@ -use winit::{application::ApplicationHandler, dpi::LogicalSize, event::WindowEvent, event_loop::{self, ActiveEventLoop, EventLoop}, window::{Window, WindowAttributes}}; - -use crate::window_config::WindowConfig; - -#[derive(Debug)] -pub struct WinitWindow { - pub window: Window, -} - -impl 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); - - let logical_size = LogicalSize::new(config.width, config.height); - window_attributes = window_attributes.with_inner_size(logical_size); - window_attributes = window_attributes.with_max_inner_size(logical_size); - - // Set Visible - window_attributes = window_attributes.with_visible(config.visble); - window_attributes = window_attributes.with_decorations(config.decorations); - - let window = match event_loop.create_window(window_attributes) { - Ok(window) => window, - Err(err) => { - moonhare_log::error("Error creating window: {err}"); - return; - }, - }; - - moonhare_log::info(format!("Winit WIndow: {:?}", window)); - - Self { window: window } - } -} - -impl ApplicationHandler for WinitWindow { - fn resumed(&mut self, event_loop: &ActiveEventLoop) { - } - - fn window_event( - &mut self, - event_loop: &ActiveEventLoop, - window_id: winit::window::WindowId, - event: winit::event::WindowEvent, - ) { - match event { - WindowEvent::CloseRequested => { - event_loop.exit(); - }, - WindowEvent::RedrawRequested => { - - }, - _ => (), - } - } -} - - - diff --git a/playground/src/main.rs b/playground/src/main.rs index 02c3d1e..d195a49 100644 --- a/playground/src/main.rs +++ b/playground/src/main.rs @@ -1,3 +1,5 @@ +use std::fs::File; + use moonhare_engine::{game::Game, log};