| Flutter Impeller |

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
5 #include "impeller/scene/animation/animation.h"
6
7 #include <algorithm>
8 #include <cstring>
9 #include <memory>
10 #include <vector>
11
12 #include "impeller/geometry/quaternion.h"
13 #include "impeller/scene/importer/scene_flatbuffers.h"
14 #include "impeller/scene/node.h"
15
16 namespace impeller {
17 namespace scene {
18
19 std::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: {
45 out_channel.bind_target.property = Animation::Property::kTranslation;
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 }
57 out_channel.resolver = PropertyResolver::MakeTranslationTimeline(
58 std::move(out_times), std::move(out_values));
59 break;
60 }
61 case fb::Keyframes::RotationKeyframes: {
62 out_channel.bind_target.property = Animation::Property::kRotation;
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 }
75 out_channel.resolver = PropertyResolver::MakeRotationTimeline(
76 std::move(out_times), std::move(out_values));
77 break;
78 }
79 case fb::Keyframes::ScaleKeyframes: {
80 out_channel.bind_target.property = Animation::Property::kScale;
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 }
92 out_channel.resolver = PropertyResolver::MakeScaleTimeline(
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
108 Animation::Animation() = default;
109
110 Animation::~Animation() = default;
111
112 const std::string& Animation::GetName() const {
113 return name_;
114 }
115
116 const std::vector<Animation::Channel>& Animation::GetChannels() const {
117 return channels_;
118 }
119
120 SecondsF Animation::GetEndTime() const {
121 return end_time_;
122 }
123
124 } // namespace scene
125 } // namespace impeller
animation.h
impeller::scene::Animation::Channel::bind_target
BindKey bind_target
Definition: animation.h:56
impeller::scene::Animation::Channel
Definition: animation.h:55
impeller::scene::Animation::GetChannels
const std::vector< Channel > & GetChannels() const
Definition: animation.cc:116
quaternion.h
impeller::scene::PropertyResolver::MakeTranslationTimeline
static std::unique_ptr< TranslationTimelineResolver > MakeTranslationTimeline(std::vector< Scalar > times, std::vector< Vector3 > values)
Definition: property_resolver.cc:19
impeller::scene::Animation::MakeFromFlatbuffer
static std::shared_ptr< Animation > MakeFromFlatbuffer(const fb::Animation &animation, const std::vector< std::shared_ptr< Node >> &scene_nodes)
Definition: animation.cc:19
impeller::Quaternion
Definition: quaternion.h:14
impeller::SecondsF
std::chrono::duration< float > SecondsF
Definition: timing.h:13
impeller::scene::Animation::Property::kTranslation
@ kTranslation
node.h
impeller::scene::Animation::GetName
const std::string & GetName() const
Definition: animation.cc:112
impeller::scene::Animation::Channel::resolver
std::unique_ptr< PropertyResolver > resolver
Definition: animation.h:57
impeller::scene::Animation::Property::kScale
@ kScale
impeller::scene::PropertyResolver::MakeScaleTimeline
static std::unique_ptr< ScaleTimelineResolver > MakeScaleTimeline(std::vector< Scalar > times, std::vector< Vector3 > values)
Definition: property_resolver.cc:40
impeller::scene::PropertyResolver::MakeRotationTimeline
static std::unique_ptr< RotationTimelineResolver > MakeRotationTimeline(std::vector< Scalar > times, std::vector< Quaternion > values)
Definition: property_resolver.cc:30
impeller::scene::Animation::Property::kRotation
@ kRotation
impeller::scene::Animation::~Animation
~Animation()
impeller::scene::Animation::GetEndTime
SecondsF GetEndTime() const
Definition: animation.cc:120
impeller::scene::Animation::BindKey::node_name
std::string node_name
Definition: animation.h:39
impeller
Definition: aiks_context.cc:10
impeller::scene::Animation::BindKey::property
Property property
Definition: animation.h:40
impeller::Vector3
Definition: vector.h:20
impeller::scene::Animation
Definition: animation.h:26