OdysseyDecomp/lib/al/Project/Joint/RollingCubePoseKeeper.cpp

120 lines
3.5 KiB
C++

#include "Project/Joint/RollingCubePoseKeeper.h"
#include "Library/LiveActor/ActorInitInfo.h"
#include "Library/Placement/PlacementFunction.h"
#include "Library/Placement/PlacementInfo.h"
#include "Project/Joint/RollingCubePoseKeeperUtil.h"
#include "Project/RollingCubePose.h"
namespace al {
RollingCubePoseKeeper::RollingCubePoseKeeper() {}
void RollingCubePoseKeeper::setCubeSize(const sead::BoundBox3f& cubeSize) {
mCubeSize = cubeSize;
}
bool RollingCubePoseKeeper::isMoveTypeTurn() const {
return mMoveType == MoveType::Turn || mMoveType == MoveType::All;
}
bool RollingCubePoseKeeper::isMoveTypeLoop() const {
return mMoveType == MoveType::Loop || mMoveType == MoveType::All;
}
void RollingCubePoseKeeper::init(const ActorInitInfo& initInfo) {
tryGetArg((s32*)&mMoveType, initInfo, "MoveType");
s32 linkNextNum = calcLinkNestNum(initInfo, "KeyMoveNext");
switch (mMoveType) {
case MoveType::All:
if (linkNextNum != 0)
mPoseCount = linkNextNum * 2;
else
mPoseCount = 1;
break;
case MoveType::Turn:
mPoseCount = linkNextNum * 2 + 1;
break;
default:
mPoseCount = linkNextNum + 1;
break;
}
mRollingCubePoses = new RollingCubePose[mPoseCount];
mRollingCubePoses[0].setCubeSize(mCubeSize);
mRollingCubePoses[0].init(*initInfo.placementInfo);
if (mMoveType == MoveType::Turn) {
mRollingCubePoses[mPoseCount - 1].setCubeSize(mCubeSize);
mRollingCubePoses[mPoseCount - 1].init(*initInfo.placementInfo);
}
PlacementInfo currentPlacementInfo = *initInfo.placementInfo;
PlacementInfo nextPlacementInfo;
for (s32 i = 0; i < linkNextNum; i++) {
getLinksInfo(&nextPlacementInfo, currentPlacementInfo, "KeyMoveNext");
mRollingCubePoses[i + 1].setCubeSize(mCubeSize);
mRollingCubePoses[i + 1].init(nextPlacementInfo);
// When move type is turn all steps are repeated but backwards
s32 mirrorIndexOffset = mMoveType == MoveType::Turn ? 2 : 1;
if (i < linkNextNum - 1 && isMoveTypeTurn()) {
s32 mirrorIndex = mPoseCount - i - mirrorIndexOffset;
mRollingCubePoses[mirrorIndex].setCubeSize(mCubeSize);
mRollingCubePoses[mirrorIndex].init(nextPlacementInfo);
}
currentPlacementInfo = nextPlacementInfo;
}
for (s32 i = 0; i < mPoseCount - 1; i++)
mRollingCubePoses[i].setNextCubePose(&mRollingCubePoses[i + 1]);
if (isMoveTypeLoop())
mRollingCubePoses[mPoseCount - 1].setNextCubePose(&mRollingCubePoses[0]);
}
bool RollingCubePoseKeeper::nextKey() {
mCurrentKeyIndex++;
if (mCurrentKeyIndex < mPoseCount)
return true;
if (isMoveTypeLoop()) {
mCurrentKeyIndex = 0;
return true;
}
mCurrentKeyIndex = mPoseCount - 1;
return false;
}
void RollingCubePoseKeeper::setStart() {
mCurrentKeyIndex = 0;
}
void RollingCubePoseKeeper::setKeyIndex(s32 index) {
mCurrentKeyIndex = index;
}
const RollingCubePose& RollingCubePoseKeeper::getCurrentPose() const {
return mRollingCubePoses[mCurrentKeyIndex];
}
const RollingCubePose& RollingCubePoseKeeper::getPose(s32 index) const {
return mRollingCubePoses[index];
}
void RollingCubePoseKeeper::calcBoundingBoxCenter(sead::Vector3f* center, const sead::Quatf& quat,
const sead::Vector3f& trans) const {
center->set(mCubeSize.getCenter());
sead::Matrix34f mtx;
mtx.makeQT(quat, trans);
center->mul(mtx);
}
} // namespace al