Clean up tests and zoom handler

This commit is contained in:
Maximilian Ammann 2022-02-26 15:48:31 +01:00
parent 0b8d19c2c8
commit 0ea588ac2c
3 changed files with 32 additions and 71 deletions

View File

@ -189,27 +189,29 @@ impl WorldCoords {
pub fn transform_matrix(&self, zoom: f64) -> Matrix4<f64> {
const TILE_SIZE: f64 = 512.0;
let world_size = TILE_SIZE * Self::tiles_at_zoom(zoom);
let world_size = Self::tiles_at_zoom(zoom);
let wrap = 0.0; // how often did we wrap the world around in x direction?
/*
For tile.z = zoom:
=> scale = 512
=> scale = 1
If tile.z < zoom:
=> scale > 512
=> scale > 1
If tile.z > zoom:
=> scale < 512
=> scale < 1
*/
let tile_scale = world_size / Self::tiles_at_zoom(self.z); // z, x and z are tile coordinates
let tile_scale = world_size / Self::tiles_at_zoom(self.z);
let unwrapped_x = self.x + Self::tiles_at_zoom(self.z) * wrap;
let translate = Matrix4::from_translation(Vector3::new(
unwrapped_x * tile_scale,
self.y * tile_scale,
unwrapped_x * TILE_SIZE * tile_scale,
self.y * TILE_SIZE * tile_scale,
0.0,
));
translate * Matrix4::from_nonuniform_scale(tile_scale / EXTENT, tile_scale / EXTENT, 1.0)
// Divide by EXTENT to normalize tile to 1x1 square
// Divide by EXTENT to normalize tile to 512x512 square
let normalize = Matrix4::from_nonuniform_scale(TILE_SIZE / EXTENT, TILE_SIZE / EXTENT, 1.0);
let scale = Matrix4::from_nonuniform_scale(tile_scale, tile_scale, 1.0);
translate * normalize * scale
}
}
@ -254,46 +256,11 @@ mod tests {
use crate::coords::{WorldCoords, WorldTileCoords, EXTENT};
use cgmath::{Vector3, Vector4, Zero};
#[test]
fn world_coords_tests() {
let top_left = Vector4::new(0.0, 0.0, 0.0, 1.0);
let bottom_right = Vector4::new(EXTENT, EXTENT, 0.0, 1.0);
const top_left: Vector4<f64> = Vector4::new(0.0, 0.0, 0.0, 1.0);
const bottom_right: Vector4<f64> = Vector4::new(EXTENT, EXTENT, 0.0, 1.0);
let zoom = 0.0;
let tile = WorldTileCoords::from((0, 0, 0));
let p1 = tile.into_world(EXTENT).transform_matrix(zoom) * top_left;
let p2 = tile.into_world(EXTENT).transform_matrix(zoom) * bottom_right;
println!("{:?}\n{:?}", p1, p2);
assert_eq!(
WorldCoords::from((p1.x, p1.y, 0.0)).into_world_tile(zoom),
tile
);
let zoom = 1.0;
let tile = WorldTileCoords::from((1, 0, 1));
let p1 = tile.into_world(EXTENT).transform_matrix(zoom) * top_left;
let p2 = tile.into_world(EXTENT).transform_matrix(zoom) * bottom_right;
println!("{:?}\n{:?}", p1, p2);
assert_eq!(
WorldCoords::from((p1.x, p1.y, 0.0)).into_world_tile(zoom),
tile
);
let tile = WorldTileCoords::from((67, 42, 7));
let zoom = 7.0;
let p1 = tile.into_world(EXTENT).transform_matrix(zoom) * top_left;
let p2 = tile.into_world(EXTENT).transform_matrix(zoom) * bottom_right;
println!("{:?}\n{:?}", p1, p2);
assert_eq!(
WorldCoords::from((p1.x, p1.y, 0.0)).into_world_tile(zoom),
tile
);
let tile = WorldTileCoords::from((17421, 11360, 15));
let zoom = 15.0;
fn to_from_world(tile: (i32, i32, u8), zoom: f64) {
let tile = WorldTileCoords::from(tile);
let p1 = tile.into_world(EXTENT).transform_matrix(zoom) * top_left;
let p2 = tile.into_world(EXTENT).transform_matrix(zoom) * bottom_right;
println!("{:?}\n{:?}", p1, p2);
@ -303,4 +270,11 @@ mod tests {
tile
);
}
#[test]
fn world_coords_tests() {
to_from_world((1, 0, 1), 1.0);
to_from_world((67, 42, 7), 7.0);
to_from_world((17421, 11360, 15), 15.0);
}
}

View File

@ -36,23 +36,12 @@ impl UpdateState for ZoomHandler {
.camera
.window_to_world_z0(&window_position, &view_proj)
{
let scale1 = 2.0.pow(next_zoom - current_zoom);
println!("{scale1:?}");
let scale = 2.0.pow(next_zoom - current_zoom);
let current_center = state.camera.position.to_vec();
let new_center = window_position_world;
//state.camera.position += Matrix4::from_nonuniform_scale(scale1, scale1, 1.0) * current_center;
/*state.camera.position = Point3::new(
new_center.x * scale1,
new_center.y * scale1,
current_center.z,
);*/
let scale1 = 2.0.pow(current_zoom - next_zoom);
state.camera.position += Vector3::new(
(new_center.x - new_center.x * scale1),
(new_center.y - new_center.y * scale1),
0.0,
state.camera.position = Point3::new(
window_position_world.x * scale,
window_position_world.y * scale,
state.camera.position.z,
);
}
}

View File

@ -408,16 +408,15 @@ impl RenderState {
})
.collect::<Vec<_>>();
let transform = world_coords
.into_world(EXTENT)
.transform_matrix(self.zoom)
.cast()
.unwrap();
let view_proj = self.camera.calc_view_proj(&self.perspective);
let transform = view_proj * world_coords.into_world(EXTENT).transform_matrix(self.zoom);
let low_precision_transform = transform.cast().unwrap();
self.buffer_pool.allocate_geometry(
&self.queue,
layer.coords,
&layer.buffer,
ShaderTileMetadata::new(transform.into()),
ShaderTileMetadata::new(low_precision_transform.into()),
&feature_metadata,
);
}
@ -426,7 +425,6 @@ impl RenderState {
let world_coords = entry.coords.into_world_tile();
let view_proj = self.camera.calc_view_proj(&self.perspective);
let transform = view_proj * world_coords.into_world(EXTENT).transform_matrix(self.zoom);
let low_precision_transform = transform.cast().unwrap();
self.buffer_pool.update_tile_metadata(