Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
animation.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
7#include <algorithm>
8#include <cstring>
9#include <memory>
10#include <vector>
11
13#include "impeller/scene/importer/scene_flatbuffers.h"
14#include "impeller/scene/node.h"
15
16namespace impeller {
17namespace scene {
18
19std::shared_ptr<Animation> Animation::MakeFromFlatbuffer(
20 const fb::Animation& animation,
21 const std::vector<std::shared_ptr<Node>>& scene_nodes) {
22 auto result = std::shared_ptr<Animation>(new Animation());
23
24 result->name_ = animation.name()->str();
25 for (auto channel : *animation.channels()) {
26 if (channel->node() < 0 ||
27 static_cast<size_t>(channel->node()) >= scene_nodes.size() ||
28 !channel->timeline()) {
29 continue;
30 }
31
32 Animation::Channel out_channel;
33 out_channel.bind_target.node_name = scene_nodes[channel->node()]->GetName();
34
35 auto* times = channel->timeline();
36 std::vector<Scalar> out_times;
37 out_times.resize(channel->timeline()->size());
38 std::copy(times->begin(), times->end(), out_times.begin());
39
40 // TODO(bdero): Why are the entries in the keyframe value arrays not
41 // contiguous in the flatbuffer? We should be able to get rid
42 // of the subloops below and just memcpy instead.
43 switch (channel->keyframes_type()) {
44 case fb::Keyframes::TranslationKeyframes: {
46 auto* keyframes = channel->keyframes_as_TranslationKeyframes();
47 if (!keyframes->values()) {
48 continue;
49 }
50 std::vector<Vector3> out_values;
51 out_values.resize(keyframes->values()->size());
52 for (size_t value_i = 0; value_i < keyframes->values()->size();
53 value_i++) {
54 auto val = (*keyframes->values())[value_i];
55 out_values[value_i] = Vector3(val->x(), val->y(), val->z());
56 }
58 std::move(out_times), std::move(out_values));
59 break;
60 }
61 case fb::Keyframes::RotationKeyframes: {
63 auto* keyframes = channel->keyframes_as_RotationKeyframes();
64 if (!keyframes->values()) {
65 continue;
66 }
67 std::vector<Quaternion> out_values;
68 out_values.resize(keyframes->values()->size());
69 for (size_t value_i = 0; value_i < keyframes->values()->size();
70 value_i++) {
71 auto val = (*keyframes->values())[value_i];
72 out_values[value_i] =
73 Quaternion(val->x(), val->y(), val->z(), val->w());
74 }
76 std::move(out_times), std::move(out_values));
77 break;
78 }
79 case fb::Keyframes::ScaleKeyframes: {
81 auto* keyframes = channel->keyframes_as_ScaleKeyframes();
82 if (!keyframes->values()) {
83 continue;
84 }
85 std::vector<Vector3> out_values;
86 out_values.resize(keyframes->values()->size());
87 for (size_t value_i = 0; value_i < keyframes->values()->size();
88 value_i++) {
89 auto val = (*keyframes->values())[value_i];
90 out_values[value_i] = Vector3(val->x(), val->y(), val->z());
91 }
93 std::move(out_times), std::move(out_values));
94 break;
95 }
96 case fb::Keyframes::NONE:
97 continue;
98 }
99
100 result->end_time_ =
101 std::max(result->end_time_, out_channel.resolver->GetEndTime());
102 result->channels_.push_back(std::move(out_channel));
103 }
104
105 return result;
106}
107
108Animation::Animation() = default;
109
110Animation::~Animation() = default;
111
112const std::string& Animation::GetName() const {
113 return name_;
114}
115
116const std::vector<Animation::Channel>& Animation::GetChannels() const {
117 return channels_;
118}
119
121 return end_time_;
122}
123
124} // namespace scene
125} // namespace impeller
static SkISize times(const SkISize &size, float factor)
SecondsF GetEndTime() const
Definition animation.cc:120
const std::vector< Channel > & GetChannels() const
Definition animation.cc:116
static std::shared_ptr< Animation > MakeFromFlatbuffer(const fb::Animation &animation, const std::vector< std::shared_ptr< Node > > &scene_nodes)
Definition animation.cc:19
const std::string & GetName() const
Definition animation.cc:112
static std::unique_ptr< RotationTimelineResolver > MakeRotationTimeline(std::vector< Scalar > times, std::vector< Quaternion > values)
static std::unique_ptr< ScaleTimelineResolver > MakeScaleTimeline(std::vector< Scalar > times, std::vector< Vector3 > values)
static std::unique_ptr< TranslationTimelineResolver > MakeTranslationTimeline(std::vector< Scalar > times, std::vector< Vector3 > values)
GAsyncResult * result
std::chrono::duration< float > SecondsF
Definition timing.h:13
std::unique_ptr< PropertyResolver > resolver
Definition animation.h:57