Rotation-independent line width
This commit is contained in:
parent
dca80473d0
commit
1d57ca8a93
|
|
@ -157,6 +157,8 @@ static KEYS_ROTATE: &'static [(PhysicalKey, Vec3)] = &[
|
||||||
#[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)]
|
#[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)]
|
||||||
struct CameraUniform {
|
struct CameraUniform {
|
||||||
mvp: [[f32; 4]; 4],
|
mvp: [[f32; 4]; 4],
|
||||||
|
scale: [f32; 2],
|
||||||
|
pad: [u32; 2],
|
||||||
}
|
}
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
|
|
@ -178,7 +180,6 @@ struct State<'a> {
|
||||||
cam: camctl::CameraLocation,
|
cam: camctl::CameraLocation,
|
||||||
t1: Instant,
|
t1: Instant,
|
||||||
|
|
||||||
camera_uniform: CameraUniform,
|
|
||||||
camera_buffer: wgpu::Buffer,
|
camera_buffer: wgpu::Buffer,
|
||||||
camera_bind_group: wgpu::BindGroup,
|
camera_bind_group: wgpu::BindGroup,
|
||||||
|
|
||||||
|
|
@ -242,13 +243,11 @@ impl<'a> State<'a> {
|
||||||
let cam = camctl::CameraLocation::new();
|
let cam = camctl::CameraLocation::new();
|
||||||
let t1 = Instant::now();
|
let t1 = Instant::now();
|
||||||
|
|
||||||
let camera_uniform = CameraUniform {
|
let camera_buffer = device.create_buffer(&wgpu::BufferDescriptor {
|
||||||
mvp: cam.view_mtx().to_cols_array_2d(),
|
|
||||||
};
|
|
||||||
let camera_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
|
|
||||||
label: Some("Camera Buffer"),
|
label: Some("Camera Buffer"),
|
||||||
contents: bytemuck::cast_slice(&[camera_uniform]),
|
|
||||||
usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST,
|
usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST,
|
||||||
|
size: mem::size_of::<CameraUniform>() as u64,
|
||||||
|
mapped_at_creation: false,
|
||||||
});
|
});
|
||||||
let camera_bind_group_layout =
|
let camera_bind_group_layout =
|
||||||
device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
|
device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
|
||||||
|
|
@ -357,7 +356,6 @@ impl<'a> State<'a> {
|
||||||
scene,
|
scene,
|
||||||
camera_buffer,
|
camera_buffer,
|
||||||
camera_bind_group,
|
camera_bind_group,
|
||||||
camera_uniform,
|
|
||||||
window,
|
window,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -398,12 +396,13 @@ impl<'a> State<'a> {
|
||||||
);
|
);
|
||||||
let view = my_to_gl * self.cam.view_mtx();
|
let view = my_to_gl * self.cam.view_mtx();
|
||||||
let mvp = proj * view;
|
let mvp = proj * view;
|
||||||
self.camera_uniform.mvp = mvp.to_cols_array_2d();
|
let camera_uniform = CameraUniform {
|
||||||
self.queue.write_buffer(
|
mvp: mvp.to_cols_array_2d(),
|
||||||
&self.camera_buffer,
|
scale: (1. / size).to_array(),
|
||||||
0,
|
pad: [0; 2],
|
||||||
bytemuck::cast_slice(&[self.camera_uniform]),
|
};
|
||||||
);
|
self.queue
|
||||||
|
.write_buffer(&self.camera_buffer, 0, bytemuck::bytes_of(&camera_uniform));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render(&mut self) -> Result<(), wgpu::SurfaceError> {
|
fn render(&mut self) -> Result<(), wgpu::SurfaceError> {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
struct CameraUniform {
|
struct CameraUniform {
|
||||||
mvp: mat4x4<f32>,
|
mvp: mat4x4<f32>,
|
||||||
|
scale: vec2<f32>,
|
||||||
}
|
}
|
||||||
@group(0) @binding(0)
|
@group(0) @binding(0)
|
||||||
var<uniform> camera: CameraUniform;
|
var<uniform> camera: CameraUniform;
|
||||||
|
|
@ -30,7 +31,8 @@ fn vs_main(seg: SegmentInput, off: OffsetInput) -> VertexOutput {
|
||||||
let a = camera.mvp * vec4(seg.a, 1.);
|
let a = camera.mvp * vec4(seg.a, 1.);
|
||||||
let b = camera.mvp * vec4(seg.b, 1.);
|
let b = camera.mvp * vec4(seg.b, 1.);
|
||||||
let dir = normalize(b.xy / b.w - a.xy / a.w);
|
let dir = normalize(b.xy / b.w - a.xy / a.w);
|
||||||
let d = width * vec4(-dir.y, dir.x, 0., 0.);
|
let ortho = width * camera.scale * vec2(-dir.y, dir.x);
|
||||||
|
let d = vec4(ortho, 0., 0.);
|
||||||
switch (off.idx) {
|
switch (off.idx) {
|
||||||
case 0u: { out.clip_position = a - d; }
|
case 0u: { out.clip_position = a - d; }
|
||||||
case 1u: { out.clip_position = a + d; }
|
case 1u: { out.clip_position = a + d; }
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user