summaryrefslogtreecommitdiff
path: root/engine/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/lib.rs')
-rw-r--r--engine/src/lib.rs74
1 files changed, 74 insertions, 0 deletions
diff --git a/engine/src/lib.rs b/engine/src/lib.rs
new file mode 100644
index 0000000..618bc75
--- /dev/null
+++ b/engine/src/lib.rs
@@ -0,0 +1,74 @@
+#![deny(clippy::all, clippy::pedantic)]
+
+use glfw::Window;
+pub use glfw::WindowSize;
+
+mod renderer;
+
+pub mod vector;
+
+pub struct Engine
+{
+ window: Window,
+}
+
+impl Engine
+{
+ /// Creates and initializes a new engine.
+ ///
+ /// # Errors
+ /// Will return `Err` if window creation or window configuration fails.
+ pub fn new(window_size: &WindowSize, window_title: &str) -> Result<Self, Error>
+ {
+ let window = Window::create(window_size, window_title)
+ .map_err(Error::CreateWindowFailed)?;
+
+ window
+ .make_context_current()
+ .map_err(Error::ConfigureWindowFailed)?;
+
+ crate::renderer::initialize(&window).map_err(Error::InitializeRendererFailed)?;
+
+ Ok(Self { window })
+ }
+
+ /// Starts the engine.
+ ///
+ /// # Errors
+ /// Will return `Err` if updating the window fails.
+ pub fn start(&self, mut func: impl FnMut()) -> Result<(), Error>
+ {
+ while !self.window.should_close() {
+ func();
+
+ crate::renderer::render();
+
+ self.window
+ .swap_buffers()
+ .map_err(Error::UpdateWindowFailed)?;
+
+ self.window
+ .poll_events()
+ .map_err(Error::UpdateWindowFailed)?;
+ }
+
+ Ok(())
+ }
+}
+
+/// Engine Error
+#[derive(Debug, thiserror::Error)]
+pub enum Error
+{
+ #[error("Failed to create window")]
+ CreateWindowFailed(#[source] glfw::Error),
+
+ #[error("Failed to configure window")]
+ ConfigureWindowFailed(#[source] glfw::Error),
+
+ #[error("Failed to initialize renderer")]
+ InitializeRendererFailed(#[source] renderer::Error),
+
+ #[error("Failed to update window")]
+ UpdateWindowFailed(#[source] glfw::Error),
+}