Advertisement
cheako

Try and parse shader file

Sep 14th, 2019
390
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 3.24 KB | None | 0 0
  1. fn find_subsequence(haystack: &[u8], needle: &str) -> Option<usize> {
  2.     haystack
  3.         .windows(needle.len())
  4.         .position(|window| window == needle.as_bytes())
  5. }
  6.  
  7. // Rust implementation of CPP:
  8. // https://github.com/TheCherno/Hazel/blob/7d120fb4250ecdebdcdc93137bbec7413a9bb7e2/Hazel/src/Platform/OpenGL/OpenGLShader.cpp#L66
  9.  
  10.             use std::io::Read;
  11.             let mut parts: HashMap<ShaderStageFlags, ShaderStageInput> = HashMap::new();
  12.  
  13.             let mut file = match std::fs::File::open(&input) {
  14.                 Err(why) => panic!("couldn't open {}: {:?}", input.display(), why),
  15.                 Ok(file) => file,
  16.             };
  17.  
  18.             let mut data = Vec::new();
  19.             file.read_to_end(&mut data)
  20.                 .unwrap_or_else(|why| panic!("couldn't slurp {}: {:?}", input.display(), why));
  21.  
  22.             /*
  23.             // Basic Texture Shader
  24.  
  25.             #type vertex
  26.             #version 330 core
  27.  
  28.             #extension GL_ARB_separate_shader_objects : enable
  29.             #extension GL_ARB_shading_language_420pack : enable
  30.  
  31.             layout(location = 0) in vec3 a_Position;
  32.             layout(location = 1) in vec2 a_TexCoord;
  33.  
  34.             layout(set = 0, binding = 0) uniform UBO {
  35.                 mat4 ViewProjection;
  36.                 mat4 Transform;
  37.             } u;
  38.  
  39.             out vec2 v_TexCoord;
  40.  
  41.             void main()
  42.             {
  43.                 v_TexCoord = a_TexCoord;
  44.                 gl_Position = u.ViewProjection * u.Transform * vec4(a_Position, 1.0);
  45.             }
  46.  
  47.             #type fragment
  48.             #version 330 core
  49.  
  50.             layout(location = 0) out vec4 color;
  51.  
  52.             in vec2 v_TexCoord;
  53.  
  54.             uniform sampler2D u_Texture;
  55.  
  56.             void main()
  57.             {
  58.                 color = texture(u_Texture, v_TexCoord);
  59.             }
  60.             */
  61.             let type_token = "#type";
  62.             let mut pos = find_subsequence(&data, type_token);
  63.             while let Some(_pos) = pos {
  64.                 use std::str::from_utf8;
  65.                 data = data[_pos + 1..].to_vec();
  66.                 let mut iter = data.iter();
  67.                 let t = iter.try_fold(Vec::new(), |t, &val| match val { 10 | 13 /* '\n' | '\r' */ => None, v => { let mut _t = t; _t.push(v); Some(_t) } }).unwrap();
  68.                 data = iter
  69.                     .skip(t.len())
  70.                     .skip_while(|val| match val { 10 | 13 /* '\n' | '\r' */ => true, _ => false })
  71.                     .map(|v| *v)
  72.                     .collect();
  73.                 pos = find_subsequence(&data, type_token);
  74.                 parts.insert(
  75.                     match from_utf8(&t[..]).unwrap() {
  76.                         "vertex" => ShaderStageFlags::VERTEX,
  77.                         "fragment" => ShaderStageFlags::FRAGMENT,
  78.                         _ => ShaderStageFlags::VERTEX,
  79.                     },
  80.                     ShaderStageInput::Code(
  81.                         from_utf8(if let Some(_pos) = pos {
  82.                             &data[.._pos]
  83.                         } else {
  84.                             &data[..]
  85.                         })
  86.                         .unwrap()
  87.                         .to_owned(),
  88.                     ),
  89.                 );
  90.             }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement