enigma-3d 0.2.15

A 3D Rendering Engine with a focus on simplicity and ease of use. Far from feature complete and not recommended for production use.
Documentation
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();
    }
}