Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Player: Implement PlayerAnimFrameCtrl #318

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions data/odyssey_functions.csv
Original file line number Diff line number Diff line change
Expand Up @@ -26314,16 +26314,16 @@ Address,Quality,Size,Name
0x000000710042c6bc,U,001712,_ZN20PlayerAnimControlRun6updateEfRKN4sead7Vector3IfEE
0x000000710042cd6c,U,000008,_ZN25PlayerAnimControlSwimWalkC2EP14PlayerAnimatorPK11PlayerConst
0x000000710042cd74,U,000152,_ZN25PlayerAnimControlSwimWalk6updateEf
0x000000710042ce0c,U,000188,_ZN19PlayerAnimFrameCtrlC2Ev
0x000000710042cec8,U,000340,_ZN19PlayerAnimFrameCtrl11startActionEPN2al9LiveActorERKN4sead14SafeStringBaseIcEE
0x000000710042d01c,U,000280,_ZN19PlayerAnimFrameCtrl16changeActionNameEPN2al9LiveActorERKN4sead14SafeStringBaseIcEE
0x000000710042d134,U,000060,_ZN19PlayerAnimFrameCtrl6updateEv
0x000000710042d170,U,000068,_ZN19PlayerAnimFrameCtrl10updateSyncEPN2al9LiveActorE
0x000000710042d1b4,U,000076,_ZN19PlayerAnimFrameCtrl8setFrameEf
0x000000710042d200,U,000044,_ZNK19PlayerAnimFrameCtrl13getActionNameEv
0x000000710042d22c,U,000008,_ZNK19PlayerAnimFrameCtrl15getCurrentFrameEv
0x000000710042d234,U,000008,_ZNK19PlayerAnimFrameCtrl7getRateEv
0x000000710042d23c,U,000044,_ZNK19PlayerAnimFrameCtrl11isActionEndEv
0x000000710042ce0c,O,000188,_ZN19PlayerAnimFrameCtrlC2Ev
0x000000710042cec8,O,000340,_ZN19PlayerAnimFrameCtrl11startActionEPN2al9LiveActorERKN4sead14SafeStringBaseIcEE
0x000000710042d01c,O,000280,_ZN19PlayerAnimFrameCtrl16changeActionNameEPN2al9LiveActorERKN4sead14SafeStringBaseIcEE
0x000000710042d134,O,000060,_ZN19PlayerAnimFrameCtrl6updateEv
0x000000710042d170,O,000068,_ZN19PlayerAnimFrameCtrl10updateSyncEPN2al9LiveActorE
0x000000710042d1b4,O,000076,_ZN19PlayerAnimFrameCtrl8setFrameEf
0x000000710042d200,O,000044,_ZNK19PlayerAnimFrameCtrl13getActionNameEv
0x000000710042d22c,O,000008,_ZNK19PlayerAnimFrameCtrl15getCurrentFrameEv
0x000000710042d234,O,000008,_ZNK19PlayerAnimFrameCtrl7getRateEv
0x000000710042d23c,O,000044,_ZNK19PlayerAnimFrameCtrl11isActionEndEv
0x000000710042d268,O,000008,_ZN17PlayerAreaCheckerC2EPKN2al9LiveActorEPK17PlayerModelHolder
0x000000710042d270,O,000008,_ZNK17PlayerAreaChecker9isInWaterERKN4sead7Vector3IfEE
0x000000710042d278,O,000144,_ZNK17PlayerAreaChecker15isInWaterDoubleERKN4sead7Vector3IfEEf
Expand Down
67 changes: 67 additions & 0 deletions src/Player/PlayerAnimFrameCtrl.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#include "Player/PlayerAnimFrameCtrl.h"

#include "Library/LiveActor/ActorActionFunction.h"

PlayerAnimFrameCtrl::PlayerAnimFrameCtrl() = default;

void PlayerAnimFrameCtrl::startAction(al::LiveActor* player, const sead::SafeString& name) {
mActionName = name;
mIsActionRepeat = !al::isActionOneTime(player, name.cstr());
mCurrentFrame = 0.0f;
mActionFrameMax = al::getActionFrameMax(player, name.cstr());
mRate = 1.0f;
mIsSkipUpdate = true;
}

void PlayerAnimFrameCtrl::changeActionName(al::LiveActor* player, const sead::SafeString& name) {
mActionName = name;
mActionFrameMax = al::getActionFrameMax(player, name.cstr());
}

void PlayerAnimFrameCtrl::update() {
if (mIsSkipUpdate) {
mIsSkipUpdate = false;
return;
}

mCurrentFrame += mRate;
if (mCurrentFrame >= mActionFrameMax) {
if (mIsActionRepeat)
mCurrentFrame -= mActionFrameMax;
else
mCurrentFrame = mActionFrameMax;
}
}

void PlayerAnimFrameCtrl::updateSync(al::LiveActor* player) {
mIsSkipUpdate = false;
mRate = al::getActionFrameRate(player);
mCurrentFrame = al::getActionFrame(player) + mRate;
}

void PlayerAnimFrameCtrl::setFrame(f32 frame) {
if (mIsActionRepeat) {
// doing modf manually
mCurrentFrame = frame - (mActionFrameMax * (u32)(frame / mActionFrameMax));
} else if (mCurrentFrame > mActionFrameMax) {
mCurrentFrame = mActionFrameMax;
}

mIsSkipUpdate = true;
}

const char* PlayerAnimFrameCtrl::getActionName() const {
return mActionName.cstr();
}

f32 PlayerAnimFrameCtrl::getCurrentFrame() const {
return mCurrentFrame;
}

f32 PlayerAnimFrameCtrl::getRate() const {
return mRate;
}

bool PlayerAnimFrameCtrl::isActionEnd() const {
return !mIsActionRepeat && mCurrentFrame >= mActionFrameMax;
}
22 changes: 21 additions & 1 deletion src/Player/PlayerAnimFrameCtrl.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,26 @@ class LiveActor;

class PlayerAnimFrameCtrl {
public:
PlayerAnimFrameCtrl();

void startAction(al::LiveActor* player, const sead::SafeString& name);
void changeActionName(al::LiveActor* player, const sead::SafeString& name);
void update();
void updateSync(al::LiveActor* player);
void setFrame(f32 frame);

const char* getActionName() const;
void startAction(al::LiveActor* actor, const sead::SafeString& actionName);
f32 getCurrentFrame() const;
f32 getRate() const;
bool isActionEnd() const;

private:
sead::FixedSafeString<64> mActionName = {""};
bool mIsActionRepeat = false;
f32 mCurrentFrame = 0.0f;
f32 mActionFrameMax = 0.0f;
f32 mRate = 1.0f;
bool mIsSkipUpdate = false;
};

static_assert(sizeof(PlayerAnimFrameCtrl) == 0x70);