Guest User

Untitled

a guest
Nov 20th, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.31 KB | None | 0 0
  1. #[macro_use]
  2. extern crate gfx;
  3. extern crate gfx_window_sdl;
  4. extern crate sdl2;
  5.  
  6. use gfx::Device;
  7.  
  8. pub type ColorFormat = gfx::format::Srgba8;
  9. pub type DepthFormat = gfx::format::DepthStencil;
  10.  
  11. const BLACK: [f32; 4] = [0.0, 0.0, 0.0, 1.0];
  12.  
  13.  
  14.  
  15. //#[macro_use]
  16. // use gfx;
  17. // use gfx_window_sdl;
  18. // use sdl2;
  19.  
  20. // use gfx::Device;
  21.  
  22. gfx_defines!{
  23. vertex Vertex {
  24. pos: [f32; 4] = "a_Pos",
  25. color: [f32; 3] = "a_Color",
  26. }
  27.  
  28. constant Transform {
  29. transform: [[f32; 4];4] = "u_Transform",
  30. }
  31.  
  32. pipeline pipe {
  33. vbuf: gfx::VertexBuffer<Vertex> = (),
  34. transform: gfx::ConstantBuffer<Transform> = "Transform",
  35. out: gfx::RenderTarget<ColorFormat> = "Target0",
  36. }
  37. }
  38.  
  39. #[derive(Debug, Clone, Copy)]
  40. struct Square {
  41. pub pos: (f32, f32),
  42. pub size: f32,
  43. pub color: [f32; 3]
  44. }
  45.  
  46.  
  47.  
  48. pub fn main() {
  49. use gfx::traits::FactoryExt;
  50. let sdl_context = sdl2::init().unwrap();
  51. let video = sdl_context.video().unwrap();
  52. let mut builder = video.window("Example", 800, 600);
  53.  
  54. let (mut window, mut gl_context, mut device, mut factory, color_view, depth_view) =
  55. gfx_window_sdl::init::<ColorFormat, DepthFormat>(&video, builder).unwrap();
  56.  
  57. println!("{:?}", device.get_info().shading_language);
  58. println!("{:?}", device.get_info().version);
  59.  
  60. let vertex_shader = r#"
  61. #version 120
  62.  
  63. attribute vec4 a_Pos;
  64. attribute vec3 a_Color;
  65.  
  66. uniform Transform {
  67. mat4 u_Transform;
  68. };
  69.  
  70. varying vec4 v_Color;
  71.  
  72. void main() {
  73. v_Color = vec4(a_Color, 1.0);
  74. gl_Position = a_Pos; //* u_Transform;
  75. }
  76. "#;
  77.  
  78.  
  79. let fragment_shader = r#"
  80. #version 120
  81.  
  82. varying vec4 v_Color;
  83. vec4 Target0;
  84.  
  85. void main() {
  86. Target0 = v_Color;
  87. gl_FragColor = v_Color;
  88. }
  89. "#;
  90.  
  91. let pso = factory.create_pipeline_simple(
  92. vertex_shader.as_bytes(),
  93. fragment_shader.as_bytes(),
  94. pipe::new()
  95. ).unwrap();
  96.  
  97. let mut encoder: gfx::Encoder<_, _> = factory.create_command_buffer().into();
  98. const TRIANGLE: [Vertex; 3] = [
  99. Vertex { pos: [ -0.5, -0.5, 0.0, 1.0 ], color: [1.0, 0.0, 0.0] },
  100. Vertex { pos: [ 0.5, -0.5, 0.0, 1.0 ], color: [0.0, 1.0, 0.0] },
  101. Vertex { pos: [ 0.0, 0.5, 0.0, 1.0 ], color: [0.0, 0.0, 1.0] },
  102. ];
  103. //Identity Matrix
  104. const TRANSFORM: Transform = Transform {
  105. transform: [[1.0, 0.0, 0.0, 0.0],
  106. [0.0, 1.0, 0.0, 0.0],
  107. [0.0, 0.0, 1.0, 0.0],
  108. [0.0, 0.0, 0.0, 1.0]]
  109. };
  110.  
  111. let (vertex_buffer, slice) = factory.create_vertex_buffer_with_slice(&TRIANGLE, ());
  112. let transform_buffer = factory.create_constant_buffer(1);
  113. let data = pipe::Data {
  114. vbuf: vertex_buffer,
  115. transform: transform_buffer,
  116. out: color_view.clone(),
  117. };
  118.  
  119. 'main: loop {
  120. let mut event_pump = sdl_context.event_pump().unwrap();
  121.  
  122. for event in event_pump.poll_iter() {
  123. match event {
  124. sdl2::event::Event::Quit { .. } => {
  125. break 'main;
  126. }
  127. _ => {}
  128. }
  129. }
  130. encoder.clear(&color_view, BLACK); //clear the framebuffer with a color(color needs to be an array of 4 f32s, RGBa)
  131. encoder.update_buffer(&data.transform, &[TRANSFORM], 0); //update buffers
  132. encoder.draw(&slice, &pso, &data); // draw commands with buffer data and attached pso
  133. encoder.flush(&mut device); // execute draw commands
  134.  
  135. window.gl_swap_window();
  136. device.cleanup();
  137. }
  138. }
Add Comment
Please, Sign In to add comment