Flutter Impeller
impeller::scene::AnimationPlayer Class Referencefinal

#include <animation_player.h>

Public Member Functions

 AnimationPlayer ()
 
 ~AnimationPlayer ()
 
 AnimationPlayer (AnimationPlayer &&)
 
AnimationPlayeroperator= (AnimationPlayer &&)
 
AnimationClipAddAnimation (const std::shared_ptr< Animation > &animation, Node *bind_target)
 
AnimationClipGetClip (const std::string &name) const
 
void Update ()
 Advanced all clips and updates animated properties in the scene. More...
 

Detailed Description

Definition at line 26 of file animation_player.h.

Constructor & Destructor Documentation

◆ AnimationPlayer() [1/2]

impeller::scene::AnimationPlayer::AnimationPlayer ( )
default

◆ ~AnimationPlayer()

impeller::scene::AnimationPlayer::~AnimationPlayer ( )
default

◆ AnimationPlayer() [2/2]

impeller::scene::AnimationPlayer::AnimationPlayer ( AnimationPlayer &&  )
default

Member Function Documentation

◆ AddAnimation()

AnimationClip * impeller::scene::AnimationPlayer::AddAnimation ( const std::shared_ptr< Animation > &  animation,
Node bind_target 
)

Definition at line 23 of file animation_player.cc.

25  {
26  if (!animation) {
27  VALIDATION_LOG << "Cannot add null animation.";
28  return nullptr;
29  }
30 
31  AnimationClip clip(animation, bind_target);
32 
33  // Record all of the unique default transforms that this AnimationClip
34  // will mutate.
35  for (const auto& binding : clip.bindings_) {
36  auto decomp = binding.node->GetLocalTransform().Decompose();
37  if (!decomp.has_value()) {
38  continue;
39  }
40  target_transforms_.insert(
41  {binding.node, AnimationTransforms{.bind_pose = decomp.value()}});
42  }
43 
44  auto result = clips_.insert({animation->GetName(), std::move(clip)});
45  return &result.first->second;
46 }

References impeller::scene::AnimationTransforms::bind_pose, and VALIDATION_LOG.

◆ GetClip()

AnimationClip * impeller::scene::AnimationPlayer::GetClip ( const std::string &  name) const

Definition at line 48 of file animation_player.cc.

48  {
49  auto result = clips_.find(name);
50  if (result == clips_.end()) {
51  return nullptr;
52  }
53  return const_cast<AnimationClip*>(&result->second);
54 }

◆ operator=()

AnimationPlayer & impeller::scene::AnimationPlayer::operator= ( AnimationPlayer &&  )
default

◆ Update()

void impeller::scene::AnimationPlayer::Update ( )

Advanced all clips and updates animated properties in the scene.

Definition at line 56 of file animation_player.cc.

56  {
57  if (!previous_time_.has_value()) {
58  previous_time_ = Clock::now();
59  }
60  auto new_time = Clock::now();
61  auto delta_time = new_time - previous_time_.value();
62  previous_time_ = new_time;
63 
64  // Reset the animated pose state.
65  for (auto& [node, transforms] : target_transforms_) {
66  transforms.animated_pose = transforms.bind_pose;
67  }
68 
69  // Compute a weight multiplier for normalizing the animation.
70  Scalar total_weight = 0;
71  for (auto& [_, clip] : clips_) {
72  total_weight += clip.GetWeight();
73  }
74  Scalar weight_multiplier = total_weight > 1 ? 1 / total_weight : 1;
75 
76  // Update and apply all clips to the animation pose state.
77  for (auto& [_, clip] : clips_) {
78  clip.Advance(delta_time);
79  clip.ApplyToBindings(target_transforms_, weight_multiplier);
80  }
81 
82  // Apply the animated pose to the bound joints.
83  for (auto& [node, transforms] : target_transforms_) {
84  node->SetLocalTransform(Matrix(transforms.animated_pose));
85  }
86 }

The documentation for this class was generated from the following files:
impeller::Scalar
float Scalar
Definition: scalar.h:18
VALIDATION_LOG
#define VALIDATION_LOG
Definition: validation.h:73