From 2d7df265d017fdbf79fdbd400992a72d0f2e77bd Mon Sep 17 00:00:00 2001 From: Aaron Gorodetzky Date: Wed, 25 Oct 2023 20:08:46 -0400 Subject: [PATCH] Initial Setup --- .gitignore | 5 +++ Cargo.toml | 20 +++++++++ src/backends/mod.rs | 2 + src/backends/opengl/mod.rs | 2 + src/backends/opengl/opengl_renderer.rs | 39 +++++++++++++++++ src/lib.rs | 2 + src/main.rs | 50 ++++++++++++++++++++++ src/window.rs | 59 ++++++++++++++++++++++++++ 8 files changed, 179 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 src/backends/mod.rs create mode 100644 src/backends/opengl/mod.rs create mode 100644 src/backends/opengl/opengl_renderer.rs create mode 100644 src/lib.rs create mode 100644 src/main.rs create mode 100644 src/window.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9714c17 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/target +/Cargo.lock + +# Ignore IntelliJ +.idea/ diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..b448908 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "nytegearui" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +name = "nytegearui" +path = "src/lib.rs" + +[[bin]] +name = "demo" +path = "src/main.rs" + +[dependencies] +winit = "0.29" +glutin = "0.31.0" +gl = "0.14" +raw-gl-context = { git = "https://github.com/Aargonian/raw-gl-context.git", branch = "master" } diff --git a/src/backends/mod.rs b/src/backends/mod.rs new file mode 100644 index 0000000..401abd2 --- /dev/null +++ b/src/backends/mod.rs @@ -0,0 +1,2 @@ +mod opengl; +pub use opengl::*; \ No newline at end of file diff --git a/src/backends/opengl/mod.rs b/src/backends/opengl/mod.rs new file mode 100644 index 0000000..3e87755 --- /dev/null +++ b/src/backends/opengl/mod.rs @@ -0,0 +1,2 @@ +mod opengl_renderer; +pub use opengl_renderer::*; \ No newline at end of file diff --git a/src/backends/opengl/opengl_renderer.rs b/src/backends/opengl/opengl_renderer.rs new file mode 100644 index 0000000..da991b9 --- /dev/null +++ b/src/backends/opengl/opengl_renderer.rs @@ -0,0 +1,39 @@ +use crate::window::Renderer; +use raw_gl_context::{GlConfig, GlContext}; +use winit::window::Window as WinitWindow; +use winit::raw_window_handle::HasRawWindowHandle; + +pub struct OpenGLRenderer { + context: GlContext, +} + +impl OpenGLRenderer +{ + pub fn try_create(window: &WinitWindow) -> Option + { + let context = unsafe { GlContext::create(window, GlConfig::default()).unwrap() }; + + unsafe { + context.make_current(); + } + + Some(OpenGLRenderer { + context, + }) + } +} + +impl Renderer for OpenGLRenderer +{ + fn draw_pixel(&mut self, x: u32, y: u32, value: u32) { + todo!() + } + + fn draw_rect(&mut self, x: u32, y: u32, width: u32, height: u32, value: u32) { + todo!() + } + + fn fill_rect(&mut self, x: u32, y: u32, width: u32, height: u32, value: u32) { + todo!() + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..d650819 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,2 @@ +pub mod window; +pub mod backends; diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..f67f4f3 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,50 @@ +use raw_gl_context::{GlConfig, GlContext}; + +use winit::event_loop::EventLoop; +use winit::window::WindowBuilder; +use winit::event::{Event, WindowEvent}; + +fn main() { + let event_loop = EventLoop::new().unwrap(); + let window = WindowBuilder::new().build(&event_loop).unwrap(); + + let context = unsafe { GlContext::create(&window, GlConfig::default()).unwrap() }; + + unsafe { + context.make_current(); + } + + gl::load_with(|symbol| context.get_proc_address(symbol) as *const _); + + event_loop.run(move |event, window_target| { + + match event { + Event::WindowEvent { + event: winit::event::WindowEvent::CloseRequested, + .. + } => { + window_target.exit(); + } + Event::WindowEvent { + event: WindowEvent::RedrawRequested, + .. + } => { + unsafe { + context.make_current(); + } + + unsafe { + gl::ClearColor(0.2, 0.1, 0.5, 1.0); + gl::Clear(gl::COLOR_BUFFER_BIT); + } + + context.swap_buffers(); + + unsafe { + context.make_not_current(); + } + } + _ => {} + } + }).expect("TODO: panic message"); +} \ No newline at end of file diff --git a/src/window.rs b/src/window.rs new file mode 100644 index 0000000..000800f --- /dev/null +++ b/src/window.rs @@ -0,0 +1,59 @@ +use winit::{ + event::{Event, WindowEvent}, + event_loop::{ControlFlow, EventLoop}, + window::{Window as WinitWindow, WindowBuilder}, +}; + +use crate::backends::OpenGLRenderer; + +pub trait Renderer +{ + fn draw_pixel(&mut self, x: u32, y: u32, value: u32); + fn draw_rect(&mut self, x: u32, y: u32, width: u32, height: u32, value: u32); + fn fill_rect(&mut self, x: u32, y: u32, width: u32, height: u32, value: u32); +} + +pub trait Widget +{ + fn draw(&self, renderer: &mut dyn Renderer); +} + +pub struct Window +{ + window: WinitWindow, + event_loop: EventLoop<()>, + renderer: Box, + children: Vec>, +} + +impl Window +{ + pub fn new() -> Self { + // Construct the EventLoop for Winit + let event_loop = EventLoop::new().unwrap(); + event_loop.set_control_flow(ControlFlow::Wait); + + let window = WindowBuilder::new().build(&event_loop).unwrap(); + + + // Determine the available rendering backend + if let Some(renderer) = Self::resolve_rendering_backend(&window) { + Window { + window, + event_loop, + renderer, + children: vec![], + } + } else { + panic!("FUCK") + } + } + + fn resolve_rendering_backend(window: &WinitWindow) -> Option> + { + //TODO: Expand this to allow for Metal and DirectX Renderers + + // First check if OpenGL is available + OpenGLRenderer::try_create(window).map(|renderer| Box::new(renderer) as Box) + } +} \ No newline at end of file