1#include "Project/Joint/RollingCubePoseKeeper.h"
2
3#include "Library/LiveActor/ActorInitInfo.h"
4#include "Library/Placement/PlacementFunction.h"
5#include "Library/Placement/PlacementInfo.h"
6#include "Project/Joint/RollingCubePoseKeeperUtil.h"
7#include "Project/RollingCubePose.h"
8
9namespace al {
10
11RollingCubePoseKeeper::RollingCubePoseKeeper() {}
12
13void RollingCubePoseKeeper::setCubeSize(const sead::BoundBox3f& cubeSize) {
14 mCubeSize = cubeSize;
15}
16
17bool RollingCubePoseKeeper::isMoveTypeTurn() const {
18 return mMoveType == MoveType::Turn || mMoveType == MoveType::All;
19}
20
21bool RollingCubePoseKeeper::isMoveTypeLoop() const {
22 return mMoveType == MoveType::Loop || mMoveType == MoveType::All;
23}
24
25void RollingCubePoseKeeper::init(const ActorInitInfo& initInfo) {
26 tryGetArg(arg: (s32*)&mMoveType, initInfo, key: "MoveType");
27 s32 linkNextNum = calcLinkNestNum(initInfo, linkName: "KeyMoveNext");
28
29 switch (mMoveType) {
30 case MoveType::All:
31 if (linkNextNum != 0)
32 mPoseCount = linkNextNum * 2;
33 else
34 mPoseCount = 1;
35 break;
36 case MoveType::Turn:
37 mPoseCount = linkNextNum * 2 + 1;
38 break;
39 default:
40 mPoseCount = linkNextNum + 1;
41 break;
42 }
43
44 mRollingCubePoses = new RollingCubePose[mPoseCount];
45
46 mRollingCubePoses[0].setCubeSize(mCubeSize);
47 mRollingCubePoses[0].init(placementInfo: *initInfo.placementInfo);
48
49 if (mMoveType == MoveType::Turn) {
50 mRollingCubePoses[mPoseCount - 1].setCubeSize(mCubeSize);
51 mRollingCubePoses[mPoseCount - 1].init(placementInfo: *initInfo.placementInfo);
52 }
53
54 PlacementInfo currentPlacementInfo = *initInfo.placementInfo;
55 PlacementInfo nextPlacementInfo;
56 for (s32 i = 0; i < linkNextNum; i++) {
57 getLinksInfo(linkPlacementInfo: &nextPlacementInfo, placementInfo: currentPlacementInfo, linkName: "KeyMoveNext");
58 mRollingCubePoses[i + 1].setCubeSize(mCubeSize);
59 mRollingCubePoses[i + 1].init(placementInfo: nextPlacementInfo);
60
61 // When move type is turn all steps are repeated but backwards
62 s32 mirrorIndexOffset = mMoveType == MoveType::Turn ? 2 : 1;
63 if (i < linkNextNum - 1 && isMoveTypeTurn()) {
64 s32 mirrorIndex = mPoseCount - i - mirrorIndexOffset;
65 mRollingCubePoses[mirrorIndex].setCubeSize(mCubeSize);
66 mRollingCubePoses[mirrorIndex].init(placementInfo: nextPlacementInfo);
67 }
68 currentPlacementInfo = nextPlacementInfo;
69 }
70
71 for (s32 i = 0; i < mPoseCount - 1; i++)
72 mRollingCubePoses[i].setNextCubePose(&mRollingCubePoses[i + 1]);
73
74 if (isMoveTypeLoop())
75 mRollingCubePoses[mPoseCount - 1].setNextCubePose(&mRollingCubePoses[0]);
76}
77
78bool RollingCubePoseKeeper::nextKey() {
79 mCurrentKeyIndex++;
80
81 if (mCurrentKeyIndex < mPoseCount)
82 return true;
83
84 if (isMoveTypeLoop()) {
85 mCurrentKeyIndex = 0;
86 return true;
87 }
88
89 mCurrentKeyIndex = mPoseCount - 1;
90 return false;
91}
92
93void RollingCubePoseKeeper::setStart() {
94 mCurrentKeyIndex = 0;
95}
96
97void RollingCubePoseKeeper::setKeyIndex(s32 index) {
98 mCurrentKeyIndex = index;
99}
100
101const RollingCubePose& RollingCubePoseKeeper::getCurrentPose() const {
102 return mRollingCubePoses[mCurrentKeyIndex];
103}
104
105const RollingCubePose& RollingCubePoseKeeper::getPose(s32 index) const {
106 return mRollingCubePoses[index];
107}
108
109void RollingCubePoseKeeper::calcBoundingBoxCenter(sead::Vector3f* center, const sead::Quatf& quat,
110 const sead::Vector3f& trans) const {
111 center->set(mCubeSize.getCenter());
112
113 sead::Matrix34f mtx;
114 mtx.makeQT(q: quat, t: trans);
115
116 center->mul(m: mtx);
117}
118
119} // namespace al
120