#![allow(dead_code)] use glc::{ array_buffer::{ArrayBuffer, Target, Usage}, error::Error, matrix::Matrix4f, vector::Vector2f, }; pub struct Camera { buffer: ArrayBuffer, } impl Camera { pub fn new() -> Result { let mut buffer = ArrayBuffer::new(Target::UniformBuffer)?; buffer.buffer_data( Usage::StaticDraw, &[Data { projection: Matrix4f::identity(), view: Matrix4f::identity(), size: Vector2f::default(), }], )?; Ok(Self { buffer }) } pub fn resize(&mut self, w: f32, h: f32) -> Result<(), Error> { let mut data = self.buffer.map_mut::(true)?; data[0].projection = Matrix4f::ortho(-w / 2.0, w / 2.0, -h / 2.0, h / 2.0, -100.0, 100.0); data[0].size = (w, h).into(); Ok(()) } pub fn update(&mut self, view: Matrix4f) -> Result<(), Error> { let mut data = self.buffer.map_mut::(true)?; data[0].view = data[0].view * view; Ok(()) } pub fn update_with(&mut self, f: F) -> Result<(), Error> where F: FnOnce(&Matrix4f) -> Matrix4f, { let mut data = self.buffer.map_mut::(true)?; data[0].view = f(&data[0].view); Ok(()) } pub fn bind(&self, index: gl::GLuint) -> Result<(), Error> { Error::checked(|| self.buffer.bind_buffer_base(index)) } } #[repr(C, packed)] struct Data { projection: Matrix4f, view: Matrix4f, size: Vector2f, }