diff --git a/src/bin/pumpkin.rs b/src/bin/pumpkin.rs index 026bd08..77fc9dd 100644 --- a/src/bin/pumpkin.rs +++ b/src/bin/pumpkin.rs @@ -2,6 +2,8 @@ use glam::{Mat4, Vec3, Vec4}; use sdl2::event::Event; use sdl2::keyboard::{Keycode, Scancode}; +use std::collections::*; +use std::iter::FromIterator; use std::time::{Duration}; use opengl_rust::*; @@ -94,6 +96,18 @@ impl WorldState { } } +mod uniforms { +use iota::iota; +iota! { + pub const MVP: u32 = iota; + , OBJECT_SPACE_LIGHT + , ALBEDO + , MIN_ALBEDO + , MIN_BRIGHT + , TEXTURE +} +} + fn main () { let sdl_context = sdl2::init ().unwrap (); let video_subsystem = sdl_context.video ().unwrap (); @@ -127,14 +141,24 @@ fn main () { let shader_program = ShaderProgram::new (&vert_shader, &frag_shader).unwrap (); - let unis = shader_program.get_uniform_locations (vec! [ - "mvp", - "object_space_light", - "albedo", - "min_albedo", - "min_bright", - "texture", - ].into_iter ()); + let uni_lookup: HashMap <_, &str> = HashMap::from_iter ({ + use uniforms::*; + vec! [ + (MVP, "mvp"), + (OBJECT_SPACE_LIGHT, "object_space_light"), + (ALBEDO, "albedo"), + (MIN_ALBEDO, "min_albedo"), + (MIN_BRIGHT, "min_bright"), + (TEXTURE, "texture"), + ].into_iter () + }); + + let unis = shader_program.get_uniform_locations (uni_lookup.values ().map (|s| *s)); + + let unis: HashMap = HashMap::from_iter ( + uni_lookup.iter () + .map (|(key, name)| (*key, *unis.get (*name).unwrap ())) + ); let attrs = shader_program.get_attribute_locations (vec! [ "pos", @@ -224,27 +248,30 @@ fn main () { glezz::clear (gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT); glezz::disable (gl::CULL_FACE); - glezz::uniform_3fv (unis ["min_bright"], &black); - glezz::uniform_3fv (unis ["min_albedo"], &white); - glezz::uniform_3fv (unis ["albedo"], &orange); - - glezz::uniform_matrix_4fv (unis ["mvp"], &mvp_mat); - glezz::uniform_3fv (unis ["object_space_light"], &object_space_light); - - renderable_model.draw (&attrs, 0); - - glezz::uniform_3fv (unis ["albedo"], &green); - renderable_model.draw (&attrs, 1); - - let draw_sky = true; - if draw_sky { - glezz::uniform_matrix_4fv (unis ["mvp"], &sky_mvp_mat); - glezz::uniform_3fv (unis ["albedo"], &white); - glezz::uniform_3fv (unis ["min_bright"], &white); - glezz::uniform_3fv (unis ["min_albedo"], &black); - glezz::uniform_1i (unis ["texture"], 0); + { + use uniforms::*; + glezz::uniform_3fv (unis [&MIN_BRIGHT], &black); + glezz::uniform_3fv (unis [&MIN_ALBEDO], &white); + glezz::uniform_3fv (unis [&ALBEDO], &orange); - renderable_sky.draw (&attrs, 0); + glezz::uniform_matrix_4fv (unis [&MVP], &mvp_mat); + glezz::uniform_3fv (unis [&OBJECT_SPACE_LIGHT], &object_space_light); + + renderable_model.draw (&attrs, 0); + + glezz::uniform_3fv (unis [&ALBEDO], &green); + renderable_model.draw (&attrs, 1); + + let draw_sky = true; + if draw_sky { + glezz::uniform_matrix_4fv (unis [&MVP], &sky_mvp_mat); + glezz::uniform_3fv (unis [&ALBEDO], &white); + glezz::uniform_3fv (unis [&MIN_BRIGHT], &white); + glezz::uniform_3fv (unis [&MIN_ALBEDO], &black); + glezz::uniform_1i (unis [&TEXTURE], 0); + + renderable_sky.draw (&attrs, 0); + } } window.gl_swap_window (); diff --git a/src/iqm.rs b/src/iqm.rs index 0f885f7..260e2d4 100644 --- a/src/iqm.rs +++ b/src/iqm.rs @@ -40,26 +40,30 @@ iota! { } pub mod types { - pub const POSITION: usize = 0; - pub const TEXCOORD: usize = 1; - pub const NORMAL: usize = 2; - pub const TANGENT: usize = 3; - pub const BLENDINDEXES: usize = 4; - pub const BLENDWEIGHTS: usize = 5; - pub const COLOR: usize = 6; +iota! { + pub const POSITION: usize = iota; + , TEXCOORD + , NORMAL + , TANGENT + , BLENDINDEXES + , BLENDWEIGHTS + , COLOR +} pub const CUSTOM: usize = 0x10; } pub mod formats { - pub const BYTE: u32 = 0; - pub const UBYTE: u32 = 1; - pub const SHORT: u32 = 2; - pub const USHORT: u32 = 3; - pub const INT: u32 = 4; - pub const UINT: u32 = 5; - pub const HALF: u32 = 6; - pub const FLOAT: u32 = 7; - pub const DOUBLE: u32 = 8; +iota! { + pub const BYTE: u32 = iota; + , UBYTE + , SHORT + , USHORT + , INT + , UINT + , HALF + , FLOAT + , DOUBLE +} } #[derive (Debug)]