scale bounds by viewport, set scissor: fixes #21

This commit is contained in:
jazzfool 2024-12-15 15:51:45 +11:00
parent d5e28bf017
commit f2aa4de527
2 changed files with 13 additions and 17 deletions

View file

@ -346,15 +346,13 @@ impl VideoPipeline {
pass.set_pipeline(&self.pipeline); pass.set_pipeline(&self.pipeline);
pass.set_bind_group(0, &video.bg0, &[]); pass.set_bind_group(0, &video.bg0, &[]);
pass.set_viewport( pass.set_scissor_rect(
viewport.x as _, viewport.x as _,
viewport.y as _, viewport.y as _,
viewport.width as _, viewport.width as _,
viewport.height 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, format: wgpu::TextureFormat,
storage: &mut iced_wgpu::primitive::Storage, storage: &mut iced_wgpu::primitive::Storage,
bounds: &iced::Rectangle, bounds: &iced::Rectangle,
_viewport: &iced_wgpu::graphics::Viewport, viewport: &iced_wgpu::graphics::Viewport,
) { ) {
if !storage.has::<VideoPipeline>() { if !storage.has::<VideoPipeline>() {
storage.store(VideoPipeline::new(device, format)); 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( fn render(

View file

@ -21,20 +21,18 @@ var<uniform> uniforms: Uniforms;
@vertex @vertex
fn vs_main(@builtin(vertex_index) in_vertex_index: u32) -> VertexOutput { fn vs_main(@builtin(vertex_index) in_vertex_index: u32) -> VertexOutput {
let quad = array<vec2<f32>, 6>( var quad = array<vec4<f32>, 6>(
uniforms.rect.xy, vec4<f32>(uniforms.rect.xy, 0.0, 0.0),
uniforms.rect.zy, vec4<f32>(uniforms.rect.zy, 1.0, 0.0),
uniforms.rect.xw, vec4<f32>(uniforms.rect.xw, 0.0, 1.0),
uniforms.rect.zy, vec4<f32>(uniforms.rect.zy, 1.0, 0.0),
uniforms.rect.zw, vec4<f32>(uniforms.rect.zw, 1.0, 1.0),
uniforms.rect.xw, vec4<f32>(uniforms.rect.xw, 0.0, 1.0),
); );
var out: VertexOutput; var out: VertexOutput;
out.uv = vec2<f32>(0.0); out.uv = quad[in_vertex_index].zw;
out.uv.x = select(0.0, 2.0, in_vertex_index == 1u); out.position = vec4<f32>(quad[in_vertex_index].xy, 1.0, 1.0);
out.uv.y = select(0.0, 2.0, in_vertex_index == 2u);
out.position = vec4<f32>(out.uv * vec2<f32>(2.0, -2.0) + vec2<f32>(-1.0, 1.0), 1.0, 1.0);
return out; return out;
} }