18 std::unique_ptr<TranslationTimelineResolver>
20 std::vector<Vector3> values) {
21 FML_DCHECK(times.size() == values.size());
22 auto result = std::unique_ptr<TranslationTimelineResolver>(
24 result->times_ = std::move(times);
25 result->values_ = std::move(values);
29 std::unique_ptr<RotationTimelineResolver>
31 std::vector<Quaternion> values) {
32 FML_DCHECK(times.size() == values.size());
35 result->times_ = std::move(times);
36 result->values_ = std::move(values);
41 std::vector<Scalar> times,
42 std::vector<Vector3> values) {
43 FML_DCHECK(times.size() == values.size());
46 result->times_ = std::move(times);
47 result->values_ = std::move(values);
57 return SecondsF::zero();
63 if (
times_.size() <= 1 || time.count() <=
times_.front()) {
64 return {.
index = 0, .lerp = 1};
66 if (time.count() >=
times_.back()) {
67 return {.index =
times_.size() - 1, .lerp = 1};
69 auto it = std::lower_bound(
times_.begin(),
times_.end(), time.count());
72 Scalar previous_time = *(it - 1);
74 return {.index = index,
75 .lerp = (time.count() - previous_time) / (next_time - previous_time)};
78 TranslationTimelineResolver::TranslationTimelineResolver() =
default;
85 if (values_.empty()) {
89 auto value = values_[key.index];
91 value = values_[key.index - 1].Lerp(value, key.lerp);
98 RotationTimelineResolver::RotationTimelineResolver() =
default;
105 if (values_.empty()) {
109 auto value = values_[key.index];
111 value = values_[key.index - 1].Slerp(value, key.lerp);
119 ScaleTimelineResolver::ScaleTimelineResolver() =
default;
126 if (values_.empty()) {
130 auto value = values_[key.index];
132 value = values_[key.index - 1].Lerp(value, key.lerp);