mirror of
https://github.com/maplibre/maplibre-rs.git
synced 2025-12-08 19:05:57 +00:00
Recalculate perspective only on resize
This commit is contained in:
parent
f15e35af54
commit
68fda5406d
@ -1,7 +1,6 @@
|
|||||||
use cgmath::prelude::*;
|
use cgmath::prelude::*;
|
||||||
use cgmath::{AbsDiffEq, Matrix4, Point2, Point3, Vector2, Vector3, Vector4};
|
use cgmath::{AbsDiffEq, Matrix4, Point2, Point3, Vector2, Vector3, Vector4};
|
||||||
|
|
||||||
|
|
||||||
use crate::util::math::{bounds_from_points, Aabb2, Aabb3, Plane};
|
use crate::util::math::{bounds_from_points, Aabb2, Aabb3, Plane};
|
||||||
use crate::util::SignificantlyDifferent;
|
use crate::util::SignificantlyDifferent;
|
||||||
|
|
||||||
@ -120,7 +119,7 @@ impl Camera {
|
|||||||
|
|
||||||
#[tracing::instrument(skip_all)]
|
#[tracing::instrument(skip_all)]
|
||||||
pub fn calc_view_proj(&self, perspective: &Perspective) -> ViewProjection {
|
pub fn calc_view_proj(&self, perspective: &Perspective) -> ViewProjection {
|
||||||
ViewProjection(FLIP_Y * perspective.calc_matrix() * self.calc_matrix())
|
ViewProjection(FLIP_Y * perspective.current_projection * self.calc_matrix())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A transform which can be used to transfrom between clip and window space.
|
/// A transform which can be used to transfrom between clip and window space.
|
||||||
@ -351,10 +350,11 @@ impl Camera {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct Perspective {
|
pub struct Perspective {
|
||||||
aspect: f64,
|
|
||||||
fovy: cgmath::Rad<f64>,
|
fovy: cgmath::Rad<f64>,
|
||||||
znear: f64,
|
znear: f64,
|
||||||
zfar: f64,
|
zfar: f64,
|
||||||
|
|
||||||
|
current_projection: cgmath::Matrix4<f64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Perspective {
|
impl Perspective {
|
||||||
@ -365,28 +365,40 @@ impl Perspective {
|
|||||||
znear: f64,
|
znear: f64,
|
||||||
zfar: f64,
|
zfar: f64,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
|
let rad = fovy.into();
|
||||||
Self {
|
Self {
|
||||||
aspect: width as f64 / height as f64,
|
current_projection: Self::calc_matrix(width as f64 / height as f64, rad, znear, zfar),
|
||||||
fovy: fovy.into(),
|
fovy: rad,
|
||||||
znear,
|
znear,
|
||||||
zfar,
|
zfar,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn resize(&mut self, width: u32, height: u32) {
|
pub fn resize(&mut self, width: u32, height: u32) {
|
||||||
self.aspect = width as f64 / height as f64;
|
self.current_projection = Self::calc_matrix(
|
||||||
|
width as f64 / height as f64,
|
||||||
|
self.fovy,
|
||||||
|
self.znear,
|
||||||
|
self.zfar,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn calc_matrix(&self) -> cgmath::Matrix4<f64> {
|
fn calc_matrix(
|
||||||
OPENGL_TO_WGPU_MATRIX * cgmath::perspective(self.fovy, self.aspect, self.znear, self.zfar)
|
aspect: f64,
|
||||||
|
fovy: cgmath::Rad<f64>,
|
||||||
|
znear: f64,
|
||||||
|
zfar: f64,
|
||||||
|
) -> cgmath::Matrix4<f64> {
|
||||||
|
OPENGL_TO_WGPU_MATRIX * cgmath::perspective(fovy, aspect, znear, zfar)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::render::camera::{InvertedViewProjection, ViewProjection};
|
|
||||||
use cgmath::{AbsDiffEq, Vector2, Vector3, Vector4};
|
use cgmath::{AbsDiffEq, Vector2, Vector3, Vector4};
|
||||||
|
|
||||||
|
use crate::render::camera::{InvertedViewProjection, ViewProjection};
|
||||||
|
|
||||||
use super::{Camera, Perspective};
|
use super::{Camera, Perspective};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user