You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
1.8 KiB

use std::process::Command;
use std::path::Path;
use std::ffi::OsStr;
use std::fs::File;
use std::io::Write;
use std::io::prelude::*;
fn main() -> std::io::Result<()> {
println!("building shaders...");
//shaders path
let shaders = Path::new("./src/shaders");
//shader target path
let out = Command::new("mkdir")
.arg("target/shaders/")
.output();
let shader_target = Path::new("./target/shaders/");
//compile all glsl shaders
for entry in shaders.read_dir().expect("reading shader directory failed") {
if let Ok(entry) = entry {
let shader_path = entry.path();
println!("compiling shader: {:?}", shader_path);
let shader_path_string: String = "./target/shaders/".to_string() + shader_path.file_name().unwrap().to_str().unwrap() + ".spv";
let shader_file: &OsStr = OsStr::new::<str>(shader_path_string.as_str());
let out = Command::new("glslc")
.arg("-c")
.arg(shader_path)
.arg("-o")
.arg(shader_file)
.output();
}
}
//include all compiled shaders in shaders.rs file in src dir
let mut txt: String = String::new();
for entry in shader_target.read_dir().expect("reading compiled shader target directory failed") {
if let Ok(entry) = entry {
let bin_path = entry.path();
let bin_path_string = bin_path.file_name().unwrap().to_str().unwrap().to_string();
txt += &("const ".to_owned() +
&bin_path_string.replace(".spv", "").replace(".", "_").to_uppercase() +
" = include_bytes!(\"../target/shaders/" +
&bin_path_string +
"\");\n");
}
}
let mut file = File::create("./src/shaders.rs")?;
file.write_all(txt.as_bytes())?;
Ok(())
}