From 1560b2d3cd1ca8c3d66efededb4b69b7787a4e00 Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 8 Mar 2020 17:07:13 +0000 Subject: [PATCH] :recycle: Extract shader_closure.rs --- arrow.iqm | Bin 0 -> 8276 bytes pitch.iqm | Bin 0 -> 86936 bytes shaders/shadow-vert.glsl | 2 +- sky-sphere.iqm | Bin 40280 -> 40280 bytes src/bin/pumpkin.rs | 80 +++------------------------------------ src/lib.rs | 1 + src/renderable_model.rs | 1 - src/shader.rs | 2 +- src/shader_closure.rs | 80 +++++++++++++++++++++++++++++++++++++++ 9 files changed, 89 insertions(+), 77 deletions(-) create mode 100644 arrow.iqm create mode 100644 pitch.iqm create mode 100644 src/shader_closure.rs diff --git a/arrow.iqm b/arrow.iqm new file mode 100644 index 0000000000000000000000000000000000000000..c31f89f35a8a396c69ee1af520ab94a2f7037f35 GIT binary patch literal 8276 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 D+Y#c) literal 0 HcmV?d00001 diff --git a/shaders/shadow-vert.glsl b/shaders/shadow-vert.glsl index 57ca830..1b2afc5 100644 --- a/shaders/shadow-vert.glsl +++ b/shaders/shadow-vert.glsl @@ -7,7 +7,7 @@ uniform highp mat4 uni_mvp; attribute highp vec4 attr_pos; void main (void) { - highp float depth_adjust = -1.0 / 512.0; + highp float depth_adjust = -0.0 / 512.0; gl_Position = uni_mvp * attr_pos + vec4 (0.0, 0.0, depth_adjust, 0.0); } diff --git a/sky-sphere.iqm b/sky-sphere.iqm index ad21d46d4846470876d8338d33d0897dcddb4ccc..89db1b87605728d051dcfb3ab8d3afc747a1b9de 100644 GIT binary patch literal 40280 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 ShaderProgram::new (&vert_shader, &frag_shader).unwrap () } -struct ShaderClosure { - program: ShaderProgram, - uniforms: HashMap , - attributes: renderable_model::AttrMap, -} - -struct BorrowedShaderVars <'a> { - unis: &'a HashMap , - attrs: &'a renderable_model::AttrMap, -} - -fn get_shader_attrs ( - shader: &ShaderProgram, - attr_names: &[(usize, &str)] -) --> renderable_model::AttrMap -{ - let mut v = vec! [None; attr_names.iter ().map (|(i, _)| i).max ().unwrap () + 1]; - - let attrs = shader.get_attribute_locations (attr_names.iter ().map (|(_, v)| v).copied ()); - - for ((i, _), loc) in attr_names.iter ().zip (attrs.into_iter ()) { - v [*i] = loc; - } - - v -} - -fn get_shader_uniforms ( - shader: &ShaderProgram, - uni_names: &[(u32, &str)] -) --> HashMap -{ - let unis = shader.get_uniform_locations (uni_names.iter ().map (|(_, v)| v).copied ()); - - let pairs = - uni_names.iter ().map (|(i, _)| i).copied () - .zip (unis.into_iter ()) - .filter (|(_, v)| *v >= 0) - ; - - HashMap::from_iter (pairs) -} - -impl ShaderClosure { - pub fn new ( - program: ShaderProgram, - uniform_names: &[(u32, &str)], - attr_names: &[(usize, &str)] - ) -> Self - { - let uniforms = get_shader_uniforms (&program, uniform_names); - let attributes = get_shader_attrs (&program, attr_names); - Self { - program, - uniforms, - attributes, - } - } - - pub fn with (&self, callback: F) - where F: Fn (BorrowedShaderVars) - { - self.program.use_program (); - - callback (BorrowedShaderVars { - unis: &self.uniforms, - attrs: &self.attributes, - }); - } -} - struct Arrow { origin: Vec3, direction: Vec3, @@ -456,6 +384,7 @@ fn main () { let unis = shader_vars.unis; let attrs = shader_vars.attrs; + // Pass 1 - Draw the world except the ground plane glezz::disable (gl::STENCIL_TEST); glezz::front_face (gl::CW); @@ -501,7 +430,6 @@ fn main () { let draw_sky = true; if draw_sky { - glezz::front_face (gl::CCW); glezz::uniform_matrix_4fv (unis [&MVP], &sky_mvp_mat); glezz::uniform_3fv (unis [&ALBEDO], &white); glezz::uniform_3fv (unis [&MIN_BRIGHT], &white); @@ -516,6 +444,8 @@ fn main () { let unis = shader_vars.unis; let attrs = shader_vars.attrs; + // Pass 2: Draw shadows into stencil buffer + glezz::front_face (gl::CCW); glezz::enable (gl::STENCIL_TEST); unsafe { gl::StencilFunc (gl::ALWAYS, 1, 1); @@ -550,6 +480,7 @@ fn main () { let unis = shader_vars.unis; let attrs = shader_vars.attrs; + // Pass 3: Draw lit ground unsafe { gl::ColorMask (255, 255, 255, 255); gl::DepthMask (1); @@ -577,6 +508,7 @@ fn main () { glezz::uniform_3fv (unis [&OBJECT_SPACE_LIGHT], &Vec3::from ((0.0, 0.0, 0.0))); mesh_pitch.draw (attrs, grass_index); + // Pass 4: Draw shadowed ground unsafe { gl::StencilFunc (gl::EQUAL, 0, 1); gl::StencilOp (gl::KEEP, gl::KEEP, gl::KEEP); diff --git a/src/lib.rs b/src/lib.rs index 599aa0f..f9b9cdd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,5 +7,6 @@ pub mod gpu_buffers; pub mod iqm; pub mod renderable_model; pub mod shader; +pub mod shader_closure; pub mod texture; pub mod timestep; diff --git a/src/renderable_model.rs b/src/renderable_model.rs index bea63a3..316add7 100644 --- a/src/renderable_model.rs +++ b/src/renderable_model.rs @@ -1,6 +1,5 @@ use byteorder::{ByteOrder, LittleEndian}; -use std::collections::*; use std::convert::TryInto; use std::ffi::c_void; diff --git a/src/shader.rs b/src/shader.rs index a90ea2c..7ebe715 100644 --- a/src/shader.rs +++ b/src/shader.rs @@ -1,4 +1,3 @@ -use std::collections::*; use std::convert::TryInto; use std::ffi::{CStr, CString}; @@ -73,6 +72,7 @@ impl Drop for ShaderObject { } } +#[derive (PartialEq, Eq)] pub struct ShaderProgram { id: u32, } diff --git a/src/shader_closure.rs b/src/shader_closure.rs new file mode 100644 index 0000000..47c24dd --- /dev/null +++ b/src/shader_closure.rs @@ -0,0 +1,80 @@ +use std::collections::*; +use std::iter::FromIterator; + +use crate::{ + renderable_model::AttrMap, + shader::ShaderProgram, +}; + +pub struct ShaderClosure { + program: ShaderProgram, + uniforms: HashMap , + attributes: AttrMap, +} + +pub struct BorrowedShaderVars <'a> { + pub unis: &'a HashMap , + pub attrs: &'a AttrMap, +} + +pub fn get_shader_attrs ( + shader: &ShaderProgram, + attr_names: &[(usize, &str)] +) +-> AttrMap +{ + let mut v = vec! [None; attr_names.iter ().map (|(i, _)| i).max ().unwrap () + 1]; + + let attrs = shader.get_attribute_locations (attr_names.iter ().map (|(_, v)| v).copied ()); + + for ((i, _), loc) in attr_names.iter ().zip (attrs.into_iter ()) { + v [*i] = loc; + } + + v +} + +pub fn get_shader_uniforms ( + shader: &ShaderProgram, + uni_names: &[(u32, &str)] +) +-> HashMap +{ + let unis = shader.get_uniform_locations (uni_names.iter ().map (|(_, v)| v).copied ()); + + let pairs = + uni_names.iter ().map (|(i, _)| i).copied () + .zip (unis.into_iter ()) + .filter (|(_, v)| *v >= 0) + ; + + HashMap::from_iter (pairs) +} + +impl ShaderClosure { + pub fn new ( + program: ShaderProgram, + uniform_names: &[(u32, &str)], + attr_names: &[(usize, &str)] + ) -> Self + { + let uniforms = get_shader_uniforms (&program, uniform_names); + let attributes = get_shader_attrs (&program, attr_names); + Self { + program, + uniforms, + attributes, + } + } + + pub fn with (&self, callback: F) + where F: Fn (BorrowedShaderVars) + { + self.program.use_program (); + + callback (BorrowedShaderVars { + unis: &self.uniforms, + attrs: &self.attributes, + }); + } +}