Fixed issue where OpenGL would not render both shaders at once under certain circumstances.
This commit is contained in:
parent
0f434c74d6
commit
e25f3d3dea
2 changed files with 23 additions and 31 deletions
|
|
@ -90,7 +90,7 @@ fn generate_box(frame: &mut Frame, bounds: Size) -> bool {
|
||||||
|
|
||||||
let gradient = |top_left: Point, bottom_right: Point| -> Gradient {
|
let gradient = |top_left: Point, bottom_right: Point| -> Gradient {
|
||||||
let mut builder = Gradient::linear(top_left, bottom_right);
|
let mut builder = Gradient::linear(top_left, bottom_right);
|
||||||
let stops = thread_rng().gen_range(1..64u32);
|
let stops = thread_rng().gen_range(1..10u32);
|
||||||
|
|
||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
while i <= stops {
|
while i <= stops {
|
||||||
|
|
|
||||||
|
|
@ -24,14 +24,8 @@ pub(crate) struct Pipeline {
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct TrianglePrograms {
|
struct TrianglePrograms {
|
||||||
solid: TriangleProgram,
|
solid: SolidProgram,
|
||||||
gradient: TriangleProgram,
|
gradient: GradientProgram,
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
enum TriangleProgram {
|
|
||||||
Solid(SolidProgram),
|
|
||||||
Gradient(GradientProgram),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Pipeline {
|
impl Pipeline {
|
||||||
|
|
@ -76,14 +70,8 @@ impl Pipeline {
|
||||||
indices,
|
indices,
|
||||||
current_transform: Transformation::identity(),
|
current_transform: Transformation::identity(),
|
||||||
programs: TrianglePrograms {
|
programs: TrianglePrograms {
|
||||||
solid: TriangleProgram::Solid(SolidProgram::new(
|
solid: SolidProgram::new(gl, shader_version),
|
||||||
gl,
|
gradient: GradientProgram::new(gl, shader_version),
|
||||||
shader_version,
|
|
||||||
)),
|
|
||||||
gradient: TriangleProgram::Gradient(GradientProgram::new(
|
|
||||||
gl,
|
|
||||||
shader_version,
|
|
||||||
)),
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -138,16 +126,21 @@ impl Pipeline {
|
||||||
let mut last_vertex = 0;
|
let mut last_vertex = 0;
|
||||||
let mut last_index = 0;
|
let mut last_index = 0;
|
||||||
|
|
||||||
for Mesh {
|
for (index, Mesh {
|
||||||
buffers,
|
buffers,
|
||||||
origin,
|
origin,
|
||||||
clip_bounds,
|
clip_bounds,
|
||||||
shader,
|
shader,
|
||||||
} in meshes.0.iter()
|
}) in meshes.0.iter().enumerate()
|
||||||
{
|
{
|
||||||
let transform =
|
let transform =
|
||||||
transformation * Transformation::translate(origin.x, origin.y);
|
transformation * Transformation::translate(origin.x, origin.y);
|
||||||
|
|
||||||
|
if index == 0 {
|
||||||
|
//set initial transform uniform for both programs
|
||||||
|
self.programs.set_transforms(gl, transform);
|
||||||
|
}
|
||||||
|
|
||||||
let clip_bounds = (*clip_bounds * scale_factor).snap();
|
let clip_bounds = (*clip_bounds * scale_factor).snap();
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
|
|
@ -196,25 +189,24 @@ impl Pipeline {
|
||||||
) {
|
) {
|
||||||
match shader {
|
match shader {
|
||||||
shader::Shader::Solid(color) => {
|
shader::Shader::Solid(color) => {
|
||||||
if let TriangleProgram::Solid(solid_program) =
|
unsafe { gl.use_program(Some(self.programs.solid.program)) }
|
||||||
&mut self.programs.solid
|
self.programs.solid.set_uniforms(gl, color, transform);
|
||||||
{
|
|
||||||
unsafe { gl.use_program(Some(solid_program.program)) }
|
|
||||||
solid_program.set_uniforms(gl, color, transform);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
shader::Shader::Gradient(gradient) => {
|
shader::Shader::Gradient(gradient) => {
|
||||||
if let TriangleProgram::Gradient(gradient_program) =
|
unsafe { gl.use_program(Some(self.programs.gradient.program)) }
|
||||||
&mut self.programs.gradient
|
self.programs.gradient.set_uniforms(gl, gradient, transform);
|
||||||
{
|
|
||||||
unsafe { gl.use_program(Some(gradient_program.program)) }
|
|
||||||
gradient_program.set_uniforms(gl, gradient, transform);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl TrianglePrograms {
|
||||||
|
pub fn set_transforms(&self, gl: &glow::Context, transform: Transformation) {
|
||||||
|
update_transform(gl, self.solid.program, Some(transform));
|
||||||
|
update_transform(gl, self.gradient.program, Some(transform));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// A simple shader program. Uses [`triangle.vert`] for its vertex shader and only binds position
|
/// A simple shader program. Uses [`triangle.vert`] for its vertex shader and only binds position
|
||||||
/// attribute location.
|
/// attribute location.
|
||||||
pub(super) fn simple_triangle_program(
|
pub(super) fn simple_triangle_program(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue