summaryrefslogtreecommitdiff
path: root/engine/src/renderer
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2023-10-06 23:09:57 +0200
committerHampusM <hampus@hampusmat.com>2023-10-06 23:09:57 +0200
commitd1be0566969974bd70f2d77915b6936095c894c6 (patch)
tree255745999c57c6a12042cd535fa272bc2994ee86 /engine/src/renderer
parent5c0374e61be0ba39c89af8d3e801437255253ffb (diff)
feat: add engine library base
Diffstat (limited to 'engine/src/renderer')
-rw-r--r--engine/src/renderer/mod.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/engine/src/renderer/mod.rs b/engine/src/renderer/mod.rs
new file mode 100644
index 0000000..c34441c
--- /dev/null
+++ b/engine/src/renderer/mod.rs
@@ -0,0 +1,57 @@
+use std::ffi::{c_void, CString};
+use std::process::abort;
+
+use crate::vector::Vec2;
+
+pub fn initialize(window: &glfw::Window) -> Result<(), Error>
+{
+ gl::load_with(|symbol| {
+ let proc_name = unsafe { CString::from_vec_unchecked(symbol.into()) };
+
+ match window.get_proc_address(proc_name.as_c_str()) {
+ Ok(addr) => addr as *const c_void,
+ Err(err) => {
+ println!(
+ "FATAL ERROR: Failed to get adress of OpenGL function {}. {}",
+ symbol, err
+ );
+
+ abort();
+ }
+ }
+ });
+
+ let window_size = window.size().map_err(Error::GetWindowSizeFailed)?;
+
+ set_viewport(&Vec2 { x: 0, y: 0 }, &window_size);
+
+ Ok(())
+}
+
+pub fn render()
+{
+ unsafe {
+ gl::Clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT);
+ }
+}
+
+/// Renderer error.
+#[derive(Debug, thiserror::Error)]
+pub enum Error
+{
+ #[error("Failed to get window size")]
+ GetWindowSizeFailed(#[source] glfw::Error),
+}
+
+fn set_viewport(position: &Vec2<u32>, size: &crate::WindowSize)
+{
+ unsafe {
+ #[allow(clippy::cast_possible_wrap)]
+ gl::Viewport(
+ position.x as i32,
+ position.y as i32,
+ size.width as i32,
+ size.height as i32,
+ );
+ }
+}