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 
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 
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: {
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 
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 
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_blur_unittests.cc:20
impeller::scene::Animation::BindKey::property
Property property
Definition: animation.h:40
impeller::Vector3
Definition: vector.h:20
impeller::scene::Animation
Definition: animation.h:26