No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

68 líneas
1.5 KiB

  1. #![allow(dead_code)]
  2. use glc::{
  3. array_buffer::{ArrayBuffer, Target, Usage},
  4. error::Error,
  5. matrix::Matrix4f,
  6. vector::Vector2f,
  7. };
  8. pub struct Camera {
  9. buffer: ArrayBuffer,
  10. }
  11. impl Camera {
  12. pub fn new() -> Result<Self, Error> {
  13. let mut buffer = ArrayBuffer::new(Target::UniformBuffer)?;
  14. buffer.buffer_data(
  15. Usage::StaticDraw,
  16. &[Data {
  17. projection: Matrix4f::identity(),
  18. view: Matrix4f::identity(),
  19. size: Vector2f::default(),
  20. }],
  21. )?;
  22. Ok(Self { buffer })
  23. }
  24. pub fn resize(&mut self, w: f32, h: f32) -> Result<(), Error> {
  25. let mut data = self.buffer.map_mut::<Data>(true)?;
  26. data[0].projection = Matrix4f::ortho(-w / 2.0, w / 2.0, -h / 2.0, h / 2.0, -100.0, 100.0);
  27. data[0].size = (w, h).into();
  28. Ok(())
  29. }
  30. pub fn update(&mut self, view: Matrix4f) -> Result<(), Error> {
  31. let mut data = self.buffer.map_mut::<Data>(true)?;
  32. data[0].view = data[0].view * view;
  33. Ok(())
  34. }
  35. pub fn update_with<F>(&mut self, f: F) -> Result<(), Error>
  36. where
  37. F: FnOnce(&Matrix4f) -> Matrix4f,
  38. {
  39. let mut data = self.buffer.map_mut::<Data>(true)?;
  40. data[0].view = f(&data[0].view);
  41. Ok(())
  42. }
  43. pub fn bind(&self, index: gl::GLuint) -> Result<(), Error> {
  44. Error::checked(|| self.buffer.bind_buffer_base(index))
  45. }
  46. }
  47. #[repr(C, packed)]
  48. struct Data {
  49. projection: Matrix4f,
  50. view: Matrix4f,
  51. size: Vector2f,
  52. }