mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-27 02:54:08 +00:00
188 lines
5.7 KiB
C++
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
|