Fix width of lines when zooming

This commit is contained in:
Maximilian Ammann 2022-03-24 15:43:17 +01:00
parent f08c8491cf
commit b9e6c1215c
3 changed files with 21 additions and 5 deletions

View File

@ -1,3 +1,4 @@
use cgmath::num_traits::Pow;
use cgmath::Matrix4;
use std::collections::HashSet;
use std::default::Default;
@ -354,6 +355,11 @@ impl RenderState {
// TODO: What is StagingBelt for?
pub fn upload_tile_geometry(&mut self, scheduler: &mut IOScheduler) {
let visible_z = self.visible_z();
// Factor which determines how much we need to adjust the width of lines for example.
// If zoom == z -> zoom_factor == 1
let zoom_factor = 2.0_f64.powf(visible_z as f64 - self.zoom) as f32;
let view_region = self
.camera
.view_region_bounding_box(&self.perspective)
@ -392,7 +398,7 @@ impl RenderState {
self.buffer_pool.update_tile_metadata(
&self.queue,
entry,
ShaderTileMetadata::new(transform.into()),
ShaderTileMetadata::new(transform.into(), zoom_factor),
);
}
@ -459,7 +465,7 @@ impl RenderState {
*coords,
style_layer.clone(),
buffer,
ShaderTileMetadata::new(transform.into()),
ShaderTileMetadata::new(transform.into(), zoom_factor),
&feature_metadata,
);
}

View File

@ -137,6 +137,11 @@ pub mod tile {
format: wgpu::VertexFormat::Float32x4,
shader_location: 7,
},
wgpu::VertexAttribute {
offset: 4 * wgpu::VertexFormat::Float32x4.size(),
format: wgpu::VertexFormat::Float32,
shader_location: 9,
},
],
},
// vertex style
@ -302,10 +307,14 @@ pub struct ShaderFeatureStyle {
#[derive(Copy, Clone, Pod, Zeroable)]
pub struct ShaderTileMetadata {
pub transform: Mat4x4f32,
pub zoom_factor: f32,
}
impl ShaderTileMetadata {
pub fn new(transform: Mat4x4f32) -> Self {
Self { transform }
pub fn new(transform: Mat4x4f32, zoom_factor: f32) -> Self {
Self {
transform,
zoom_factor,
}
}
}

View File

@ -23,10 +23,11 @@ fn main(
[[location(6)]] translate3: vec4<f32>,
[[location(7)]] translate4: vec4<f32>,
[[location(8)]] color: vec4<f32>,
[[location(9)]] zoom_factor: f32,
[[builtin(instance_index)]] instance_idx: u32 // instance_index is used when we have multiple instances of the same "object"
) -> VertexOutput {
let z = 0.0;
let width = 2.0;
let width = 3.0 * zoom_factor;
// The following code moves all "invisible" vertices to (0, 0, 0)
//if (color.w == 0.0) {