Skip to content

Commit 223ce17

Browse files
Add viewport scale
1 parent 4c47ba4 commit 223ce17

2 files changed

Lines changed: 26 additions & 3 deletions

File tree

desktop/src/render.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::sync::Arc;
22

3+
use bytemuck::{Pod, Zeroable};
34
use thiserror::Error;
45
use winit::window::Window;
56

@@ -103,6 +104,7 @@ pub(crate) struct GraphicsState {
103104
config: wgpu::SurfaceConfiguration,
104105
render_pipeline: wgpu::RenderPipeline,
105106
sampler: wgpu::Sampler,
107+
viewport_scale: [f32; 2],
106108
viewport_offset: [f32; 2],
107109
viewport_texture: Option<wgpu::Texture>,
108110
ui_texture: Option<wgpu::Texture>,
@@ -182,7 +184,7 @@ impl GraphicsState {
182184
bind_group_layouts: &[&texture_bind_group_layout],
183185
push_constant_ranges: &[wgpu::PushConstantRange {
184186
stages: wgpu::ShaderStages::FRAGMENT,
185-
range: 0..std::mem::size_of::<[f32; 2]>() as u32, // 2 floats for viewport offset
187+
range: 0..size_of::<Constants>() as u32,
186188
}],
187189
});
188190

@@ -230,6 +232,7 @@ impl GraphicsState {
230232
config,
231233
render_pipeline,
232234
sampler,
235+
viewport_scale: [1.0, 1.0],
233236
viewport_offset: [0.0, 0.0],
234237
viewport_texture: None,
235238
ui_texture: None,
@@ -261,6 +264,10 @@ impl GraphicsState {
261264
self.bind_group = Some(bind_group);
262265
}
263266

267+
pub(crate) fn set_viewport_scale(&mut self, scale: [f32; 2]) {
268+
self.viewport_scale = scale;
269+
}
270+
264271
pub(crate) fn set_viewport_offset(&mut self, offset: [f32; 2]) {
265272
self.viewport_offset = offset;
266273
}
@@ -312,7 +319,14 @@ impl GraphicsState {
312319
});
313320

314321
render_pass.set_pipeline(&self.render_pipeline);
315-
render_pass.set_push_constants(wgpu::ShaderStages::FRAGMENT, 0, bytemuck::cast_slice(&self.viewport_offset));
322+
render_pass.set_push_constants(
323+
wgpu::ShaderStages::FRAGMENT,
324+
0,
325+
bytemuck::bytes_of(&Constants {
326+
viewport_scale: self.viewport_scale,
327+
viewport_offset: self.viewport_offset,
328+
}),
329+
);
316330
if let Some(bind_group) = &self.bind_group {
317331
render_pass.set_bind_group(0, bind_group, &[]);
318332
render_pass.draw(0..6, 0..1); // Draw 3 vertices for fullscreen triangle
@@ -326,3 +340,10 @@ impl GraphicsState {
326340
Ok(())
327341
}
328342
}
343+
344+
#[repr(C)]
345+
#[derive(Copy, Clone, Pod, Zeroable)]
346+
struct Constants {
347+
viewport_scale: [f32; 2],
348+
viewport_offset: [f32; 2],
349+
}

desktop/src/render/fullscreen_texture.wgsl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ fn vs_main(@builtin(vertex_index) vertex_index: u32) -> VertexOutput {
2626
}
2727

2828
struct Constants {
29+
viewport_scale: vec2<f32>,
2930
viewport_offset: vec2<f32>,
3031
};
3132

@@ -44,6 +45,7 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {
4445
if (ui_color.a == 1.0) {
4546
return ui_color;
4647
}
47-
let viewport_color: vec4<f32> = textureSample(t_viewport, s_diffuse, in.tex_coords - constants.viewport_offset);
48+
let viewport_tex_coords = (in.tex_coords - constants.viewport_offset) * constants.viewport_scale;
49+
let viewport_color: vec4<f32> = textureSample(t_viewport, s_diffuse, viewport_tex_coords);
4850
return ui_color * ui_color.a + viewport_color * (1.0 - ui_color.a);
4951
}

0 commit comments

Comments
 (0)