diff options
author | 2022-09-29 17:13:32 -0700 | |
---|---|---|
committer | 2022-09-29 17:13:32 -0700 | |
commit | e25f3d3dea2d2c1ba7d2778948443df2745084be (patch) | |
tree | 5eacf62531f38ccdfd16d3054f8c13b33b5b6e59 /glow/src/triangle.rs | |
parent | 0f434c74d68d32ecbf2362d1edbac66976dcd8ab (diff) | |
download | iced-e25f3d3dea2d2c1ba7d2778948443df2745084be.tar.gz iced-e25f3d3dea2d2c1ba7d2778948443df2745084be.tar.bz2 iced-e25f3d3dea2d2c1ba7d2778948443df2745084be.zip |
Fixed issue where OpenGL would not render both shaders at once under certain circumstances.
Diffstat (limited to '')
-rw-r--r-- | glow/src/triangle.rs | 52 |
1 files changed, 22 insertions, 30 deletions
diff --git a/glow/src/triangle.rs b/glow/src/triangle.rs index 7d0e14c7..85d873fe 100644 --- a/glow/src/triangle.rs +++ b/glow/src/triangle.rs @@ -24,14 +24,8 @@ pub(crate) struct Pipeline { #[derive(Debug)] struct TrianglePrograms { - solid: TriangleProgram, - gradient: TriangleProgram, -} - -#[derive(Debug)] -enum TriangleProgram { - Solid(SolidProgram), - Gradient(GradientProgram), + solid: SolidProgram, + gradient: GradientProgram, } impl Pipeline { @@ -76,14 +70,8 @@ impl Pipeline { indices, current_transform: Transformation::identity(), programs: TrianglePrograms { - solid: TriangleProgram::Solid(SolidProgram::new( - gl, - shader_version, - )), - gradient: TriangleProgram::Gradient(GradientProgram::new( - gl, - shader_version, - )), + solid: SolidProgram::new(gl, shader_version), + gradient: GradientProgram::new(gl, shader_version), }, } } @@ -138,16 +126,21 @@ impl Pipeline { let mut last_vertex = 0; let mut last_index = 0; - for Mesh { + for (index, Mesh { buffers, origin, clip_bounds, shader, - } in meshes.0.iter() + }) in meshes.0.iter().enumerate() { let transform = 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(); unsafe { @@ -196,25 +189,24 @@ impl Pipeline { ) { match shader { shader::Shader::Solid(color) => { - if let TriangleProgram::Solid(solid_program) = - &mut self.programs.solid - { - unsafe { gl.use_program(Some(solid_program.program)) } - solid_program.set_uniforms(gl, color, transform); - } + unsafe { gl.use_program(Some(self.programs.solid.program)) } + self.programs.solid.set_uniforms(gl, color, transform); } shader::Shader::Gradient(gradient) => { - if let TriangleProgram::Gradient(gradient_program) = - &mut self.programs.gradient - { - unsafe { gl.use_program(Some(gradient_program.program)) } - gradient_program.set_uniforms(gl, gradient, transform); - } + unsafe { gl.use_program(Some(self.programs.gradient.program)) } + self.programs.gradient.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 /// attribute location. pub(super) fn simple_triangle_program( |