Skip to main content

enigma_3d/postprocessing/
depth_fog.rs

1use glium::glutin::surface::WindowSurface;
2use glium::{IndexBuffer, Surface, Texture2d, uniform, VertexBuffer};
3use glium::framebuffer::SimpleFrameBuffer;
4use glium::texture::DepthTexture2d;
5use crate::{AppState, resources, shader};
6use crate::geometry::Vertex;
7use crate::postprocessing::PostProcessingEffect;
8
9pub struct DepthFog {
10    pub min_depth: f32,
11    pub max_depth: f32,
12    pub fog_cutoff: f32,
13    pub color: [f32; 3],
14    pub opacity: f32,
15    program: glium::Program,
16}
17
18impl DepthFog {
19    pub fn new(display: &glium::Display<WindowSurface>, min_depth: f32, max_depth: f32, fog_cutoff: f32, color: [f32; 3], opacity: f32) -> Self {
20        let fog_shader = shader::Shader::from_strings(resources::post_processing_vertex(), resources::post_processing_depth_fog_fragment(), None);
21
22        let program = glium::Program::from_source(display, &fog_shader.get_vertex_shader(), &fog_shader.get_fragment_shader(), None).expect("Failed to compile shader program");
23
24        Self {
25            min_depth,
26            max_depth,
27            opacity,
28            program,
29            fog_cutoff,
30            color,
31        }
32    }
33}
34
35impl PostProcessingEffect for DepthFog {
36    fn render(&self, app_state: &AppState, vertex_buffer: &VertexBuffer<Vertex>, index_buffer: &IndexBuffer<u32>, target: &mut SimpleFrameBuffer, source: &Texture2d, depth_source: &DepthTexture2d, _buffer_textures: &Vec<Texture2d>) {
37        let uniforms = uniform! {
38            scene: source,
39            depth: depth_source,
40            minDepth: self.min_depth,
41            maxDepth: self.max_depth,
42            fogColor: self.color,
43            opacity: self.opacity,
44            near: app_state.camera.unwrap().near,
45            far: app_state.camera.unwrap().far,
46            fogCutoff: self.fog_cutoff,
47        };
48
49        let params = glium::DrawParameters {
50            blend: glium::Blend::alpha_blending(),
51            depth: glium::Depth {
52                test: glium::DepthTest::IfLess,
53                write: false,
54                ..Default::default()
55            },
56            ..Default::default()
57        };
58
59        target.draw(
60            &*vertex_buffer,
61            &*index_buffer,
62            &self.program,
63            &uniforms,
64            &params,
65        ).unwrap();
66    }
67}