enigma_3d/postprocessing/
depth_fog.rs1use 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 ¶ms,
65 ).unwrap();
66 }
67}