pub const BUILTIN_SHADER_NAMES: &[&str] = &[
"flat",
"frosted_glass",
"liquid_glass",
"app_icon_glass",
"retro",
"outline",
"textured",
"emboss",
"xmb_bg",
"polygon",
];
#[cfg(not(feature = "dev"))]
pub fn load_shader(name: &str) -> String {
match name {
"flat" => include_str!("../shaders/flat.wgsl").to_string(),
"frosted_glass" => include_str!("../shaders/frosted_glass.wgsl").to_string(),
"liquid_glass" => include_str!("../shaders/liquid_glass.wgsl").to_string(),
"app_icon_glass" => include_str!("../shaders/app_icon_glass.wgsl").to_string(),
"retro" => include_str!("../shaders/retro.wgsl").to_string(),
"outline" => include_str!("../shaders/outline.wgsl").to_string(),
"textured" => include_str!("../shaders/textured.wgsl").to_string(),
"emboss" => include_str!("../shaders/emboss.wgsl").to_string(),
"xmb_bg" => include_str!("../shaders/xmb_bg.wgsl").to_string(),
"polygon" => include_str!("../shaders/polygon.wgsl").to_string(),
other => panic!("[pane_ui] Unknown built-in shader '{other}'"),
}
}
#[cfg(feature = "dev")]
pub fn load_shader(name: &str) -> String {
let path = format!("shaders/{}.wgsl", name);
std::fs::read_to_string(&path)
.unwrap_or_else(|e| panic!("[pane_ui] Failed to load shader '{}': {}", path, e))
}
pub fn scan_shader_dir(dir: &str) -> Vec<(String, String)> {
scan_dir(dir, "wgsl")
}
pub fn scan_dir(dir: &str, ext: &str) -> Vec<(String, String)> {
let entries = match std::fs::read_dir(dir) {
Ok(e) => e,
Err(e) => {
println!("[pane_ui] Could not scan dir '{dir}': {e}");
return Vec::new();
}
};
let mut results = Vec::new();
for entry in entries.filter_map(std::result::Result::ok) {
let path = entry.path();
if path.extension().is_some_and(|x| x == ext) {
let name = path.file_stem().unwrap().to_string_lossy().to_string();
match std::fs::read_to_string(&path) {
Ok(src) => results.push((name, src)),
Err(e) => println!("[pane_ui] Failed to read '{}': {e}", path.display()),
}
}
}
results
}