1#include "Library/KeyPose/KeyPoseKeeper.h"
2
3#include "Library/Placement/PlacementFunction.h"
4#include "Library/Placement/PlacementInfo.h"
5#include "Project/Joint/KeyPose.h"
6
7namespace al {
8KeyPoseKeeper::KeyPoseKeeper() {}
9
10void KeyPoseKeeper::init(const PlacementInfo& info) {
11 mKeyPoseCount = calcLinkNestNum(placementInfo: info, linkName: "KeyMoveNext") + 1;
12 tryGetArg(arg: (s32*)&mMoveType, placementInfo: info, key: "MoveType");
13 mKeyPoses = new KeyPose[mKeyPoseCount];
14
15 mKeyPoses[0].init(info);
16
17 PlacementInfo currentInfo = info;
18 PlacementInfo nextInfo;
19 for (s32 i = 0; i < mKeyPoseCount - 1; i++) {
20 getLinksInfo(linkPlacementInfo: &nextInfo, placementInfo: currentInfo, linkName: "KeyMoveNext");
21 mKeyPoses[i + 1].init(info: nextInfo);
22 currentInfo = nextInfo;
23 }
24}
25
26const KeyPose& KeyPoseKeeper::getKeyPose(s32 idx) const {
27 return mKeyPoses[idx];
28}
29
30const KeyPose& KeyPoseKeeper::getCurrentKeyPose() const {
31 return mKeyPoses[mKeyPoseCurrentIdx];
32}
33
34const KeyPose& KeyPoseKeeper::getNextKeyPose() const {
35 return mKeyPoses[calcNextPoseIndex()];
36}
37
38s32 KeyPoseKeeper::calcNextPoseIndex() const {
39 if (!mIsGoingToEnd) {
40 if (mKeyPoseCurrentIdx - 1 < 0)
41 return mKeyPoseCount - 1;
42
43 return mKeyPoseCurrentIdx - 1;
44 } else {
45 if (mKeyPoseCurrentIdx + 1 >= mKeyPoseCount)
46 return 0;
47
48 return mKeyPoseCurrentIdx + 1;
49 }
50}
51
52void KeyPoseKeeper::reset() {
53 mKeyPoseCurrentIdx = 0;
54 mIsGoingToEnd = true;
55 mIsStop = false;
56 mIsRestart = false;
57}
58
59void KeyPoseKeeper::next() {
60 mKeyPoseCurrentIdx = calcNextPoseIndex();
61
62 switch (mMoveType) {
63 case MoveType::Turn:
64 if (isLastKey())
65 mIsGoingToEnd = !mIsGoingToEnd;
66
67 break;
68 case MoveType::Stop:
69 if (isLastKey())
70 mIsStop = true;
71
72 break;
73 case MoveType::Restart:
74 if (isLastKey())
75 mIsRestart = true;
76
77 break;
78 default:
79 break;
80 }
81}
82
83bool KeyPoseKeeper::isLastKey() const {
84 return mIsGoingToEnd ? mKeyPoseCurrentIdx + 1 >= mKeyPoseCount : mKeyPoseCurrentIdx < 1;
85}
86
87void KeyPoseKeeper::reverse() {
88 mIsGoingToEnd = !mIsGoingToEnd;
89
90 if (mMoveType == MoveType::Stop)
91 mIsStop = isLastKey();
92}
93
94bool KeyPoseKeeper::isFirstKey() const {
95 return mKeyPoseCurrentIdx == 0;
96}
97
98void KeyPoseKeeper::setMoveTypeLoop() {
99 mMoveType = MoveType::Loop;
100}
101
102void KeyPoseKeeper::setMoveTypeTurn() {
103 mMoveType = MoveType::Turn;
104}
105
106void KeyPoseKeeper::setMoveTypeStop() {
107 mMoveType = MoveType::Stop;
108}
109
110void KeyPoseKeeper::setMoveTypeRestart() {
111 mMoveType = MoveType::Restart;
112}
113} // namespace al
114