Skip to main content

enigma_3d/postprocessing/
vignette.rs

1use glium::glutin::surface::WindowSurface;
2use glium::{IndexBuffer, Surface, Texture2d, uniform, VertexBuffer};
3use glium::framebuffer::SimpleFrameBuffer;
4use glium::texture::DepthTexture2d;
5use crate::postprocessing::PostProcessingEffect;
6use crate::{AppState, resources, shader};
7use crate::geometry::Vertex;
8
9pub struct Vignette {
10    program: glium::Program,
11    pub intensity: f32,
12    pub falloff: f32,
13    pub color: [f32; 3],
14    pub opacity: f32,
15}
16
17impl Vignette {
18    pub fn new(display: &glium::Display<WindowSurface>, intensity: f32, falloff: f32, color: [f32; 3], opacity: f32) -> Self {
19        let vignette_shader = shader::Shader::from_strings(
20            resources::post_processing_vertex(),
21            resources::post_processing_vignette_fragment(),
22            None
23        );
24
25        let program = glium::Program::from_source(
26            display,
27            &vignette_shader.get_vertex_shader(),
28            &vignette_shader.get_fragment_shader(),
29            None
30        ).expect("Failed to compile vignette shader program");
31
32        Self {
33            program,
34            intensity: intensity.clamp(0.0, 1.0),
35            falloff: falloff.clamp(0.0, 1.0),
36            color,
37            opacity: opacity.clamp(0.0, 1.0),
38        }
39    }
40
41    pub fn set_intensity(&mut self, intensity: f32) {
42        self.intensity = intensity.clamp(0.0, 1.0);
43    }
44
45    pub fn set_falloff(&mut self, falloff: f32) {
46        self.falloff = falloff.clamp(0.0, 1.0);
47    }
48
49    pub fn set_color(&mut self, color: [f32; 3]) {
50        self.color = color;
51    }
52
53    pub fn set_opacity(&mut self, opacity: f32) {
54        self.opacity = opacity.clamp(0.0, 1.0);
55    }
56}
57
58impl PostProcessingEffect for Vignette {
59    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>) {
60        let uniforms = uniform! {
61            scene: source,
62            resolution: [source.width() as f32, source.height() as f32],
63            intensity: self.intensity,
64            falloff: self.falloff,
65            vignette_color: self.color,
66            opacity: self.opacity,
67        };
68
69        target.draw(
70            vertex_buffer,
71            index_buffer,
72            &self.program,
73            &uniforms,
74            &Default::default(),
75        ).unwrap();
76    }
77}