use glium::glutin::surface::WindowSurface;
use glium::{IndexBuffer, Surface, Texture2d, uniform, VertexBuffer};
use glium::framebuffer::SimpleFrameBuffer;
use glium::texture::DepthTexture2d;
use crate::{AppState, resources, shader};
use crate::geometry::Vertex;
use crate::postprocessing::PostProcessingEffect;
pub struct LensDirt {
program: glium::Program,
dirt_texture: Texture2d,
intensity: f32,
tile_scale: [f32; 2],
light_sensitivity: f32,
}
impl LensDirt {
pub fn new(
display: &glium::Display<WindowSurface>,
dirt_texture_data: &[u8],
intensity: f32,
tile_scale: [f32; 2],
light_sensitivity: f32
) -> Self {
let shader = shader::Shader::from_strings(
resources::post_processing_vertex(),
resources::post_processing_lens_dirt_fragment(),
None
);
let program = glium::Program::from_source(
display,
&shader.get_vertex_shader(),
&shader.get_fragment_shader(),
None
).expect("Failed to compile lens dirt shader program");
let image = image::load_from_memory(dirt_texture_data)
.expect("Failed to load lens dirt texture")
.to_rgba8();
let image_dimensions = image.dimensions();
let image = glium::texture::RawImage2d::from_raw_rgba_reversed(&image.into_raw(), image_dimensions);
let dirt_texture = glium::texture::Texture2d::with_mipmaps(
display,
image,
glium::texture::MipmapsOption::AutoGeneratedMipmaps
).expect("Failed to create lens dirt texture");
Self {
program,
dirt_texture,
intensity,
tile_scale,
light_sensitivity,
}
}
}
impl PostProcessingEffect for LensDirt {
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>) {
let screen_size = app_state.display.as_ref().unwrap().get_framebuffer_dimensions();
let uniforms = uniform! {
scene: source,
dirt_texture: &self.dirt_texture,
intensity: self.intensity,
tile_scale: self.tile_scale,
screen_size: screen_size,
light_sensitivity: self.light_sensitivity,
};
target.draw(
vertex_buffer,
index_buffer,
&self.program,
&uniforms,
&Default::default(),
).unwrap();
}
}