diff options
Diffstat (limited to 'engine/src/renderer/mod.rs')
-rw-r--r-- | engine/src/renderer/mod.rs | 57 |
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, + ); + } +} |