OdysseyDecomp/lib/al/Library/KeyPose/KeyPoseKeeperUtil.cpp

188 lines
5.7 KiB
C++

#include "Library/KeyPose/KeyPoseKeeperUtil.h"
#include "Library/KeyPose/KeyPoseKeeper.h"
#include "Library/LiveActor/ActorInitUtil.h"
#include "Library/Math/MathUtil.h"
#include "Library/Placement/PlacementFunction.h"
#include "Project/Joint/KeyPose.h"
namespace al {
KeyPoseKeeper* createKeyPoseKeeper(const ActorInitInfo& info) {
return createKeyPoseKeeper(getPlacementInfo(info));
}
KeyPoseKeeper* createKeyPoseKeeper(const PlacementInfo& info) {
KeyPoseKeeper* keyPoseKeeper = new KeyPoseKeeper();
keyPoseKeeper->init(info);
return keyPoseKeeper;
}
void resetKeyPose(KeyPoseKeeper* keyPoseKeeper) {
keyPoseKeeper->reset();
}
void nextKeyPose(KeyPoseKeeper* keyPoseKeeper) {
keyPoseKeeper->next();
}
void restartKeyPose(KeyPoseKeeper* keyPoseKeeper, sead::Vector3f* pos, sead::Quatf* orientation) {
resetKeyPose(keyPoseKeeper);
const KeyPose& keyPose = keyPoseKeeper->getKeyPose(0);
if (pos)
pos->set(keyPose.getTrans());
if (orientation)
orientation->set(keyPose.getQuat());
}
void reverseKeyPose(KeyPoseKeeper* keyPoseKeeper) {
keyPoseKeeper->reverse();
}
const sead::Vector3f& getCurrentKeyTrans(const KeyPoseKeeper* keyPoseKeeper) {
return keyPoseKeeper->getCurrentKeyPose().getTrans();
}
const sead::Vector3f& getNextKeyTrans(const KeyPoseKeeper* keyPoseKeeper) {
return keyPoseKeeper->getNextKeyPose().getTrans();
}
const sead::Quatf& getCurrentKeyQuat(const KeyPoseKeeper* keyPoseKeeper) {
return keyPoseKeeper->getCurrentKeyPose().getQuat();
}
const sead::Quatf& getNextKeyQuat(const KeyPoseKeeper* keyPoseKeeper) {
return keyPoseKeeper->getNextKeyPose().getQuat();
}
const PlacementInfo& getCurrentKeyPlacementInfo(const KeyPoseKeeper* keyPoseKeeper) {
return keyPoseKeeper->getCurrentKeyPose().getPlacementInfo();
}
const PlacementInfo& getNextKeyPlacementInfo(const KeyPoseKeeper* keyPoseKeeper) {
return keyPoseKeeper->getNextKeyPose().getPlacementInfo();
}
s32 getKeyPoseCount(const KeyPoseKeeper* keyPoseKeeper) {
return keyPoseKeeper->getKeyPoseCount();
}
void getKeyPoseTrans(sead::Vector3f* out, const KeyPoseKeeper* keyPoseKeeper, s32 idx) {
out->set(keyPoseKeeper->getKeyPose(idx).getTrans());
}
void getKeyPoseQuat(sead::Quatf* out, const KeyPoseKeeper* keyPoseKeeper, s32 idx) {
out->set(keyPoseKeeper->getKeyPose(idx).getQuat());
}
void calcLerpKeyTrans(sead::Vector3f* out, const KeyPoseKeeper* keyPoseKeeper, f32 rate) {
const KeyPose& current = keyPoseKeeper->getCurrentKeyPose();
const KeyPose& next = keyPoseKeeper->getNextKeyPose();
s32 interpolateType = 0;
tryGetArg(&interpolateType, current.getPlacementInfo(), "InterpolateType");
lerpVec(out, current.getTrans(), next.getTrans(), easeByType(rate, interpolateType));
}
void calcSlerpKeyQuat(sead::Quatf* out, const KeyPoseKeeper* keyPoseKeeper, f32 rate) {
const KeyPose& current = keyPoseKeeper->getCurrentKeyPose();
const KeyPose& next = keyPoseKeeper->getNextKeyPose();
s32 interpolateType = 0;
tryGetArg(&interpolateType, current.getPlacementInfo(), "InterpolateType");
slerpQuat(out, current.getQuat(), next.getQuat(), easeByType(rate, interpolateType));
}
bool isMoveSignKey(const KeyPoseKeeper* keyPoseKeeper) {
bool isPlaySign = false;
tryGetArg(&isPlaySign, getCurrentKeyPlacementInfo(keyPoseKeeper), "IsPlaySign");
return isPlaySign;
}
bool isLastKey(const KeyPoseKeeper* keyPoseKeeper) {
return keyPoseKeeper->isLastKey();
}
bool isFirstKey(const KeyPoseKeeper* keyPoseKeeper) {
return keyPoseKeeper->isFirstKey();
}
bool isGoingToEnd(const KeyPoseKeeper* keyPoseKeeper) {
return keyPoseKeeper->isGoingToEnd();
}
bool isStop(const KeyPoseKeeper* keyPoseKeeper) {
return keyPoseKeeper->isStop();
}
bool isRestart(const KeyPoseKeeper* keyPoseKeeper) {
return keyPoseKeeper->isRestart();
}
f32 calcDistanceNextKeyTrans(const KeyPoseKeeper* keyPoseKeeper) {
return (getCurrentKeyTrans(keyPoseKeeper) - getNextKeyTrans(keyPoseKeeper)).length();
}
s32 calcTimeToNextKeyMove(const KeyPoseKeeper* keyPoseKeeper, f32 speed) {
return sead::Mathi::clampMin((s32)(calcDistanceNextKeyTrans(keyPoseKeeper) / speed), 1);
}
void calcDirToNextKey(sead::Vector3f* out, const KeyPoseKeeper* keyPoseKeeper) {
const sead::Vector3f& currTrans = getCurrentKeyTrans(keyPoseKeeper);
const sead::Vector3f& nextTrans = getNextKeyTrans(keyPoseKeeper);
out->x = nextTrans.x - currTrans.x;
out->y = nextTrans.y - currTrans.y;
out->z = nextTrans.z - currTrans.z;
if (!tryNormalizeOrZero(out))
out->set(sead::Vector3f::ez);
}
f32 calcKeyMoveSpeed(const KeyPoseKeeper* keyPoseKeeper) {
f32 speed = -1.0f;
tryGetArg(&speed, getCurrentKeyPlacementInfo(keyPoseKeeper), "Speed");
if (speed < 0.0f)
return -1.0f;
return speed;
}
f32 calcKeyMoveSpeedByTime(const KeyPoseKeeper* keyPoseKeeper) {
s32 speed = -1;
tryGetArg(&speed, getCurrentKeyPlacementInfo(keyPoseKeeper), "SpeedByTime");
if (speed < 0.0f)
return -1.0f;
return speed;
}
s32 calcKeyMoveWaitTime(const KeyPoseKeeper* keyPoseKeeper) {
s32 waitTime = -1;
tryGetArg(&waitTime, getCurrentKeyPlacementInfo(keyPoseKeeper), "WaitTime");
return sead::Mathi::max(waitTime, -1);
}
s32 calcKeyMoveMoveTime(const KeyPoseKeeper* keyPoseKeeper) {
s32 t = (s32)calcKeyMoveSpeedByTime(keyPoseKeeper);
if (t >= 1)
return t;
f32 v = calcKeyMoveSpeed(keyPoseKeeper);
return v > 0.0f ? calcTimeToNextKeyMove(keyPoseKeeper, v) : 60;
}
// TODO: Implement al::calcKeyMoveClippingInfo and al::setKeyMoveClippingInfo
// void calcKeyMoveClippingInfo(sead::Vector3f*, f32*, const KeyPoseKeeper*, f32) {}
// void setKeyMoveClippingInfo(LiveActor*, sead::Vector3f*, const KeyPoseKeeper*) {}
} // namespace al