mirror of
https://github.com/maplibre/maplibre-rs.git
synced 2025-12-08 19:05:57 +00:00
Add trait SignificantlyDifferent
This commit is contained in:
parent
192297f286
commit
1a5440822e
@ -10,6 +10,7 @@ use cgmath::{AbsDiffEq, Matrix4, Point3, Vector3};
|
|||||||
use style_spec::source::TileAddressingScheme;
|
use style_spec::source::TileAddressingScheme;
|
||||||
|
|
||||||
use crate::util::math::{div_floor, Aabb2};
|
use crate::util::math::{div_floor, Aabb2};
|
||||||
|
use crate::util::SignificantlyDifferent;
|
||||||
|
|
||||||
pub const EXTENT_UINT: u32 = 4096;
|
pub const EXTENT_UINT: u32 = 4096;
|
||||||
pub const EXTENT_SINT: i32 = EXTENT_UINT as i32;
|
pub const EXTENT_SINT: i32 = EXTENT_UINT as i32;
|
||||||
@ -96,10 +97,11 @@ impl Zoom {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Eq for Zoom {}
|
impl SignificantlyDifferent for Zoom {
|
||||||
impl PartialEq for Zoom {
|
type Epsilon = f64;
|
||||||
fn eq(&self, other: &Self) -> bool {
|
|
||||||
self.0.abs_diff_eq(&other.0, 0.05)
|
fn ne(&self, other: &Self, epsilon: Self::Epsilon) -> bool {
|
||||||
|
self.0.abs_diff_eq(&other.0, epsilon)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,7 @@ use cgmath::{AbsDiffEq, Matrix4, Point2, Point3, Vector2, Vector3, Vector4};
|
|||||||
|
|
||||||
use crate::render::shaders::ShaderCamera;
|
use crate::render::shaders::ShaderCamera;
|
||||||
use crate::util::math::{bounds_from_points, Aabb2, Aabb3, Plane};
|
use crate::util::math::{bounds_from_points, Aabb2, Aabb3, Plane};
|
||||||
|
use crate::util::SignificantlyDifferent;
|
||||||
|
|
||||||
#[rustfmt::skip]
|
#[rustfmt::skip]
|
||||||
pub const OPENGL_TO_WGPU_MATRIX: cgmath::Matrix4<f64> = cgmath::Matrix4::new(
|
pub const OPENGL_TO_WGPU_MATRIX: cgmath::Matrix4<f64> = cgmath::Matrix4::new(
|
||||||
@ -73,12 +74,13 @@ pub struct Camera {
|
|||||||
pub height: f64,
|
pub height: f64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Eq for Camera {}
|
impl SignificantlyDifferent for Camera {
|
||||||
impl PartialEq for Camera {
|
type Epsilon = f64;
|
||||||
fn eq(&self, other: &Self) -> bool {
|
|
||||||
self.position.abs_diff_eq(&other.position, 0.05)
|
fn ne(&self, other: &Self, epsilon: Self::Epsilon) -> bool {
|
||||||
&& self.yaw.abs_diff_eq(&other.yaw, 0.05)
|
self.position.abs_diff_ne(&other.position, epsilon)
|
||||||
&& self.pitch.abs_diff_eq(&other.pitch, 0.05)
|
|| self.yaw.abs_diff_ne(&other.yaw, epsilon)
|
||||||
|
|| self.pitch.abs_diff_ne(&other.pitch, epsilon)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -581,7 +581,7 @@ impl RenderState {
|
|||||||
// TODO: Could we draw inspiration from StagingBelt (https://docs.rs/wgpu/latest/wgpu/util/struct.StagingBelt.html)?
|
// TODO: Could we draw inspiration from StagingBelt (https://docs.rs/wgpu/latest/wgpu/util/struct.StagingBelt.html)?
|
||||||
// TODO: What is StagingBelt for?
|
// TODO: What is StagingBelt for?
|
||||||
|
|
||||||
if self.camera.did_change() || self.zoom.did_change() || self.try_failed {
|
if self.camera.did_change(0.05) || self.zoom.did_change(0.05) || self.try_failed {
|
||||||
if let Some(view_region) = &view_region {
|
if let Some(view_region) = &view_region {
|
||||||
// FIXME: We also need to request tiles from layers above if we are over the maximum zoom level
|
// FIXME: We also need to request tiles from layers above if we are over the maximum zoom level
|
||||||
self.try_failed = self.request_tiles_in_view(view_region, scheduler);
|
self.try_failed = self.request_tiles_in_view(view_region, scheduler);
|
||||||
@ -597,8 +597,8 @@ impl RenderState {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.camera.finished_observing();
|
self.camera.update_reference();
|
||||||
self.zoom.finished_observing();
|
self.zoom.update_reference();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tracing::instrument(skip_all)]
|
#[tracing::instrument(skip_all)]
|
||||||
|
|||||||
@ -51,31 +51,39 @@ impl MinMaxBoundingBox {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait SignificantlyDifferent<Rhs: ?Sized = Self> {
|
||||||
|
type Epsilon;
|
||||||
|
|
||||||
|
/// This method tests for `self` and `other` values to be significantly different
|
||||||
|
#[must_use]
|
||||||
|
fn ne(&self, other: &Rhs, epsilon: Self::Epsilon) -> bool;
|
||||||
|
}
|
||||||
|
|
||||||
pub struct ChangeObserver<T> {
|
pub struct ChangeObserver<T> {
|
||||||
inner: T,
|
inner: T,
|
||||||
last_value: Option<T>,
|
reference_value: Option<T>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> ChangeObserver<T> {
|
impl<T> ChangeObserver<T> {
|
||||||
pub fn new(value: T) -> Self {
|
pub fn new(value: T) -> Self {
|
||||||
Self {
|
Self {
|
||||||
inner: value,
|
inner: value,
|
||||||
last_value: None,
|
reference_value: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> ChangeObserver<T>
|
impl<T> ChangeObserver<T>
|
||||||
where
|
where
|
||||||
T: Clone + Eq,
|
T: Clone + SignificantlyDifferent,
|
||||||
{
|
{
|
||||||
pub fn finished_observing(&mut self) {
|
pub fn update_reference(&mut self) {
|
||||||
self.last_value = Some(self.inner.clone());
|
self.reference_value = Some(self.inner.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn did_change(&self) -> bool {
|
pub fn did_change(&self, epsilon: T::Epsilon) -> bool {
|
||||||
if let Some(last_value) = &self.last_value {
|
if let Some(reference_value) = &self.reference_value {
|
||||||
if !last_value.eq(&self.inner) {
|
if reference_value.ne(&self.inner, epsilon) {
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user