use std::time::Instant; use glc::{ buffer::{Buffer, Target, Usage}, error::Error, }; pub struct Uniform { buffer: Buffer, start_time: Instant, last_time: Instant, } #[repr(C, packed)] struct Data { time: f32, delta: f32, } impl Uniform { pub fn new() -> Result { let mut buffer = Buffer::new()?; buffer.buffer_data( Usage::StaticDraw, &[Data { time: 0.0, delta: 0.0, }], )?; let now = Instant::now(); Ok(Self { buffer, start_time: now, last_time: now, }) } pub fn update(&mut self) -> Result<(), Error> { let now = Instant::now(); let time = now.duration_since(self.start_time).as_secs_f32(); let delta = now.duration_since(self.last_time).as_secs_f32(); self.last_time = now; let mut data = self.buffer.map_mut::(true)?; data[0].time = time; data[0].delta = delta; Ok(()) } pub fn bind(&self, index: gl::GLuint) -> Result<(), Error> { Error::checked(|| self.buffer.bind_buffer_base(Target::UniformBuffer, index)) } }