mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-02-19 20:21:57 -05:00
When testing if an animation is new, make sure we are using the loaded file pointers (#1748)
This commit is contained in:
parent
83541f4605
commit
63f763a556
@ -1242,8 +1242,12 @@ void LinkAnimation_Change(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAn
|
|||||||
if (ResourceMgr_OTRSigCheck(animation) != 0)
|
if (ResourceMgr_OTRSigCheck(animation) != 0)
|
||||||
animation = ResourceMgr_LoadAnimByName(animation);
|
animation = ResourceMgr_LoadAnimByName(animation);
|
||||||
|
|
||||||
|
AnimationHeader* currentAnimation = (AnimationHeader*)skelAnime->animation;
|
||||||
|
if (ResourceMgr_OTRSigCheck(currentAnimation) != 0)
|
||||||
|
currentAnimation = ResourceMgr_LoadAnimByName(currentAnimation);
|
||||||
|
|
||||||
skelAnime->mode = mode;
|
skelAnime->mode = mode;
|
||||||
if ((morphFrames != 0.0f) && ((animation != skelAnime->animation) || (startFrame != skelAnime->curFrame))) {
|
if ((morphFrames != 0.0f) && ((animation != currentAnimation) || (startFrame != skelAnime->curFrame))) {
|
||||||
if (morphFrames < 0) {
|
if (morphFrames < 0) {
|
||||||
LinkAnimation_SetUpdateFunction(skelAnime);
|
LinkAnimation_SetUpdateFunction(skelAnime);
|
||||||
SkelAnime_CopyFrameTable(skelAnime, skelAnime->morphTable, skelAnime->jointTable);
|
SkelAnime_CopyFrameTable(skelAnime, skelAnime->morphTable, skelAnime->jointTable);
|
||||||
@ -1687,8 +1691,17 @@ s32 SkelAnime_Once(SkelAnime* skelAnime) {
|
|||||||
*/
|
*/
|
||||||
void Animation_ChangeImpl(SkelAnime* skelAnime, AnimationHeader* animation, f32 playSpeed, f32 startFrame, f32 endFrame,
|
void Animation_ChangeImpl(SkelAnime* skelAnime, AnimationHeader* animation, f32 playSpeed, f32 startFrame, f32 endFrame,
|
||||||
u8 mode, f32 morphFrames, s8 taper) {
|
u8 mode, f32 morphFrames, s8 taper) {
|
||||||
|
LinkAnimationHeader* ogAnim = animation;
|
||||||
|
|
||||||
|
if (ResourceMgr_OTRSigCheck(animation) != 0)
|
||||||
|
animation = ResourceMgr_LoadAnimByName(animation);
|
||||||
|
|
||||||
|
AnimationHeader* currentAnimation = (AnimationHeader*)skelAnime->animation;
|
||||||
|
if (ResourceMgr_OTRSigCheck(currentAnimation) != 0)
|
||||||
|
currentAnimation = ResourceMgr_LoadAnimByName(currentAnimation);
|
||||||
|
|
||||||
skelAnime->mode = mode;
|
skelAnime->mode = mode;
|
||||||
if ((morphFrames != 0.0f) && ((animation != skelAnime->animation) || (startFrame != skelAnime->curFrame))) {
|
if ((morphFrames != 0.0f) && ((animation != currentAnimation) || (startFrame != skelAnime->curFrame))) {
|
||||||
if (morphFrames < 0) {
|
if (morphFrames < 0) {
|
||||||
SkelAnime_SetUpdate(skelAnime);
|
SkelAnime_SetUpdate(skelAnime);
|
||||||
SkelAnime_CopyFrameTable(skelAnime, skelAnime->morphTable, skelAnime->jointTable);
|
SkelAnime_CopyFrameTable(skelAnime, skelAnime->morphTable, skelAnime->jointTable);
|
||||||
@ -1710,7 +1723,7 @@ void Animation_ChangeImpl(SkelAnime* skelAnime, AnimationHeader* animation, f32
|
|||||||
skelAnime->morphWeight = 0.0f;
|
skelAnime->morphWeight = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
skelAnime->animation = animation;
|
skelAnime->animation = ogAnim;
|
||||||
skelAnime->startFrame = startFrame;
|
skelAnime->startFrame = startFrame;
|
||||||
skelAnime->endFrame = endFrame;
|
skelAnime->endFrame = endFrame;
|
||||||
skelAnime->animLength = Animation_GetLength(animation);
|
skelAnime->animLength = Animation_GetLength(animation);
|
||||||
|
@ -142,7 +142,6 @@ typedef enum {
|
|||||||
/* 10 */ ENGO2_ANIM_10,
|
/* 10 */ ENGO2_ANIM_10,
|
||||||
/* 11 */ ENGO2_ANIM_11,
|
/* 11 */ ENGO2_ANIM_11,
|
||||||
/* 12 */ ENGO2_ANIM_12,
|
/* 12 */ ENGO2_ANIM_12,
|
||||||
/* 13 */ ENGO2_ANIM_13, // Added to fix spinning goron issue for biggoron
|
|
||||||
} EnGo2Animation;
|
} EnGo2Animation;
|
||||||
|
|
||||||
static AnimationInfo sAnimationInfo[] = {
|
static AnimationInfo sAnimationInfo[] = {
|
||||||
@ -152,7 +151,7 @@ static AnimationInfo sAnimationInfo[] = {
|
|||||||
{ &gGoronAnim_002D80, 1.0f, 0.0f, -1.0f, 0x02, -8.0f }, { &gGoronAnim_00161C, 1.0f, 0.0f, -1.0f, 0x00, -8.0f },
|
{ &gGoronAnim_002D80, 1.0f, 0.0f, -1.0f, 0x02, -8.0f }, { &gGoronAnim_00161C, 1.0f, 0.0f, -1.0f, 0x00, -8.0f },
|
||||||
{ &gGoronAnim_001A00, 1.0f, 0.0f, -1.0f, 0x00, -8.0f }, { &gGoronAnim_0021D0, 1.0f, 0.0f, -1.0f, 0x00, -8.0f },
|
{ &gGoronAnim_001A00, 1.0f, 0.0f, -1.0f, 0x00, -8.0f }, { &gGoronAnim_0021D0, 1.0f, 0.0f, -1.0f, 0x00, -8.0f },
|
||||||
{ &gGoronAnim_004930, 0.0f, 0.0f, -1.0f, 0x01, -8.0f }, { &gGoronAnim_000750, 1.0f, 0.0f, -1.0f, 0x00, -8.0f },
|
{ &gGoronAnim_004930, 0.0f, 0.0f, -1.0f, 0x01, -8.0f }, { &gGoronAnim_000750, 1.0f, 0.0f, -1.0f, 0x00, -8.0f },
|
||||||
{ &gGoronAnim_000D5C, 1.0f, 0.0f, -1.0f, 0x00, -8.0f }, { &gGoronAnim_004930, 0.0f, 1.0f, -1.0f, 0x01, 0.0f },
|
{ &gGoronAnim_000D5C, 1.0f, 0.0f, -1.0f, 0x00, -8.0f },
|
||||||
};
|
};
|
||||||
|
|
||||||
static EnGo2DustEffectData sDustEffectData[2][4] = {
|
static EnGo2DustEffectData sDustEffectData[2][4] = {
|
||||||
@ -1349,6 +1348,11 @@ void EnGo2_RollingAnimation(EnGo2* this, GlobalContext* globalCtx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EnGo2_WakeUp(EnGo2* this, GlobalContext* globalCtx) {
|
void EnGo2_WakeUp(EnGo2* this, GlobalContext* globalCtx) {
|
||||||
|
if (CVar_GetS32("gUnfixGoronSpin", 0)) {
|
||||||
|
// Trick SkelAnime into thinking the current animation is changing so that it morphs between the same position,
|
||||||
|
// making the goron do a spin
|
||||||
|
this->skelAnime.animation = NULL;
|
||||||
|
}
|
||||||
if (this->skelAnime.playSpeed == 0.0f) {
|
if (this->skelAnime.playSpeed == 0.0f) {
|
||||||
if ((this->actor.params & 0x1F) != GORON_DMT_BIGGORON) {
|
if ((this->actor.params & 0x1F) != GORON_DMT_BIGGORON) {
|
||||||
Audio_PlayActorSound2(&this->actor, NA_SE_EN_GOLON_WAKE_UP);
|
Audio_PlayActorSound2(&this->actor, NA_SE_EN_GOLON_WAKE_UP);
|
||||||
@ -1358,25 +1362,10 @@ void EnGo2_WakeUp(EnGo2* this, GlobalContext* globalCtx) {
|
|||||||
}
|
}
|
||||||
if ((this->actor.params & 0x1F) == GORON_DMT_BIGGORON) {
|
if ((this->actor.params & 0x1F) == GORON_DMT_BIGGORON) {
|
||||||
OnePointCutscene_Init(globalCtx, 4200, -99, &this->actor, MAIN_CAM);
|
OnePointCutscene_Init(globalCtx, 4200, -99, &this->actor, MAIN_CAM);
|
||||||
// There is an issue interpolating between ENGO2_ANIM_0 and ENGO2_ANIM_1/10, the goron
|
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENGO2_ANIM_10);
|
||||||
// is technically in the same position at the end of ANIM_0 and beginning of ANIM_1/10
|
|
||||||
// but something isn't getting translated correctly causing the 360 degree spin before
|
|
||||||
// then continuing the wake up animation like normal. One solution is to use ANIM_0
|
|
||||||
// which uses the same frame data as ANIM_1/10 but no morph frames, but only when the
|
|
||||||
// current animation frame is at 0, meaning no morphing is necessary anyway.
|
|
||||||
// ANIM_13 is ANIM_0 but with the startFrame and mode adjusted for biggoron.
|
|
||||||
if (this->skelAnime.curFrame == 0.0f && !CVar_GetS32("gUnfixGoronSpin", 0)) {
|
|
||||||
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENGO2_ANIM_13);
|
|
||||||
} else {
|
|
||||||
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENGO2_ANIM_10);
|
|
||||||
}
|
|
||||||
this->skelAnime.playSpeed = 0.5f;
|
this->skelAnime.playSpeed = 0.5f;
|
||||||
} else {
|
} else {
|
||||||
if (this->skelAnime.curFrame == 0.0f && !CVar_GetS32("gUnfixGoronSpin", 0)) {
|
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENGO2_ANIM_1);
|
||||||
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENGO2_ANIM_0);
|
|
||||||
} else {
|
|
||||||
Animation_ChangeByInfo(&this->skelAnime, sAnimationInfo, ENGO2_ANIM_1);
|
|
||||||
}
|
|
||||||
this->skelAnime.playSpeed = 1.0f;
|
this->skelAnime.playSpeed = 1.0f;
|
||||||
}
|
}
|
||||||
this->actionFunc = func_80A46B40;
|
this->actionFunc = func_80A46B40;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user