summaryrefslogtreecommitdiffstats
path: root/glow/src
diff options
context:
space:
mode:
authorLibravatar shan <shankern@protonmail.com>2022-09-29 17:13:32 -0700
committerLibravatar shan <shankern@protonmail.com>2022-09-29 17:13:32 -0700
commite25f3d3dea2d2c1ba7d2778948443df2745084be (patch)
tree5eacf62531f38ccdfd16d3054f8c13b33b5b6e59 /glow/src
parent0f434c74d68d32ecbf2362d1edbac66976dcd8ab (diff)
downloadiced-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 'glow/src')
-rw-r--r--glow/src/triangle.rs52
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(