fix: reseed particles after zoom out
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled

This commit is contained in:
tei
2026-09-23 10:05:01 +09:00
parent 297b912620
commit 4286c16a53
4 changed files with 179 additions and 3 deletions

View File

@@ -27,6 +27,7 @@ add_library(
${PROJECT_SOURCE_DIR}/test/plugin/plugin.test.cpp
${PROJECT_SOURCE_DIR}/test/renderer/image_manager.test.cpp
${PROJECT_SOURCE_DIR}/test/renderer/pattern_atlas.test.cpp
${PROJECT_SOURCE_DIR}/test/renderer/particle_viewport_reseed.test.cpp
${PROJECT_SOURCE_DIR}/test/renderer/retained_underlay_cache.test.cpp
${PROJECT_SOURCE_DIR}/test/renderer/shader_registry.test.cpp
$<$<BOOL:${MLN_WITH_WEBGPU}>:${PROJECT_SOURCE_DIR}/test/renderer/wgsl_preprocessor.test.cpp>

View File

@@ -0,0 +1,81 @@
#include <mbgl/renderer/particle_viewport_reseed.hpp>
#include <gtest/gtest.h>
using namespace mbgl;
TEST(ParticleViewportReseed, ZoomOutBeyondEpsilonReseedsOnce) {
ParticleViewportReseedGesture gesture;
gesture.begin(10.0);
const auto decision = gesture.finish(8.0, true);
EXPECT_EQ(decision.action, ParticleViewportReseedAction::Reseed);
EXPECT_DOUBLE_EQ(decision.startZoom, 10.0);
EXPECT_DOUBLE_EQ(decision.endZoom, 8.0);
EXPECT_FALSE(gesture.isActive());
EXPECT_EQ(gesture.finish(7.0, true).action, ParticleViewportReseedAction::None);
}
TEST(ParticleViewportReseed, ZoomInDoesNotReseed) {
ParticleViewportReseedGesture gesture;
gesture.begin(8.0);
EXPECT_EQ(gesture.finish(10.0, true).action, ParticleViewportReseedAction::None);
EXPECT_FALSE(gesture.isActive());
}
TEST(ParticleViewportReseed, PanDoesNotReseed) {
ParticleViewportReseedGesture gesture;
gesture.begin(8.0);
EXPECT_EQ(gesture.finish(8.0, true).action, ParticleViewportReseedAction::None);
}
TEST(ParticleViewportReseed, RotateOrPitchWithoutZoomDecreaseDoesNotReseed) {
ParticleViewportReseedGesture gesture;
gesture.begin(8.0);
EXPECT_EQ(gesture.finish(8.01, true).action, ParticleViewportReseedAction::None);
}
TEST(ParticleViewportReseed, ZoomJitterWithinEpsilonDoesNotReseed) {
ParticleViewportReseedGesture gesture;
gesture.begin(8.0);
EXPECT_EQ(gesture.finish(8.0 - ParticleViewportReseedZoomEpsilon, true).action,
ParticleViewportReseedAction::None);
}
TEST(ParticleViewportReseed, InvalidDomainConsumesZoomOutRequest) {
ParticleViewportReseedGesture gesture;
gesture.begin(10.0);
const auto decision = gesture.finish(8.0, false);
EXPECT_EQ(decision.action, ParticleViewportReseedAction::SkipInvalidDomain);
EXPECT_FALSE(gesture.isActive());
EXPECT_EQ(gesture.finish(7.0, true).action, ParticleViewportReseedAction::None);
}
TEST(ParticleViewportReseed, ContinuousInvalidationKeepsFirstStartZoom) {
ParticleViewportReseedGesture gesture;
gesture.begin(10.0);
gesture.begin(9.0);
gesture.begin(8.0);
EXPECT_DOUBLE_EQ(gesture.getStartZoom(), 10.0);
const auto decision = gesture.finish(7.0, true);
EXPECT_DOUBLE_EQ(decision.startZoom, 10.0);
EXPECT_EQ(decision.action, ParticleViewportReseedAction::Reseed);
}
TEST(ParticleViewportReseed, NextGestureRefreshesStartZoom) {
ParticleViewportReseedGesture gesture;
gesture.begin(10.0);
EXPECT_EQ(gesture.finish(8.0, true).action, ParticleViewportReseedAction::Reseed);
gesture.begin(6.0);
EXPECT_DOUBLE_EQ(gesture.getStartZoom(), 6.0);
const auto decision = gesture.finish(5.0, true);
EXPECT_DOUBLE_EQ(decision.startZoom, 6.0);
EXPECT_EQ(decision.action, ParticleViewportReseedAction::Reseed);
}