enigma_3d/postprocessing/
edge.rs1use 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 ¶ms,
57 ).unwrap();
58 }
59}