1#include "Project/Joint/RollingCubePoseKeeperUtil.h"
2
3#include "Library/LiveActor/ActorModelFunction.h"
4#include "Library/Math/MathUtil.h"
5#include "Library/Matrix/MatrixUtil.h"
6#include "Project/Joint/RollingCubePoseKeeper.h"
7#include "Project/RollingCubePose.h"
8
9namespace al {
10
11RollingCubePoseKeeper* createRollingCubePoseKeeper(const LiveActor* actor,
12 const ActorInitInfo& initInfo) {
13 sead::BoundBox3f modelBoundBox;
14 calcModelBoundingBox(&modelBoundBox, actor);
15 return createRollingCubePoseKeeper(cubeSize: modelBoundBox, initInfo);
16}
17
18RollingCubePoseKeeper* createRollingCubePoseKeeper(const sead::BoundBox3f& cubeSize,
19 const ActorInitInfo& initInfo) {
20 RollingCubePoseKeeper* keeper = new RollingCubePoseKeeper();
21 keeper->setCubeSize(cubeSize);
22 keeper->init(initInfo);
23 return keeper;
24}
25
26bool nextRollingCubeKey(RollingCubePoseKeeper* keeper) {
27 return keeper->nextKey();
28}
29
30void setStartRollingCubeKey(RollingCubePoseKeeper* keeper) {
31 keeper->setStart();
32}
33
34void setRollingCubeKeyIndex(RollingCubePoseKeeper* keeper, s32 index) {
35 keeper->setKeyIndex(index);
36}
37
38bool isMoveTypeLoopRollingCube(const RollingCubePoseKeeper* keeper) {
39 return keeper->isMoveTypeLoop();
40}
41
42void fittingToCurrentKeyBoundingBox(sead::Quatf* outQuat, sead::Vector3f* outTrans,
43 const RollingCubePoseKeeper* keeper) {
44 keeper->getCurrentPose().fittingToBoundingBox(quat: outQuat, trans: outTrans);
45}
46
47void calcCurrentKeyQT(sead::Quatf* outQuat, sead::Vector3f* outTrans,
48 const RollingCubePoseKeeper* keeper, const sead::Quatf& quat,
49 const sead::Vector3f& trans, f32 rate) {
50 keeper->getCurrentPose().calcRotateQT(outQuat, outTrans, quat, trans, rate);
51}
52
53void getCurrentKeyQT(sead::Quatf* outQuat, sead::Vector3f* outTrans,
54 const RollingCubePoseKeeper* keeper) {
55 const RollingCubePose& rollingCubePose = keeper->getCurrentPose();
56 if (outQuat)
57 outQuat->set(rollingCubePose.getQuat());
58 if (outTrans)
59 outTrans->set(rollingCubePose.getTrans());
60}
61
62f32 getCurrentKeyRotateDegree(const RollingCubePoseKeeper* keeper) {
63 return keeper->getCurrentPose().getRotateDegree();
64}
65
66const sead::Vector3f& getCurrentKeySlideVec(const RollingCubePoseKeeper* keeper) {
67 return keeper->getCurrentPose().getSlideVec();
68}
69
70s32 getCurrentKeyIndex(const RollingCubePoseKeeper* keeper) {
71 return keeper->getCurrentKeyIndex();
72}
73
74const PlacementInfo& getCurrentKeyPlacementInfo(const RollingCubePoseKeeper* keeper) {
75 return keeper->getCurrentPose().getPlacementInfo();
76}
77
78bool isMovementCurrentKeyRotate(const RollingCubePoseKeeper* keeper) {
79 return keeper->getCurrentPose().isMovementRotate();
80}
81
82bool isMovementCurrentKeySlide(const RollingCubePoseKeeper* keeper) {
83 return keeper->getCurrentPose().isMovementSlide();
84}
85
86f32 calcDistanceCurrentKeyRotateCenterToBoxCenter(const RollingCubePoseKeeper* keeper) {
87 const RollingCubePose& rollingCubePose = keeper->getCurrentPose();
88
89 sead::Vector3f center;
90 rollingCubePose.calcBoundingBoxCenter(center: &center);
91
92 sead::Vector3f distance = center - rollingCubePose.getRotateCenter();
93
94 if (!isNearZero(vec: rollingCubePose.getRotateAxis()))
95 verticalizeVec(out: &distance, vertical: rollingCubePose.getRotateAxis(), vec: distance);
96
97 return distance.length();
98}
99
100} // namespace al
101