veloren_voxygen/render/renderer/
shaders.rs

1use common::assets::{self, AssetExt, AssetHandle};
2use hashbrown::HashMap;
3
4/// Load from a GLSL file.
5pub struct Glsl(pub String);
6
7impl From<String> for Glsl {
8    fn from(s: String) -> Glsl { Glsl(s) }
9}
10
11impl assets::Asset for Glsl {
12    type Loader = assets::LoadFrom<String, assets::StringLoader>;
13
14    const EXTENSION: &'static str = "glsl";
15}
16
17// Note: we use this clone to send the shaders to a background thread
18// TODO: use Arc-ed asset and clone that instead
19#[derive(Clone)]
20pub struct Shaders {
21    shaders: HashMap<String, AssetHandle<Glsl>>,
22}
23
24impl assets::Compound for Shaders {
25    // TODO: Taking the specifier argument as a base for shaders specifiers
26    // would allow to use several shaders groups easily
27    fn load(_: assets::AnyCache, _: &assets::SharedString) -> Result<Shaders, assets::BoxedError> {
28        let shaders = [
29            "include.constants",
30            "include.globals",
31            "include.sky",
32            "include.light",
33            "include.srgb",
34            "include.random",
35            "include.lod",
36            "include.shadows",
37            "include.rain_occlusion",
38            "include.point_glow",
39            "include.fxaa",
40            "antialias.none",
41            "antialias.bilinear",
42            "antialias.fxaa",
43            "antialias.msaa-x4",
44            "antialias.msaa-x8",
45            "antialias.msaa-x16",
46            "antialias.hqx",
47            "antialias.fxupscale",
48            "include.cloud.none",
49            "include.cloud.regular",
50            "figure-vert",
51            "light-shadows-figure-vert",
52            "light-shadows-directed-vert",
53            "light-shadows-debug-vert",
54            "rain-occlusion-figure-vert",
55            "rain-occlusion-directed-vert",
56            "point-light-shadows-vert",
57            "skybox-vert",
58            "skybox-frag",
59            "debug-vert",
60            "debug-frag",
61            "figure-frag",
62            "rope-vert",
63            "rope-frag",
64            "terrain-vert",
65            "terrain-frag",
66            "fluid-vert",
67            "fluid-frag.cheap",
68            "fluid-frag.shiny",
69            "sprite-vert",
70            "sprite-frag",
71            "lod-object-vert",
72            "lod-object-frag",
73            "particle-vert",
74            "particle-frag",
75            "trail-vert",
76            "trail-frag",
77            "ui-vert",
78            "ui-frag",
79            "premultiply-alpha-vert",
80            "premultiply-alpha-frag",
81            "lod-terrain-vert",
82            "lod-terrain-frag",
83            "clouds-vert",
84            "clouds-frag",
85            "dual-downsample-filtered-frag",
86            "dual-downsample-frag",
87            "dual-upsample-frag",
88            "clouds-frag",
89            "postprocess-vert",
90            "postprocess-frag",
91            "blit-vert",
92            "blit-frag",
93            //"player-shadow-frag",
94            //"light-shadows-geom",
95        ];
96
97        let shaders = shaders
98            .iter()
99            .map(|shader| {
100                let full_specifier = ["voxygen.shaders.", shader].concat();
101                let asset = AssetExt::load(&full_specifier)?;
102                Ok((String::from(*shader), asset))
103            })
104            .collect::<Result<HashMap<_, _>, assets::Error>>()?;
105
106        Ok(Self { shaders })
107    }
108}
109
110impl Shaders {
111    pub fn get(&self, shader: &str) -> Option<impl core::ops::Deref<Target = Glsl>> {
112        self.shaders.get(shader).map(|a| a.read())
113    }
114}