JS>> tea>> 返回
项目作者: cafe-engine

项目描述 :
a tiny c lib for handle input, render and window
高级语言: C
项目地址: git://github.com/cafe-engine/tea.git
创建时间: 2021-01-09T23:08:09Z
项目社区:https://github.com/cafe-engine/tea

开源协议:MIT License

下载


Tea

Tea is a lib wrapper for some OpenGL functions with some abstractions.

using with SDL2

  1. extern crate sdl2;
  2. extern crate tea;
  3. use sdl2::event::Event;
  4. use sdl2::keyboard::Scancode;
  5. use tea::buffer::{ArrayBuffer, GlBuffer};
  6. use tea::glsl::{Program, Shader};
  7. use tea::vec::{Vec2, Vec4};
  8. use tea::vertex::VertexArray;
  9. use tea::{ClearFlags, GlBind, GlUse, glsl::ShaderType};
  10. fn main() {
  11. let sdl = sdl2::init().unwrap();
  12. let video = sdl.video().unwrap();
  13. let window = video.window("Hello Window", 640, 480)
  14. .position_centered()
  15. .opengl()
  16. .build()
  17. .unwrap();
  18. let _ctx = window.gl_create_context().unwrap();
  19. tea::load_with(|name| video.gl_get_proc_address(name) as *const _);
  20. let mut event = sdl.event_pump().unwrap();
  21. let vert = Shader::new(ShaderType::VertexShader).unwrap();
  22. vert.source(vec!["
  23. #version 140
  24. in vec2 a_Position;
  25. in vec4 a_Color;
  26. out vec4 v_Color;
  27. void main() {
  28. gl_Position = vec4(a_Position, 0.0, 1.0);
  29. v_Color = a_Color;
  30. }
  31. ".to_string()]);
  32. vert.compile().expect("Failed to compile vertex shader");
  33. let frag = Shader::new(ShaderType::FragmentShader).unwrap();
  34. frag.source(vec!["
  35. #version 140
  36. in vec4 v_Color;
  37. void main() {
  38. gl_FragColor = v_Color;
  39. }
  40. ".to_string()]);
  41. frag.compile().expect("Failed to compile fragment shader");
  42. let program = Program::new().unwrap();
  43. program.attach_shader(&vert);
  44. program.attach_shader(&frag);
  45. program.link().expect("Failed to link program");
  46. let vao = VertexArray::new().unwrap();
  47. let vbo = ArrayBuffer::new();
  48. let data: Vec<f32> = vec![
  49. 0.0, 0.5, 1.0, 0.0, 1.0, 1.0,
  50. 0.5, -0.5, 1.0, 1.0, 0.0, 1.0,
  51. -0.5, -0.5, 0.0, 1.0, 1.0, 1.0,
  52. ];
  53. vao.bind();
  54. vbo.bind();
  55. vbo.data(&data, tea::buffer::BufferUsage::StaticDraw);
  56. vao.enable_attrib(0);
  57. vao.enable_attrib(1);
  58. let stride = (6 * std::mem::size_of::<f32>()) as i32;
  59. vao.attrib_pointer::<Vec2>(0, stride, 0);
  60. vao.attrib_pointer::<Vec4>(1, stride, (std::mem::size_of::<f32>() * 2) as i32);
  61. vao.unbind();
  62. vbo.unbind();
  63. 'running: loop {
  64. tea::clear_color(0.3, 0.4, 0.4, 1.0);
  65. tea::clear(&[ClearFlags::ColorBufferBit]);
  66. program.set_used();
  67. vao.bind();
  68. tea::draw_arrays(tea::DrawMode::Triangles, 0, 3);
  69. vao.unbind();
  70. program.set_unused();
  71. window.gl_swap_window();
  72. for ev in event.poll_iter() {
  73. match ev {
  74. Event::Quit {..} | Event::KeyDown {scancode: Some(Scancode::Escape), ..} => {
  75. break 'running
  76. },
  77. _ => {}
  78. }
  79. }
  80. }
  81. }