A simple map viewer

buffer.rs 2.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. use ::context;
  2. use context::Context;
  3. use program::Program;
  4. use std::mem;
  5. //TODO rename Buffer -> ArrayBuffer?
  6. #[derive(Clone, Debug)]
  7. pub struct Buffer {
  8. buffer_id: BufferId,
  9. num_elements: usize,
  10. }
  11. #[derive(Copy, Clone, Debug, Eq, PartialEq)]
  12. pub struct BufferId {
  13. id: u32,
  14. }
  15. impl BufferId {
  16. /// Returns an invalid `BufferId`.
  17. pub fn invalid() -> Self {
  18. BufferId{ id: 0 }
  19. }
  20. pub fn index(&self) -> u32 {
  21. self.id
  22. }
  23. }
  24. #[derive(Copy, Clone, Debug, Eq, PartialEq)]
  25. pub enum DrawMode {
  26. Triangles,
  27. TriangleStrip,
  28. TriangleFan,
  29. }
  30. impl DrawMode {
  31. pub fn to_gl_enum(self) -> u32 {
  32. match self {
  33. DrawMode::Triangles => context::gl::TRIANGLES,
  34. DrawMode::TriangleStrip => context::gl::TRIANGLE_STRIP,
  35. DrawMode::TriangleFan => context::gl::TRIANGLE_FAN,
  36. }
  37. }
  38. }
  39. impl Buffer {
  40. pub fn new(cx: &mut Context, vertex_data: &[f32], num_elements: usize) -> Buffer {
  41. let mut buffer_id = BufferId { id: 0 };
  42. unsafe {
  43. cx.gl.GenBuffers(1, &mut buffer_id.id);
  44. cx.bind_buffer(buffer_id);
  45. cx.gl.BufferData(context::gl::ARRAY_BUFFER,
  46. (vertex_data.len() * mem::size_of::<f32>()) as context::gl::types::GLsizeiptr,
  47. vertex_data.as_ptr() as *const _,
  48. context::gl::STATIC_DRAW);
  49. }
  50. Buffer {
  51. buffer_id,
  52. num_elements,
  53. }
  54. }
  55. pub fn set_data(&mut self, cx: &mut Context, vertex_data: &[f32], num_elements: usize) {
  56. cx.bind_buffer(self.buffer_id);
  57. unsafe {
  58. cx.gl.BufferData(context::gl::ARRAY_BUFFER,
  59. (vertex_data.len() * mem::size_of::<f32>()) as context::gl::types::GLsizeiptr,
  60. vertex_data.as_ptr() as *const _,
  61. context::gl::DYNAMIC_DRAW);
  62. }
  63. self.num_elements = num_elements;
  64. }
  65. pub fn draw(&self, cx: &mut Context, program: &Program, mode: DrawMode) {
  66. cx.bind_buffer(self.buffer_id);
  67. cx.use_program(program.id());
  68. program.enable_vertex_attribs(cx);
  69. unsafe {
  70. cx.gl.DrawArrays(
  71. mode.to_gl_enum(),
  72. 0,
  73. self.num_elements as context::gl::types::GLsizei);
  74. }
  75. }
  76. pub fn id(&self) -> BufferId {
  77. self.buffer_id
  78. }
  79. }