mirror of
https://github.com/maplibre/maplibre-rs.git
synced 2025-12-08 19:05:57 +00:00
Clean up tests and zoom handler
This commit is contained in:
parent
0b8d19c2c8
commit
0ea588ac2c
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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(
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user