Skip to main content

enigma_3d/postprocessing/
edge.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 Edge {
10    pub threshold: f32,
11    pub color: [f32; 3],
12    program: glium::Program,
13}
14
15impl Edge {
16    pub fn new(display: &glium::Display<WindowSurface>, threshold: f32, color: [f32; 3]) -> Self {
17        let edge_shader = shader::Shader::from_strings(resources::post_processing_vertex(), resources::post_processing_edge_fragment(), None);
18
19        let program = glium::Program::from_source(display, &edge_shader.get_vertex_shader(), &edge_shader.get_fragment_shader(), None).expect("Failed to compile shader program");
20
21        Self {
22            program,
23            threshold,
24            color,
25        }
26    }
27}
28
29impl PostProcessingEffect for Edge {
30    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>) {
31        let uniforms = uniform! {
32            scene: source,
33            depth: depth_source,
34            threshold: self.threshold,
35            screenSize: [source.width() as f32, source.height() as f32],
36            outlineColor: self.color,
37            near: app_state.camera.unwrap().near,
38            far: app_state.camera.unwrap().far,
39        };
40
41        let params = glium::DrawParameters {
42            blend: glium::Blend::alpha_blending(),
43            depth: glium::Depth {
44                test: glium::DepthTest::IfLess,
45                write: false,
46                .. Default::default()
47            },
48            .. Default::default()
49        };
50
51        target.draw(
52            &*vertex_buffer,
53            &*index_buffer,
54            &self.program,
55            &uniforms,
56            &params,
57        ).unwrap();
58    }
59}