Skip to content

Commit 52689c4

Browse files
committed
match AnmPlayer
1 parent 11145a3 commit 52689c4

File tree

6 files changed

+237
-30
lines changed

6 files changed

+237
-30
lines changed

configure.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1332,7 +1332,7 @@ def MatchingFor(*versions):
13321332
Object(NonMatching, "Shiraiwa/JugemFlag.cpp"),
13331333
Object(NonMatching, "Shiraiwa/MapObjWanwan.cpp"),
13341334
Object(NonMatching, "Shiraiwa/MapObjWanwanChain.cpp"),
1335-
Object(NonMatching, "Shiraiwa/AnmPlayer.cpp"),
1335+
Object(Matching, "Shiraiwa/AnmPlayer.cpp"),
13361336
Object(NonMatching, "Shiraiwa/MapObjSkyShip.cpp"),
13371337
Object(NonMatching, "Shiraiwa/MapObjDonkyRockGen.cpp"),
13381338
Object(NonMatching, "Shiraiwa/MapObjDonkyRock.cpp"),

include/Sato/AnmController.h

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class AnmControlBase
3131
u8 getNowAnmNo() const { return mNowAnmNo; }
3232

3333
bool tstFlgAnmStop() const { return mFlags & 1; }
34+
bool tstFlgAnm2() const { return mFlags & 2; }
3435
void resetFlag() { mFlags &= ~1; }
3536

3637
u8 mFlags; // 4
@@ -106,7 +107,13 @@ class AnmControlTrans : public TAnmControlBase<J3DAnmObjTrans>
106107
AnmControlTrans() {}
107108
virtual ~AnmControlTrans() {}
108109

109-
virtual void changeAnm(u8, bool) { } // TODO
110+
virtual void changeAnm(u8 anm_no, bool reset) {
111+
JUT_MINMAX_ASSERT(0, anm_no, mMaxAnmNo);
112+
mNowAnmNo = anm_no;
113+
if (reset) {
114+
mObj[mNowAnmNo].resetFrame();
115+
}
116+
}
110117

111118
virtual void setAnmProc() {
112119
mObj[mNowAnmNo].mModel->getModelData()->getJointNodePointer(0)->setMtxCalc(mObj[mNowAnmNo].mCalc);
@@ -213,8 +220,7 @@ class AnmController
213220
void SetAnimation(); // 0x8026f8d4
214221
void Reset(); // 0x8026f950
215222
void ResetMat(); // 0x8026f99c
216-
void ResetAnm() // fabricated but causes TAnmControlBase<J3DAnmObjTrans>::resetAnm() to be ordered correctly in GeoCannon, also inlines into a matching AnmController::reset()
217-
{
223+
void ResetAnm() { // fabricated but causes TAnmControlBase<J3DAnmObjTrans>::resetAnm() to be ordered correctly in GeoCannon, also inlines into a matching AnmController::reset()
218224
if (mTrans != nullptr) {
219225
mTrans->resetAnm();
220226
}
@@ -230,8 +236,7 @@ class AnmController
230236

231237
virtual ~AnmController() {}
232238

233-
void InitRegistration(u8 anm_no, ExModel *model)
234-
{
239+
void InitRegistration(u8 anm_no, ExModel *model) {
235240
mTrans = new AnmControlTrans();
236241
mTrans->initAnm(anm_no, model);
237242
}
@@ -240,33 +245,39 @@ class AnmController
240245
mTrans->registrationBlend(anm_no, transform, mtxCalc);
241246
}
242247

243-
void SetAllWeight(u8 AnmNo) // fabricated?
244-
{
248+
void ChangeTransAnm(u8 AnmNo) { // fabricated
249+
if (mTrans == nullptr) {
250+
return;
251+
}
245252
#line 338
246253
JUT_MINMAX_ASSERT(0, AnmNo, mTrans->mMaxAnmNo);
247254
J3DAnmObjTrans *transObj = mTrans->getObj(AnmNo);
248255
if (transObj->_28 & 1) {
249-
transObj->mCalc->setWeight(0, 1.0f);
250-
for(u8 i = AnmNo; i < 4; i++) {
251-
transObj->mCalc->setWeight(i, 0.0f);
256+
transObj->setWeight(0, 1.0f);
257+
for(u8 i = 1; i < 4; i++) {
258+
transObj->setWeight(i, 0.0f);
252259
}
253260
}
261+
mTrans->changeAnm(AnmNo, true); // TODO: additional parameter?
254262
}
255263

256-
void ChangeBlendTransAnm(u8 AnmNo, u8 p2, u8 p3)
257-
{
264+
void ChangeBlendTransAnm(u8 AnmNo, u8 p2, u8 p3) {
258265
if (mTrans == nullptr)
259266
return;
260267
#line 353
261268
JUT_MINMAX_ASSERT(0, AnmNo, mTrans->mMaxAnmNo);
262269
mTrans->changeBlendAnm(AnmNo, p2, p3);
263270
}
264271
u8 getNowTransNo() const { return mTrans->getNowAnmNo(); }
272+
J3DAnmObjTrans *getObj(u8 AnmNo) { return mTrans->getObj(AnmNo); }
273+
J3DFrameCtrl *getCurFrameCtrl() { return mTrans->getObj(getNowTransNo())->getFrameCtrl(); }
265274
J3DFrameCtrl *getFrameCtrl(u8 AnmNo) { return mTrans->getFrameCtrl(AnmNo); }
275+
266276
void ChangeTransAnm(u8 AnmNo, bool p2) { mTrans->changeAnm(AnmNo, p2); } // fabricated
267277
void RegisterTrans(u8 AnmNo, J3DAnmTransform *transform, J3DMtxCalc *calc) { mTrans->registration(AnmNo, transform, calc); } // fabricated
268278
bool IsAvailableTrans() const { return mTrans != nullptr; }
269279
void StopTrans() { mTrans->resetFlag(); } // fabricated
280+
bool IsTransAnm2() const { return mTrans->tstFlgAnm2(); }
270281

271282
AnmControlTrans *mTrans; // 4
272283
AnmControlBase **mMat;

include/Shiraiwa/AnmPlayer.h

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,16 @@
77
class TAnmInfo
88
{
99
public:
10-
const char *mBckName; // 0
11-
AnmControlTrans *mTransAnm; // 4
10+
s8 get_12() { return _12; } // fabricated, but needed to get lbzx instead of lbz addi
11+
12+
const char *mBckName; // 0
13+
J3DAnmTransform *mTransAnm; // 4
1214
J3DMtxCalc *mCalcAnm; // 8
1315
int mAnmCnt; // C
14-
bool mHasBlendColor; // 10
16+
u8 mBlendFrameCnt; // 10
17+
u8 _11; //
18+
s8 _12; //
19+
1520
}; // Size: 0x14
1621

1722
class TAnmPlayer
@@ -26,18 +31,20 @@ class TAnmPlayer
2631
void reset(); // 0x802980bc
2732
void update(); // 0x80298248
2833
void firstEndCheck(u8); // 0x80298604
29-
void isCurAnmReachEnd(); // 0x802986c0
30-
void checkFrameEnd(); // 0x8029878c
31-
void isFitBlendFrame(); // 0x802988e4
32-
void isGoArroundLoop(); // 0x80298ab0
34+
bool isCurAnmReachEnd(); // 0x802986c0
35+
bool checkFrameEnd(); // 0x8029878c
36+
bool isFitBlendFrame(); // 0x802988e4
37+
bool isGoArroundLoop(); // 0x80298ab0
3338

3439
u8 getCurAnmNumber() const { return mController->getNowTransNo(); }
3540

36-
AnmController *mController;
37-
int _8;
38-
u8 _c;
41+
AnmController *mController; // 4
42+
TAnmInfo *mAnmInfo; // 8
43+
u8 mMaxAnm; // c
3944
u8 _d;
4045
u16 _e;
4146
u8 _10;
42-
}; // Size: 0x14
43-
#endif // ANMPLAYER_H
47+
s8 _11;
48+
f32 _14;
49+
}; // Size: 0x18
50+
#endif // ANMPLAYER_H

include/Shiraiwa/JugemMain.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class TJugem : public TMapObjHioNode, public StateObserver
6868

6969
u8 _158[0x178 - 0x158]; //
7070
TAnmPlayer mAnmPlayer; // 178
71-
u8 _18c[0x244 - 0x18c]; //
71+
u8 _190[0x244 - 0x190]; //
7272
u32 mDemoPattern; // 244
7373
u8 _248; //
7474
u8 mKartNum; // 249

src/Sato/ItemFlyTurtle.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,10 +197,7 @@ void ItemFlyTurtle::initRelease() {
197197
mCLPointController->init_ByKartIndex(mOwnerNum);
198198
mMoveState = 0;
199199

200-
if(mController.IsAvailableTrans()) {
201-
mController.SetAllWeight(1);
202-
mController.ChangeTransAnm(1, true);
203-
}
200+
mController.ChangeTransAnm(1);
204201

205202
mMaxVel = sMaxVel;
206203
setInitReleaseParam();

src/Shiraiwa/AnmPlayer.cpp

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
#include "Shiraiwa/AnmPlayer.h"
2+
#include "JSystem/J3D/J3DAnmLoader.h"
3+
#include "JSystem/J3D/J3DFrameCtrl.h"
4+
#include "JSystem/JUtility/JUTAssert.h"
5+
#include "Osako/ResMgr.h"
6+
#include "Sato/AnmController.h"
7+
#include "Sato/J3DAnmObject.h"
8+
9+
TAnmPlayer::TAnmPlayer() {
10+
mController = nullptr;
11+
mAnmInfo = nullptr;
12+
_e = 0;
13+
_10 = 0;
14+
}
15+
16+
TAnmPlayer::~TAnmPlayer() {}
17+
18+
void TAnmPlayer::resetAnimations(TAnmInfo *anmInfo, u8 n) {
19+
for (u8 i = 0; i < n; i++) {
20+
anmInfo[i].mTransAnm = nullptr;
21+
anmInfo[i].mCalcAnm = nullptr;
22+
}
23+
}
24+
25+
void TAnmPlayer::loadAnimations(TAnmInfo *anmInfo, u8 n, J3DModelData *mdlData, ResMgr::ArchiveId archiveID) {
26+
u8 i;
27+
for (i = 0; i < n; i++) {
28+
#line 67
29+
void *bck = ResMgr::getPtr(archiveID, anmInfo[i].mBckName);
30+
JUT_ASSERT_F(bck, "load failed: %s from archive id %d", anmInfo[i].mBckName, archiveID);
31+
J3DAnmObjTrans::loadTransAnm(&anmInfo[i].mTransAnm, bck);
32+
}
33+
34+
for (i = 0; i < n; i++) {
35+
s8 i2 = anmInfo[i]._12;
36+
if (anmInfo[i].mBlendFrameCnt && i2 < n) {
37+
anmInfo[i].mCalcAnm = J3DUNewMtxCalcAnm(mdlData->getMtxCalcType(), anmInfo[i].mTransAnm, anmInfo[i2].mTransAnm, nullptr, nullptr, MTXCalc_Blend);
38+
}
39+
else {
40+
anmInfo[i].mCalcAnm = J3DNewMtxCalcAnm(mdlData->getMtxCalcType(), anmInfo[i].mTransAnm);
41+
}
42+
}
43+
}
44+
45+
void TAnmPlayer::registAnimations(AnmController *ctrl, ExModel *model, TAnmInfo *anmInfo, u8 n) {
46+
ctrl->InitRegistration(n, model);
47+
48+
for (u8 i = 0; i < n; i++) {
49+
if (anmInfo[i].mBlendFrameCnt) {
50+
ctrl->RegisterTransBlend(i, anmInfo[i].mTransAnm, anmInfo[i].mCalcAnm);
51+
}
52+
else {
53+
ctrl->RegisterTrans(i, anmInfo[i].mTransAnm, anmInfo[i].mCalcAnm);
54+
}
55+
ctrl->getFrameCtrl(i)->setAttribute(anmInfo[i].mAnmCnt);
56+
}
57+
}
58+
59+
void TAnmPlayer::init(AnmController *ctrl, TAnmInfo *info, u8 n) {
60+
mController = ctrl;
61+
mAnmInfo = info;
62+
mMaxAnm = n;
63+
reset();
64+
}
65+
66+
void TAnmPlayer::reset() {
67+
_d = 1;
68+
_e = 0;
69+
_11 = -1;
70+
_14 = -1.0f;
71+
72+
mController->ChangeTransAnm(0);
73+
mController->Reset();
74+
75+
_10 = 1;
76+
_e = 0;
77+
firstEndCheck(0);
78+
79+
}
80+
81+
void TAnmPlayer::update() {
82+
if (mAnmInfo == nullptr || !_10) {
83+
return;
84+
}
85+
86+
u8 anmNumber = getCurAnmNumber();
87+
if (!mController->IsTransAnm2()) {
88+
if (_e & 1 || _e & 2 && isCurAnmReachEnd()) {
89+
s8 anmNo = (_11 != -1) ? _11 : mAnmInfo[getCurAnmNumber()].get_12();
90+
91+
_11 = -1;
92+
93+
if (anmNo != -1 && anmNo < mMaxAnm) {
94+
_d = 1;
95+
96+
if (mAnmInfo[anmNumber].mBlendFrameCnt) {
97+
mController->ChangeBlendTransAnm(anmNo, mAnmInfo[anmNumber].mBlendFrameCnt, 1);
98+
}
99+
else {
100+
mController->ChangeTransAnm(anmNo);
101+
}
102+
_e = 0;
103+
firstEndCheck(anmNo);
104+
}
105+
else {
106+
_10 = 0;
107+
}
108+
}
109+
else {
110+
#line 190
111+
JUT_MINMAX_ASSERT(0, anmNumber, mMaxAnm);
112+
113+
u8 anmNo = mAnmInfo[anmNumber]._11;
114+
if (anmNo != 0 && isGoArroundLoop()) {
115+
++_d;
116+
if (_d >= anmNo - 1) {
117+
_10 = 1;
118+
_e |= 2;
119+
}
120+
}
121+
}
122+
}
123+
124+
_14 = mController->getFrameCtrl(getCurAnmNumber())->getFrame();
125+
}
126+
127+
void TAnmPlayer::firstEndCheck(u8 anmNumber) {
128+
#line 210
129+
JUT_MINMAX_ASSERT(0, anmNumber, mMaxAnm);
130+
if (mAnmInfo[anmNumber]._11 == 1 || mAnmInfo[anmNumber].mAnmCnt == 0) {
131+
_10 = 1;
132+
_e |= 2;
133+
}
134+
}
135+
136+
bool TAnmPlayer::isCurAnmReachEnd() {
137+
bool ret = false;
138+
if (mController->getCurFrameCtrl()->checkState(1) || checkFrameEnd() || isFitBlendFrame()) {
139+
ret = true;
140+
}
141+
return ret;
142+
}
143+
144+
bool TAnmPlayer::checkFrameEnd() {
145+
bool ret = false;
146+
147+
if (_14 == -1.0f) {
148+
return false;
149+
}
150+
151+
J3DFrameCtrl *ctrl = mController->getFrameCtrl(getCurAnmNumber());
152+
153+
switch (mAnmInfo[getCurAnmNumber()].mAnmCnt) {
154+
case 0: {
155+
if (ctrl->getFrame() > ctrl->getEnd() - ctrl->getRate()) {
156+
ret = true;
157+
}
158+
break;
159+
}
160+
case 1: {
161+
break;
162+
}
163+
case 2: {
164+
if ((ctrl->getFrame() - _14) * ctrl->getRate() < 0.0f) {
165+
ret = true;
166+
}
167+
break;
168+
}
169+
}
170+
return ret;
171+
}
172+
173+
bool TAnmPlayer::isFitBlendFrame() {
174+
bool ret = false;
175+
u8 anmNumber = getCurAnmNumber();
176+
#line 268
177+
JUT_MINMAX_ASSERT(0, anmNumber, mMaxAnm);
178+
179+
if (mAnmInfo[anmNumber].mBlendFrameCnt) {
180+
f32 frame = mController->getFrameCtrl(getCurAnmNumber())->getFrame();
181+
f32 end = mController->getFrameCtrl(getCurAnmNumber())->getEnd();
182+
if (end - frame <= mAnmInfo[anmNumber].mBlendFrameCnt) {
183+
ret = true;
184+
}
185+
}
186+
187+
return ret;
188+
}
189+
190+
bool TAnmPlayer::isGoArroundLoop() {
191+
return mController->getFrameCtrl(getCurAnmNumber())->checkState(2);
192+
}

0 commit comments

Comments
 (0)