Files
tww/src/JSystem/JAudio/JAIAnimation.cpp
T
2025-04-03 15:47:28 -04:00

263 lines
10 KiB
C++

//
// Generated by dtk
// Translation Unit: JAIAnimation.cpp
//
#include "JSystem/JAudio/JAIAnimation.h"
#include "JSystem/JAudio/JAIBasic.h"
#include "JSystem/JAudio/JAIConst.h"
#include "JSystem/JAudio/JAISound.h"
/* 8028F08C-8028F110 .text __ct__13JAIAnimeSoundFv */
JAIAnimeSound::JAIAnimeSound() {
field_0x60 = 0;
field_0x64 = 0;
field_0x68 = 0;
field_0x6c = 0;
for (u8 i = 0; i < 8; i++) {
mSlots[i].mpSound = NULL;
mSlots[i].mbIsPlaying = false;
}
for (u8 i = 0; i < 2; i++) {
field_0x70[i] = NULL;
}
dataCounter = 0;
mLoopCount = 0;
}
/* 8028F110-8028F268 .text initActorAnimSound__13JAIAnimeSoundFPvUlf */
void JAIAnimeSound::initActorAnimSound(void* _asdata, u32 direction, f32 loopEnd) {
u32 i = 0;
mpAsData = (JAIAnimeSoundData*)_asdata;
if (mpAsData != NULL) {
dataCounter = 0;
mDataCounterInc = direction;
for (; i < mpAsData->datas; i++) {
if (mpAsData->mAfsData[i].mStartFrame >= loopEnd) {
break;
}
}
if (direction == 1) {
dataCounter = 0;
mDataCounterLimit = i;
mCurrentTime = 0.0f;
mLoopCount = 0;
} else {
dataCounter = i;
mDataCounterLimit = 0;
mCurrentTime = 0.0f;
mLoopCount = -1;
}
}
for (u8 i = 0; i < ARRAY_SIZE(mSlots); i++) {
JAISound* sound = mSlots[i].mpSound;
JAIAnimeFrameSoundData* _afsdata = (JAIAnimeFrameSoundData*)mSlots[i].mpAfsData;
if (sound != NULL && (_afsdata->mPlayFlags & 4)) {
sound->stop(1);
mSlots[i].mbIsPlaying = 0;
}
if (sound == NULL) {
mSlots[i].mbIsPlaying = 0;
} else if (!(sound->mSoundID & 0xc00)) {
sound->stop(0);
mSlots[i].mbIsPlaying = 0;
} else {
mSlots[i].mbIsPlaying = 2;
}
}
}
/* 8028F268-8028F2A0 .text setAnimSoundVec__13JAIAnimeSoundFP8JAIBasicP3VecffUlUc */
void JAIAnimeSound::setAnimSoundVec(JAIBasic* basic, Vec* r5, f32 currentFrame, f32 speed, u32 r6, u8 ownerID) {
JAInter::Actor actor(r5, r5, (u32)r5, (void*)r6);
setAnimSoundActor(basic, &actor, currentFrame, speed, ownerID);
}
/* 8028F2A0-8028F7B8 .text setAnimSoundActor__13JAIAnimeSoundFP8JAIBasicPQ27JAInter5ActorffUc */
void JAIAnimeSound::setAnimSoundActor(JAIBasic* basic, JAInter::Actor* actor, f32 currentFrame, f32 speed, u8 ownerID) {
JAIAnimeSoundData* _asdata = mpAsData;
if (!_asdata) {
return;
}
int entries = _asdata->datas;
if (mDataCounterInc == 1) {
if (mCurrentTime > currentFrame) {
while (dataCounter < entries && _asdata->mAfsData[dataCounter].mStartFrame <= mCurrentTime + speed) {
playActorAnimSound(basic, actor, speed, ownerID);
}
dataCounter = mDataCounterLimit;
mCurrentTime = currentFrame;
if (mLoopCount < 256) {
mLoopCount++;
}
}
for (u8 i = 0; i < ARRAY_SIZE(mSlots); i++) {
JAISound** se = &mSlots[i].mpSound;
if (mSlots[i].mbIsPlaying == 1) {
JAIAnimeFrameSoundData* _afsdata = mSlots[i].mpAfsData;
JUT_ASSERT_MSG(157, _afsdata, "JAIAnimeSound::setAnimSoundActor 正方向再生中にafsDataがNULLに!!\n");
if (!(_afsdata->mSoundID & 0xc00)) {
if (speed != 0.0f || !(_afsdata->mPlayFlags & 0x20)) {
if (_afsdata->mStartFrame == _afsdata->mEndFrame ||
(_afsdata->mStartFrame < _afsdata->mEndFrame && _afsdata->mEndFrame > currentFrame &&
_afsdata->mStartFrame <= currentFrame) ||
(_afsdata->mStartFrame > _afsdata->mEndFrame &&
(_afsdata->mEndFrame > currentFrame || _afsdata->mStartFrame < currentFrame)))
{
startAnimSound(basic, _afsdata->mSoundID, se, actor, ownerID);
} else {
mSlots[i].mbIsPlaying = 0;
if (*se) {
(*se)->stop(0);
}
}
}
}
if (*se) {
setSpeedModifySound(*se, _afsdata, speed);
if (_afsdata->mPlayFlags & 0x10 && _afsdata->mEndFrame <= currentFrame) {
(*se)->stop(1);
}
}
}
}
while (dataCounter < entries && (_asdata->mAfsData[dataCounter].mStartFrame) <= currentFrame) {
playActorAnimSound(basic, actor, speed, ownerID);
}
} else {
if (mCurrentTime < currentFrame) {
while (dataCounter < entries && _asdata->mAfsData[dataCounter].mStartFrame >= mCurrentTime - speed) {
playActorAnimSound(basic, actor, speed, ownerID);
}
dataCounter = entries - 1;
mCurrentTime = currentFrame;
if (mLoopCount == -1 || mLoopCount < 256) {
mLoopCount++;
}
}
for (u8 i = 0; i < ARRAY_SIZE(mSlots); i++) {
JAISound** se = &mSlots[i].mpSound;
if (mSlots[i].mbIsPlaying == 1) {
JAIAnimeFrameSoundData* _afsdata = mSlots[i].mpAfsData;
JUT_ASSERT_MSG(224, _afsdata, "JAIAnimeSound::setAnimSoundActor 逆方向再生中にafsDataがNULLに!!\n");
if (!(_afsdata->mSoundID & 0xc00)) {
if (speed != 0.0f || !(_afsdata->mPlayFlags & 0x20)) {
if (_afsdata->mStartFrame == _afsdata->mEndFrame ||
(_afsdata->mStartFrame > _afsdata->mEndFrame && _afsdata->mEndFrame < currentFrame &&
_afsdata->mStartFrame > currentFrame) ||
(_afsdata->mStartFrame < _afsdata->mEndFrame &&
(_afsdata->mEndFrame < currentFrame || _afsdata->mStartFrame > currentFrame)))
{
startAnimSound(basic, _afsdata->mSoundID, se, actor, ownerID);
} else {
mSlots[i].mbIsPlaying = 0;
if (*se) {
(*se)->stop(0);
}
}
}
}
if (*se) {
setSpeedModifySound(*se, _afsdata, speed);
if (_afsdata->mPlayFlags & 0x10 && _afsdata->mEndFrame >= currentFrame) {
(*se)->stop(1);
}
}
}
}
while (dataCounter < entries && (_asdata->mAfsData[dataCounter].mStartFrame) >= currentFrame) {
playActorAnimSound(basic, actor, speed, ownerID);
}
}
mCurrentTime = currentFrame;
}
/* 8028F7B8-8028FA60 .text playActorAnimSound__13JAIAnimeSoundFP8JAIBasicPQ27JAInter5ActorfUc */
void JAIAnimeSound::playActorAnimSound(JAIBasic* basic, JAInter::Actor* actor, f32 pitch, u8 r28) {
u8 i = 0;
JAIAnimeSoundData* _asdata = mpAsData;
JUT_ASSERT_MSG(274, (dataCounter>=0 && dataCounter<_asdata->datas), "JAIAnimeSound::playActorAnimSound dataCounterが異常です。\n");
JAIAnimeFrameSoundData* _afsdata = &_asdata->mAfsData[dataCounter];
while (i < ARRAY_SIZE(mSlots)) {
if (!mSlots[i].mbIsPlaying) {
break;
}
if (mSlots[i].mpSound && mSlots[i].mpSound->getID() != _afsdata->mSoundID) {
i++;
continue;
} else if (!(_afsdata->mSoundID & 0xc00)) {
dataCounter += mDataCounterInc;
return;
} else {
break;
}
}
if (i != ARRAY_SIZE(mSlots) && (!(_afsdata->mPlayFlags & 8) || mLoopCount == _afsdata->mLoopCount) &&
((mDataCounterInc == 1 && !(_afsdata->mPlayFlags & 2)) || (mDataCounterInc == -1 && !(_afsdata->mPlayFlags & 1))))
{
JAISound** se = &mSlots[i].mpSound;
startAnimSound(basic, _afsdata->mSoundID, se, actor, r28);
if (*se) {
mSlots[i].mpAfsData = _afsdata;
mSlots[i].mbIsPlaying = 1;
(*se)->setVolume(_afsdata->mVolume / 127.0f, 0, SOUNDPARAM_Unk5);
(*se)->setPitch((_afsdata->mPitchFactor * (pitch - 1.0f)) / 32 + _afsdata->mPitch, 0, SOUNDPARAM_Unk5);
(*se)->setPan(_afsdata->mPanning / 127.0f, 0, SOUNDPARAM_Unk5);
}
}
dataCounter += mDataCounterInc;
}
/* 8028FA60-8028FA94 .text startAnimSound__13JAIAnimeSoundFPvUlPP8JAISoundPQ27JAInter5ActorUc */
void JAIAnimeSound::startAnimSound(void* param_1, u32 param_2, JAISound** param_3, JAInter::Actor* param_4, u8 param_5) {
JAIBasic* basic = (JAIBasic*)param_1;
basic->startSoundActor(param_2, param_3, param_4, 0, param_5);
}
/* 8028FA94-8028FBE0 .text setSpeedModifySound__13JAIAnimeSoundFP8JAISoundP22JAIAnimeFrameSoundDataf */
void JAIAnimeSound::setSpeedModifySound(JAISound* sound, JAIAnimeFrameSoundData* _afsdata, f32 speed) {
f32 adjustedPitch = _afsdata->mPitch;
if (_afsdata->mPitchFactor) {
f32 speedOffset = speed - 1.0f;
adjustedPitch += ((f32)_afsdata->mPitchFactor * speedOffset) / 32;
}
sound->setPitch(adjustedPitch, 0, SOUNDPARAM_Unk5);
s16 adjustedVolume = _afsdata->mVolume;
if (_afsdata->mPitchFactor) {
s16 volumeOffset = (f32)_afsdata->mVolumeFactor * 2 * (speed - 1.0f);
adjustedVolume += volumeOffset;
if (adjustedVolume > 127) {
adjustedVolume = 127;
} else if (adjustedVolume < 0) {
adjustedVolume = 0;
}
}
sound->setVolumeU7(adjustedVolume, 0, SOUNDPARAM_Unk5);
}
/* 8028FBE0-8028FC48 .text stop__13JAIAnimeSoundFv */
void JAIAnimeSound::stop() {
for (u8 i = 0; i < 8; i++) {
if (mSlots[i].mpSound) {
mSlots[i].mpSound->stop(0);
}
}
}