/ core / build.rs
build.rs
 1  use shaderc::{CompileOptions, Compiler};
 2  use std::{ffi::OsString, fs, path::PathBuf};
 3  
 4  fn main() {
 5      println!("cargo::rerun-if-changed=src/resources/shaders/");
 6  
 7      let compiler = Compiler::new().unwrap();
 8      let mut options = CompileOptions::new().unwrap();
 9      options.add_macro_definition("EP", Some("main"));
10  
11      // Vec of vertex shaders
12      let mut vertex_shaders: Vec<(OsString, String)> = vec![];
13      // Vec of fragment shaders
14      let mut fragment_shaders: Vec<(OsString, String)> = vec![];
15  
16      // Go through every shader in the shaders folder
17      for file in fs::read_dir("src/resources/shaders").unwrap() {
18          let file_name = file.as_ref().unwrap().file_name();
19          if let Some(ending) = file_name.to_str().unwrap().rsplit_once('.') {
20              match ending.1 {
21                  "vert" => {
22                      vertex_shaders.push((
23                          file_name,
24                          fs::read_to_string(file.unwrap().path())
25                              .expect("Vertex shader should be a text file"),
26                      ));
27                  }
28                  "frag" => {
29                      fragment_shaders.push((
30                          file_name,
31                          fs::read_to_string(file.unwrap().path())
32                              .expect("Fragment shader should be a text file"),
33                      ));
34                  }
35                  _ => (),
36              }
37          }
38      }
39  
40      let out_dir: PathBuf = PathBuf::from(std::env::var("OUT_DIR").unwrap());
41  
42      // Compile each shader and output to the out_dir
43      for vertex_shader in vertex_shaders {
44          let file_name = vertex_shader.0.to_str().unwrap();
45          let shader = compiler
46              .compile_into_spirv(
47                  &vertex_shader.1,
48                  shaderc::ShaderKind::Vertex,
49                  file_name,
50                  "main",
51                  Some(&options),
52              )
53              .unwrap();
54          let binary = shader.as_binary_u8();
55          fs::write(out_dir.join(file_name), binary).unwrap();
56      }
57  
58      for fragment_shader in fragment_shaders {
59          let file_name = fragment_shader.0.to_str().unwrap();
60          println!("Compiling {file_name}");
61          let shader = compiler
62              .compile_into_spirv(
63                  &fragment_shader.1,
64                  shaderc::ShaderKind::Fragment,
65                  file_name,
66                  "main",
67                  Some(&options),
68              )
69              .unwrap();
70          let binary = shader.as_binary_u8();
71          fs::write(out_dir.join(file_name), binary).unwrap();
72      }
73  }