Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

[core] Fix calculation of delayed transitions #7756

Merged
merged 1 commit into from
Jan 17, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cmake/test-files.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ set(MBGL_TEST_FILES
test/src/mbgl/test/stub_file_source.hpp
test/src/mbgl/test/stub_layer_observer.hpp
test/src/mbgl/test/stub_style_observer.hpp
test/src/mbgl/test/stub_tile_observer.hpp
test/src/mbgl/test/test.cpp
test/src/mbgl/test/util.cpp
test/src/mbgl/test/util.hpp
Expand All @@ -80,6 +81,7 @@ set(MBGL_TEST_FILES
test/style/filter.test.cpp
test/style/functions.test.cpp
test/style/group_by_layout.test.cpp
test/style/paint_property.test.cpp
test/style/source.test.cpp
test/style/style.test.cpp
test/style/style_layer.test.cpp
Expand Down
3 changes: 3 additions & 0 deletions src/mbgl/style/paint_property.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ class UnevaluatedPaintProperty {
// Transition from prior value is now complete.
prior = {};
return finalValue;
} else if (parameters.now < begin) {
// Transition hasn't started yet.
return prior->get().evaluate(parameters, defaultValue);
} else {
// Interpolate between recursively-calculated prior value and final.
float t = std::chrono::duration<float>(parameters.now - begin) / (end - begin);
Expand Down
94 changes: 94 additions & 0 deletions test/style/paint_property.test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
#include <mbgl/test/util.hpp>

#include <mbgl/style/paint_property.hpp>

using namespace mbgl;
using namespace mbgl::style;
using namespace std::literals::chrono_literals;

TEST(UnevaluatedPaintProperty, EvaluateDefaultValue) {
UnevaluatedPaintProperty<float, PropertyEvaluator<float>> property;
ASSERT_EQ(0.0f, property.evaluate(PropertyEvaluationParameters(0), 0.0f));
}

TEST(UnevaluatedPaintProperty, EvaluateUntransitionedConstant) {
UnevaluatedPaintProperty<float, PropertyEvaluator<float>> property {
PropertyValue<float>(1.0f),
UnevaluatedPaintProperty<float, PropertyEvaluator<float>>(),
TransitionOptions(),
TimePoint::min()
};

ASSERT_EQ(1.0f, property.evaluate(PropertyEvaluationParameters(0), 0.0f));
}

TEST(UnevaluatedPaintProperty, EvaluateTransitionedConstantWithoutDelay) {
TransitionOptions transition;
transition.duration = { 1000ms };

UnevaluatedPaintProperty<float, PropertyEvaluator<float>> t0 {
PropertyValue<float>(0.0f),
UnevaluatedPaintProperty<float, PropertyEvaluator<float>>(),
TransitionOptions(),
TimePoint::min()
};

UnevaluatedPaintProperty<float, PropertyEvaluator<float>> t1 {
PropertyValue<float>(1.0f),
t0,
transition,
TimePoint::min()
};

auto evaluate = [&] (Duration delta) {
PropertyEvaluationParameters parameters {
0,
TimePoint::min() + delta,
ZoomHistory(),
Duration::zero()
};

return t1.evaluate(parameters, 0.0f);
};

ASSERT_FLOAT_EQ(0.0f, evaluate(0ms));
ASSERT_FLOAT_EQ(0.823099f, evaluate(500ms));
ASSERT_FLOAT_EQ(1.0f, evaluate(1500ms));
}

TEST(UnevaluatedPaintProperty, EvaluateTransitionedConstantWithDelay) {
TransitionOptions transition;
transition.delay = { 1000ms };
transition.duration = { 1000ms };

UnevaluatedPaintProperty<float, PropertyEvaluator<float>> t0 {
PropertyValue<float>(0.0f),
UnevaluatedPaintProperty<float, PropertyEvaluator<float>>(),
TransitionOptions(),
TimePoint::min()
};

UnevaluatedPaintProperty<float, PropertyEvaluator<float>> t1 {
PropertyValue<float>(1.0f),
t0,
transition,
TimePoint::min()
};

auto evaluate = [&] (Duration delta) {
PropertyEvaluationParameters parameters {
0,
TimePoint::min() + delta,
ZoomHistory(),
Duration::zero()
};

return t1.evaluate(parameters, 0.0f);
};

ASSERT_FLOAT_EQ(0.0f, evaluate(0ms));
ASSERT_FLOAT_EQ(0.0f, evaluate(500ms));
ASSERT_FLOAT_EQ(0.0f, evaluate(612ms));
ASSERT_FLOAT_EQ(0.823099f, evaluate(1500ms));
ASSERT_FLOAT_EQ(1.0f, evaluate(2500ms));
}