Use the passes system
parent
7b140301c3
commit
9e74609eb1
|
@ -323,6 +323,27 @@ impl Pass <'_> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn with <F> (&self, callback: F)
|
||||||
|
where F: Fn ()
|
||||||
|
{
|
||||||
|
self.apply_slow ();
|
||||||
|
callback ();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn with_shader <F> (&self, callback: F)
|
||||||
|
where F: Fn (BorrowedShaderVars)
|
||||||
|
{
|
||||||
|
if let Some (s) = self.shader {
|
||||||
|
s.with (|shader_vars| {
|
||||||
|
self.apply_slow ();
|
||||||
|
callback (shader_vars);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
panic! ("Called with_shader on a pass with no shader");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct GameGraphics {
|
struct GameGraphics {
|
||||||
|
@ -497,6 +518,7 @@ impl GameGraphics {
|
||||||
shader: Some (&self.shader_diffuse),
|
shader: Some (&self.shader_diffuse),
|
||||||
required_state: GlState {
|
required_state: GlState {
|
||||||
flags: hashmap! {
|
flags: hashmap! {
|
||||||
|
gl::CULL_FACE => true,
|
||||||
gl::DEPTH_TEST => true,
|
gl::DEPTH_TEST => true,
|
||||||
gl::TEXTURE_2D => true,
|
gl::TEXTURE_2D => true,
|
||||||
gl::STENCIL_TEST => false,
|
gl::STENCIL_TEST => false,
|
||||||
|
@ -513,6 +535,7 @@ impl GameGraphics {
|
||||||
shader: Some (&self.shader_shadow),
|
shader: Some (&self.shader_shadow),
|
||||||
required_state: GlState {
|
required_state: GlState {
|
||||||
flags: hashmap! {
|
flags: hashmap! {
|
||||||
|
gl::CULL_FACE => true,
|
||||||
gl::DEPTH_TEST => true,
|
gl::DEPTH_TEST => true,
|
||||||
gl::STENCIL_TEST => true,
|
gl::STENCIL_TEST => true,
|
||||||
},
|
},
|
||||||
|
@ -539,6 +562,7 @@ impl GameGraphics {
|
||||||
shader: Some (&self.shader_diffuse),
|
shader: Some (&self.shader_diffuse),
|
||||||
required_state: GlState {
|
required_state: GlState {
|
||||||
flags: hashmap! {
|
flags: hashmap! {
|
||||||
|
gl::CULL_FACE => true,
|
||||||
gl::DEPTH_TEST => true,
|
gl::DEPTH_TEST => true,
|
||||||
gl::TEXTURE_2D => true,
|
gl::TEXTURE_2D => true,
|
||||||
gl::STENCIL_TEST => true,
|
gl::STENCIL_TEST => true,
|
||||||
|
@ -566,6 +590,7 @@ impl GameGraphics {
|
||||||
shader: Some (&self.shader_diffuse),
|
shader: Some (&self.shader_diffuse),
|
||||||
required_state: GlState {
|
required_state: GlState {
|
||||||
flags: hashmap! {
|
flags: hashmap! {
|
||||||
|
gl::CULL_FACE => true,
|
||||||
gl::DEPTH_TEST => true,
|
gl::DEPTH_TEST => true,
|
||||||
gl::TEXTURE_2D => true,
|
gl::TEXTURE_2D => true,
|
||||||
gl::STENCIL_TEST => true,
|
gl::STENCIL_TEST => true,
|
||||||
|
@ -590,11 +615,10 @@ impl GameGraphics {
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
passes [0].apply_slow ();
|
passes [0].with (|| {
|
||||||
glezz::clear_color (1.0f32, 0.0f32, 1.0f32, 1.0f32);
|
glezz::clear_color (1.0f32, 0.0f32, 1.0f32, 1.0f32);
|
||||||
glezz::clear (gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT | gl::STENCIL_BUFFER_BIT);
|
glezz::clear (gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT | gl::STENCIL_BUFFER_BIT);
|
||||||
|
});
|
||||||
glezz::enable (gl::CULL_FACE);
|
|
||||||
|
|
||||||
let pumpkin_model_mat =
|
let pumpkin_model_mat =
|
||||||
Mat4::from_translation ((0.0, 0.0, 2.7 * 0.5).into ()) *
|
Mat4::from_translation ((0.0, 0.0, 2.7 * 0.5).into ()) *
|
||||||
|
@ -603,21 +627,18 @@ impl GameGraphics {
|
||||||
;
|
;
|
||||||
|
|
||||||
let world_model_mat = Mat4::identity ();
|
let world_model_mat = Mat4::identity ();
|
||||||
|
let inverse_pumpkin = pumpkin_model_mat.inverse ();
|
||||||
|
|
||||||
use uniforms::*;
|
use uniforms::*;
|
||||||
|
|
||||||
self.shader_diffuse.with (|shader_vars| {
|
// Draw the world except the ground plane
|
||||||
|
passes [1].with_shader (|shader_vars| {
|
||||||
let unis = shader_vars.unis;
|
let unis = shader_vars.unis;
|
||||||
let attrs = shader_vars.attrs;
|
let attrs = shader_vars.attrs;
|
||||||
|
|
||||||
// Pass 0 - Draw the world except the ground plane
|
|
||||||
passes [1].apply_slow ();
|
|
||||||
|
|
||||||
let mvp = view_mat * pumpkin_model_mat;
|
let mvp = view_mat * pumpkin_model_mat;
|
||||||
glezz::uniform_matrix_4fv (unis [&MVP], &mvp);
|
glezz::uniform_matrix_4fv (unis [&MVP], &mvp);
|
||||||
|
|
||||||
let inverse_pumpkin = pumpkin_model_mat.inverse ();
|
|
||||||
|
|
||||||
let object_space_light = make_object_space_vec (&inverse_pumpkin, &light);
|
let object_space_light = make_object_space_vec (&inverse_pumpkin, &light);
|
||||||
|
|
||||||
let object_space_sky = make_object_space_vec (&inverse_pumpkin, &Vec3::from ((0.0, 0.0, 1.0)));
|
let object_space_sky = make_object_space_vec (&inverse_pumpkin, &Vec3::from ((0.0, 0.0, 1.0)));
|
||||||
|
@ -666,13 +687,11 @@ impl GameGraphics {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
self.shader_shadow.with (|shader_vars| {
|
// Draw shadows into stencil buffer
|
||||||
|
passes [2].with_shader (|shader_vars| {
|
||||||
let unis = shader_vars.unis;
|
let unis = shader_vars.unis;
|
||||||
let attrs = shader_vars.attrs;
|
let attrs = shader_vars.attrs;
|
||||||
|
|
||||||
// Draw shadows into stencil buffer
|
|
||||||
passes [2].apply_slow ();
|
|
||||||
|
|
||||||
let view_mat = view_mat * shadow_mat;
|
let view_mat = view_mat * shadow_mat;
|
||||||
|
|
||||||
let mvp = view_mat * pumpkin_model_mat;
|
let mvp = view_mat * pumpkin_model_mat;
|
||||||
|
@ -693,17 +712,15 @@ impl GameGraphics {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
self.shader_diffuse.with (|shader_vars| {
|
let object_space_light = make_object_space_vec (&inverse_pumpkin, &light);
|
||||||
|
|
||||||
|
// Draw unlit ground
|
||||||
|
passes [3].with_shader (|shader_vars| {
|
||||||
let unis = shader_vars.unis;
|
let unis = shader_vars.unis;
|
||||||
let attrs = shader_vars.attrs;
|
let attrs = shader_vars.attrs;
|
||||||
|
|
||||||
// Draw lit ground
|
|
||||||
passes [3].apply_slow ();
|
|
||||||
|
|
||||||
let inverse_pumpkin = pumpkin_model_mat.inverse ();
|
let inverse_pumpkin = pumpkin_model_mat.inverse ();
|
||||||
|
|
||||||
let object_space_light = make_object_space_vec (&inverse_pumpkin, &light);
|
|
||||||
|
|
||||||
let object_space_sky = make_object_space_vec (&inverse_pumpkin, &Vec3::from ((0.0, 0.0, 1.0)));
|
let object_space_sky = make_object_space_vec (&inverse_pumpkin, &Vec3::from ((0.0, 0.0, 1.0)));
|
||||||
|
|
||||||
glezz::uniform_3fv (unis [&MIN_BRIGHT], &black);
|
glezz::uniform_3fv (unis [&MIN_BRIGHT], &black);
|
||||||
|
@ -717,9 +734,12 @@ impl GameGraphics {
|
||||||
|
|
||||||
glezz::uniform_3fv (unis [&OBJECT_SPACE_LIGHT], &Vec3::from ((0.0, 0.0, 0.0)));
|
glezz::uniform_3fv (unis [&OBJECT_SPACE_LIGHT], &Vec3::from ((0.0, 0.0, 0.0)));
|
||||||
self.mesh_pitch.draw (attrs, self.grass_index);
|
self.mesh_pitch.draw (attrs, self.grass_index);
|
||||||
|
});
|
||||||
// Draw shadowed ground
|
|
||||||
passes [4].apply_slow ();
|
// Draw lit ground
|
||||||
|
passes [4].with_shader (|shader_vars| {
|
||||||
|
let unis = shader_vars.unis;
|
||||||
|
let attrs = shader_vars.attrs;
|
||||||
|
|
||||||
glezz::uniform_3fv (unis [&OBJECT_SPACE_LIGHT], &object_space_light);
|
glezz::uniform_3fv (unis [&OBJECT_SPACE_LIGHT], &object_space_light);
|
||||||
self.mesh_pitch.draw (attrs, self.grass_index);
|
self.mesh_pitch.draw (attrs, self.grass_index);
|
||||||
|
|
Loading…
Reference in New Issue