From f2aa4de527144fbf77fd838561a1d33efb46bd40 Mon Sep 17 00:00:00 2001 From: jazzfool Date: Sun, 15 Dec 2024 15:51:45 +1100 Subject: [PATCH] scale bounds by viewport, set scissor: fixes #21 --- src/pipeline.rs | 10 ++++------ src/shader.wgsl | 20 +++++++++----------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/pipeline.rs b/src/pipeline.rs index 5ddd8a4..76a0be0 100644 --- a/src/pipeline.rs +++ b/src/pipeline.rs @@ -346,15 +346,13 @@ impl VideoPipeline { pass.set_pipeline(&self.pipeline); pass.set_bind_group(0, &video.bg0, &[]); - pass.set_viewport( + pass.set_scissor_rect( viewport.x as _, viewport.y as _, viewport.width as _, viewport.height as _, - 0.0, - 1.0, ); - pass.draw(0..4, 0..1); + pass.draw(0..6, 0..1); } } } @@ -394,7 +392,7 @@ impl Primitive for VideoPrimitive { format: wgpu::TextureFormat, storage: &mut iced_wgpu::primitive::Storage, bounds: &iced::Rectangle, - _viewport: &iced_wgpu::graphics::Viewport, + viewport: &iced_wgpu::graphics::Viewport, ) { if !storage.has::() { storage.store(VideoPipeline::new(device, format)); @@ -413,7 +411,7 @@ impl Primitive for VideoPrimitive { ); } - pipeline.prepare(queue, self.video_id, bounds); + pipeline.prepare(queue, self.video_id, &(*bounds * viewport.projection())); } fn render( diff --git a/src/shader.wgsl b/src/shader.wgsl index 091f8f9..46ceca9 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -21,20 +21,18 @@ var uniforms: Uniforms; @vertex fn vs_main(@builtin(vertex_index) in_vertex_index: u32) -> VertexOutput { - let quad = array, 6>( - uniforms.rect.xy, - uniforms.rect.zy, - uniforms.rect.xw, - uniforms.rect.zy, - uniforms.rect.zw, - uniforms.rect.xw, + var quad = array, 6>( + vec4(uniforms.rect.xy, 0.0, 0.0), + vec4(uniforms.rect.zy, 1.0, 0.0), + vec4(uniforms.rect.xw, 0.0, 1.0), + vec4(uniforms.rect.zy, 1.0, 0.0), + vec4(uniforms.rect.zw, 1.0, 1.0), + vec4(uniforms.rect.xw, 0.0, 1.0), ); var out: VertexOutput; - out.uv = vec2(0.0); - out.uv.x = select(0.0, 2.0, in_vertex_index == 1u); - out.uv.y = select(0.0, 2.0, in_vertex_index == 2u); - out.position = vec4(out.uv * vec2(2.0, -2.0) + vec2(-1.0, 1.0), 1.0, 1.0); + out.uv = quad[in_vertex_index].zw; + out.position = vec4(quad[in_vertex_index].xy, 1.0, 1.0); return out; }