fix: slightly jittery zoom level transitions

This commit is contained in:
Kae 2024-04-08 14:34:45 +10:00
parent 8a8a050159
commit ef3dc1c60e
2 changed files with 5 additions and 1 deletions

View File

@ -3,6 +3,7 @@
namespace Star {
void WorldCamera::setCenterWorldPosition(Vec2F const& position, bool force) {
m_rawWorldCenter = position;
// Only actually move the world center if a half pixel distance has been
// moved in any direction. This is sort of arbitrary, but helps prevent
// judder if the camera is at a boundary and floating point inaccuracy is

View File

@ -51,6 +51,7 @@ private:
float m_pixelRatio = 1.0f;
float m_targetPixelRatio = 1.0f;
Vec2F m_worldCenter;
Vec2F m_rawWorldCenter;
};
inline void WorldCamera::setScreenSize(Vec2U screenSize) {
@ -122,9 +123,11 @@ inline Vec2F WorldCamera::tileMinScreen() const {
inline void WorldCamera::update(float dt) {
float newPixelRatio = lerp(exp(-20.0f * dt), m_targetPixelRatio, m_pixelRatio);
if (abs(newPixelRatio - m_targetPixelRatio) < 0.0125f)
newPixelRatio = m_targetPixelRatio;
if (m_pixelRatio != newPixelRatio) {
m_pixelRatio = newPixelRatio;
setCenterWorldPosition(m_worldCenter, true);
setCenterWorldPosition(m_rawWorldCenter, true);
}
}