diff options
Diffstat (limited to 'src/Z2AudioLib/Z2Audience.cpp')
| -rw-r--r-- | src/Z2AudioLib/Z2Audience.cpp | 549 |
1 files changed, 285 insertions, 264 deletions
diff --git a/src/Z2AudioLib/Z2Audience.cpp b/src/Z2AudioLib/Z2Audience.cpp index 8a200729ba..a2491c9762 100644 --- a/src/Z2AudioLib/Z2Audience.cpp +++ b/src/Z2AudioLib/Z2Audience.cpp @@ -1,8 +1,3 @@ -// -// Generated By: dol2asm -// Translation Unit: Z2Audience -// - #include "Z2AudioLib/Z2Audience.h" #include "Z2AudioLib/Z2SoundInfo.h" #include "Z2AudioLib/Z2Calc.h" @@ -15,134 +10,146 @@ /* 802BBCDC-802BBD18 2B661C 003C+00 1/1 0/0 0/0 .text * calc__15Z2AudibleAbsPosFRCQ29JGeometry8TVec3<f> */ -void Z2AudibleAbsPos::calc(JGeometry::TVec3<f32> const& param_0) { - field_0xc.sub(param_0, field_0x0); - field_0x0.set(param_0); +void Z2AudibleAbsPos::calc(const JGeometry::TVec3<f32>& pos) { + velocity_.sub(pos, field_0x0); + field_0x0.set(pos); } /* 802BBD18-802BBD94 2B6658 007C+00 1/1 0/0 0/0 .text * init__15Z2AudibleAbsPosFPQ29JGeometry8TVec3<f>RCQ29JGeometry8TVec3<f>PCQ29JGeometry8TVec3<f> */ -void Z2AudibleAbsPos::init(JGeometry::TVec3<f32>* param_0, JGeometry::TVec3<f32> const& param_1, - JGeometry::TVec3<f32> const* param_2) { +void Z2AudibleAbsPos::init(JGeometry::TVec3<f32>* param_0, const JGeometry::TVec3<f32>& param_1, + const JGeometry::TVec3<f32>* param_2) { param_0->set(param_1); + if (param_2 != NULL) { field_0x0.set(*param_2); - field_0xc.sub(param_1, field_0x0); - return; + velocity_.sub(param_1, field_0x0); + } else { + field_0x0.set(param_1); + velocity_.zero(); } - field_0x0.set(param_1); - field_0xc.zero(); } /* 802BBD94-802BBE74 2B66D4 00E0+00 1/1 0/0 0/0 .text * __ct__9Z2AudibleFRCQ29JGeometry8TVec3<f>PCQ29JGeometry8TVec3<f>Ulb */ -Z2Audible::Z2Audible(JGeometry::TVec3<f32> const& param_0, JGeometry::TVec3<f32> const* param_1, - u32 param_2, bool param_3) { - field_0x10.field_0x0.raw = 0xffffffff; - field_0x14.init(&mPos, param_0, param_1); +Z2Audible::Z2Audible(const JGeometry::TVec3<f32>& pos, const JGeometry::TVec3<f32>* param_1, + u32 channel, bool param_3) { + mParam.field_0x0.raw = 0xFFFFFFFF; + mAbsPos.init(&mPos, pos, param_1); + for (int i = 0; i < 1; i++) { - if ((param_2 & (1 << i)) == 0) { - field_0x2c[i].init(); + if ((channel & (1 << i)) == 0) { + mChannel[i].init(); } } + for (int i = 0; i < 1; i = i + 1) { field_0x64[i] = 0.0f; } } - /* 802BBE74-802BBE98 2B67B4 0024+00 1/1 0/0 0/0 .text __ct__16Z2AudibleChannelFv */ -Z2AudibleChannel::Z2AudibleChannel() { -} - +Z2AudibleChannel::Z2AudibleChannel() {} /* 802BBE98-802BBED0 2B67D8 0038+00 1/0 0/0 0/0 .text calc__9Z2AudibleFv */ void Z2Audible::calc() { if (isDoppler()) { - field_0x14.calc(mPos); + mAbsPos.calc(mPos); } } /* 802BBED0-802BBEE4 2B6810 0014+00 1/0 0/0 0/0 .text getOuterParams__9Z2AudibleFi */ -JASSoundParams* Z2Audible::getOuterParams(int param_0) { - return &field_0x2c[param_0].field_0x0; +JASSoundParams* Z2Audible::getOuterParams(int index) { + JUT_ASSERT(80, index >= 0); + JUT_ASSERT(81, index < 1); + return &mChannel[index].mParams; } /* 802BBEE4-802BC204 2B6824 0320+00 1/1 0/0 0/0 .text * setOuterParams__9Z2AudibleFRC14JASSoundParamsRC14JASSoundParamsi */ -void Z2Audible::setOuterParams(JASSoundParams const& param_0, JASSoundParams const& param_1, - int index) { +void Z2Audible::setOuterParams(const JASSoundParams& outParams, const JASSoundParams& inParams, + int index) { JUT_ASSERT(89, index >= 0); JUT_ASSERT(90, index < 1); - Z2AudibleChannel* this_01 = &field_0x2c[index]; - u8 iStack_94 = (field_0x10.field_0x0.half.f1 & 0xf00) >> 8; + + Z2AudibleChannel* channel = &mChannel[index]; + u8 iStack_94 = (mParam.field_0x0.half.f1 & 0xf00) >> 8; if (iStack_94 == 0) { - this_01->field_0x0.combine(param_0, param_1); + channel->mParams.combine(outParams, inParams); return; } - if (this_01->field_0x28 < 0.0f) { - this_01->field_0x28 = 1.0f; - this_01->mPan = param_1.mPan; - this_01->mDolby = param_1.mDolby; - this_01->field_0x0.combine(param_0, param_1); + if (channel->field_0x28 < 0.0f) { + channel->field_0x28 = 1.0f; + channel->mPan = inParams.mPan; + channel->mDolby = inParams.mDolby; + channel->mParams.combine(outParams, inParams); return; } - JASSoundParams local_b0; - local_b0.mFxMix = param_1.mFxMix; - local_b0.mPitch = param_1.mPitch; + JASSoundParams params; + params.mFxMix = inParams.mFxMix; + params.mPitch = inParams.mPitch; JGeometry::TVec2<f32> local_b8; - local_b8.x = param_1.mPan - this_01->mPan; - local_b8.y = param_1.mDolby - this_01->mDolby; - f32 dVar9 = param_1.mVolume * local_b8.length(); + local_b8.x = inParams.mPan - channel->mPan; + local_b8.y = inParams.mDolby - channel->mDolby; + + f32 dVar9 = inParams.mVolume * local_b8.length(); f32 dVar10 = 1.0f; f32 dVar12 = Z2Calc::linearTransform(iStack_94, 0.0f, 15.0f, 1.0f, 0.3f, true); - if (param_1.mVolume > dVar12 && dVar9 > 0.001f) { + if (inParams.mVolume > dVar12 && dVar9 > 0.001f) { dVar10 = Z2Calc::getParamByExp(dVar9, 0.3f, 0.001f, 0.1f, dVar12, 1.0f, - Z2Calc::CURVE_SIGN_1); + Z2Calc::CURVE_POSITIVE); if (dVar10 < 0.0f) { dVar10 = 0.0f; } } - f32 dVar15 = dVar10 - this_01->field_0x28; + + f32 dVar15 = dVar10 - channel->field_0x28; f32 dVar11 = 1.0f; if (dVar15 > 0.0f) { - dVar11 = Z2Calc::getParamByExp(J3DUD::JMAAbs(dVar15), 1.0f, 0.0f, 0.1f, 0.1f, 0.5f, Z2Calc::CURVE_SIGN_1); + dVar11 = Z2Calc::getParamByExp(J3DUD::JMAAbs(dVar15), 1.0f, 0.0f, 0.1f, 0.1f, 0.5f, Z2Calc::CURVE_POSITIVE); } else { - dVar11 = Z2Calc::getParamByExp(J3DUD::JMAAbs(dVar15), -1.0f, 0.0f, 0.1f, 1.0f / 30.0f, 0.5f, Z2Calc::CURVE_SIGN_1); + dVar11 = Z2Calc::getParamByExp(J3DUD::JMAAbs(dVar15), -1.0f, 0.0f, 0.1f, 1.0f / 30.0f, 0.5f, Z2Calc::CURVE_POSITIVE); } - dVar10 = this_01->field_0x28 + (dVar15 * dVar11); + + dVar10 = channel->field_0x28 + (dVar15 * dVar11); if (dVar10 < 0.0f) { dVar10 = 0.0f; } else if (dVar10 > 1.0f) { dVar10 = 1.0f; } - local_b0.mVolume = param_1.mVolume * dVar10; - this_01->field_0x28 = dVar10; - f32 dVar13 = Z2Calc::getParamByExp(local_b0.mVolume * J3DUD::JMAAbs(local_b8.x), 1.0f, 0.0f, 0.1f, - 1.0f / 30.0f, 1.0 / 3.0f, Z2Calc::CURVE_SIGN_1); - f32 dVar14 = Z2Calc::getParamByExp(local_b0.mVolume * J3DUD::JMAAbs(local_b8.y), 1.0f, + + params.mVolume = inParams.mVolume * dVar10; + channel->field_0x28 = dVar10; + + f32 dVar13 = Z2Calc::getParamByExp(params.mVolume * J3DUD::JMAAbs(local_b8.x), 1.0f, 0.0f, 0.1f, + 1.0f / 30.0f, 1.0 / 3.0f, Z2Calc::CURVE_POSITIVE); + f32 dVar14 = Z2Calc::getParamByExp(params.mVolume * J3DUD::JMAAbs(local_b8.y), 1.0f, 0.0f, 0.1f, - 1.0f / 30.0f, 1.0f / 3.0f, Z2Calc::CURVE_SIGN_1); + 1.0f / 30.0f, 1.0f / 3.0f, Z2Calc::CURVE_POSITIVE); if (dVar13 > 1.0f / 3.0f) { dVar13 = 1.0f / 3.0f; } if (dVar14 > 1.0f / 3.0f) { dVar14 = 1.0f / 3.0f; } - local_b0.mPan = this_01->mPan + (local_b8.x * dVar13); - local_b0.mDolby = this_01->mDolby + (local_b8.y * dVar14); - local_b0.clamp(); - this_01->field_0x0.combine(param_0, local_b0); - this_01->mPan = local_b0.mPan; - this_01->mDolby = local_b0.mDolby; + + params.mPan = channel->mPan + (local_b8.x * dVar13); + params.mDolby = channel->mDolby + (local_b8.y * dVar14); + params.clamp(); + + channel->mParams.combine(outParams, params); + channel->mPan = params.mPan; + channel->mDolby = params.mDolby; } /* 802BC204-802BC218 2B6B44 0014+00 4/4 0/0 0/0 .text getChannel__9Z2AudibleFi */ -Z2AudibleChannel* Z2Audible::getChannel(int param_0) { - return &field_0x2c[param_0]; +Z2AudibleChannel* Z2Audible::getChannel(int index) { + JUT_ASSERT(220, index >= 0); + JUT_ASSERT(221, index < 1); + return &mChannel[index]; } /* 802BC218-802BC248 2B6B58 0030+00 3/3 0/0 0/0 .text getDistVolBit__9Z2AudibleFv */ @@ -156,6 +163,7 @@ u32 Z2Audible::getDistVolBit() { return ((int)(uVar1 & 0x70) >> 4) + 7; } } + return 0; } @@ -178,6 +186,7 @@ void Z2Audience3DSetting::init() { field_0x64 = 0xff; field_0x5c = Z2Param::SONIC_SPEED; field_0x60 = 1.5f; + initVolumeDist(); initDolbyDist(); } @@ -188,9 +197,11 @@ void Z2Audience3DSetting::initVolumeDist() { field_0x0[0] = Z2Param::DISTANCE_MAX; field_0x3c = Z2Param::MAX_VOLUME_DISTANCE; + calcVolumeFactorAll(); calcPriorityFactorAll(); calcFxMixFactorAll(); + mVolumeDistInit = true; } @@ -200,14 +211,17 @@ static f32 cNearFarRatio = Z2Param::MAX_VOLUME_DISTANCE / Z2Param::DISTANCE_MAX; /* 802BC4D0-802BC6A4 2B6E10 01D4+00 1/1 0/0 0/0 .text updateVolumeDist__19Z2Audience3DSettingFf */ void Z2Audience3DSetting::updateVolumeDist(f32 param_0) { field_0x0[0] = param_0; + if (param_0 > Z2Param::DISTANCE_MAX) { field_0x3c = cNearFarRatio * param_0; } else { field_0x3c = Z2Param::MAX_VOLUME_DISTANCE; } + calcVolumeFactorAll(); calcPriorityFactorAll(); calcFxMixFactorAll(); + mVolumeDistInit = false; } @@ -229,14 +243,17 @@ void Z2Audience3DSetting::updateDolbyDist(f32 param_0, f32 param_1) { } else { field_0x44 = Z2Param::DOLBY_FLONT_DISTANCE_MAX; } + if (param_1 < 2.0f * field_0x44) { param_1 = 2.0f * field_0x44; } + if (param_1 > Z2Param::DOLBY_BEHIND_DISTANCE_MAX) { field_0x48 = param_1; } else { field_0x48 = Z2Param::DOLBY_BEHIND_DISTANCE_MAX; } + mDolbyDistInit = false; } @@ -263,26 +280,27 @@ void Z2AudioCamera::init() { /* 802BC7DC-802BC8AC 2B711C 00D0+00 2/2 0/0 0/0 .text setCameraState__13Z2AudioCameraFPA4_CfR3Vecb */ -void Z2AudioCamera::setCameraState(f32 const (*param_0)[4], Vec& param_1, bool param_2) { +void Z2AudioCamera::setCameraState(f32 const (*param_0)[4], Vec& pos, bool param_2) { field_0x0.set(param_0); if (param_2) { - mPos.set(param_1); + mPos.set(pos); field_0x48.set(mPos); mVel.zero(); } else { field_0x48.set(mPos); - mPos.set(param_1); + mPos.set(pos); mVel.sub(mPos, field_0x48); } } /* 802BC8AC-802BCBEC 2B71EC 0340+00 1/1 0/0 0/0 .text * setCameraState__13Z2AudioCameraFPA4_fR3VecR3Vecffbb */ -void Z2AudioCamera::setCameraState(f32 (*param_0)[4], Vec& param_1, Vec& param_2, f32 param_3, - f32 param_4, bool param_5, bool param_6) { +void Z2AudioCamera::setCameraState(f32 (*param_0)[4], Vec& pos, Vec& param_2, f32 param_3, + f32 param_4, bool param_5, bool param_6) { JGeometry::TVec3<f32> aTStack_c0; - VECSubtract(¶m_2, ¶m_1, aTStack_c0); + VECSubtract(¶m_2, &pos, (Vec*)&aTStack_c0); mCamDist = aTStack_c0.length(); + f32 dVar10 = 0.5f * param_3; mFovySin = JMASinDegree(dVar10); f32 fVar8 = JMACosDegree(dVar10); @@ -302,8 +320,7 @@ void Z2AudioCamera::setCameraState(f32 (*param_0)[4], Vec& param_1, Vec& param_2 } if (mSetMainCamera && mTargetVolume > 0.0f) { - if (dVar11 > (Z2Param::DISTANCE_MAX * (1.0f - mTargetVolume))) - { + if (dVar11 > (Z2Param::DISTANCE_MAX * (1.0f - mTargetVolume))) { Z2GetAudience()->getSetting()->updateVolumeDist(dVar11 / (1.0f - mTargetVolume)); } else { Z2GetAudience()->getSetting()->initVolumeDist(); @@ -327,30 +344,36 @@ void Z2AudioCamera::setCameraState(f32 (*param_0)[4], Vec& param_1, Vec& param_2 Z2GetAudience()->getSetting()->updateDolbyDist(mCamDist - mDolbyCenterZ, mCamDist + mDolbyCenterZ); } } - setCameraState(param_0, param_1, param_6); + + setCameraState(param_0, pos, param_6); } /* 802BCBEC-802BCC7C 2B752C 0090+00 2/2 0/0 0/0 .text * convertAbsToRel__13Z2AudioCameraFP9Z2Audiblei */ -void Z2AudioCamera::convertAbsToRel(Z2Audible* param_0, int param_1) { - Z2AudibleChannel* iVar2 = param_0->getChannel(param_1); - if (iVar2 == NULL) { +void Z2AudioCamera::convertAbsToRel(Z2Audible* audible, int channelNum) { + JUT_ASSERT(508, audible); + JUT_ASSERT(509, channelNum >= 0); + JUT_ASSERT(510, channelNum < 1); + + Z2AudibleChannel* channel = audible->getChannel(channelNum); + if (channel == NULL) { return; } - Z2AudibleRelPos* relPos = &iVar2->field_0x14; - MTXMultVec(field_0x0, param_0->mPos, relPos->field_0x00); + + Z2AudibleRelPos* relPos = &channel->field_0x14; + MTXMultVec(field_0x0, (Vec*)&audible->getPos(), (Vec*)&relPos->field_0x00); relPos->field_0xC = relPos->field_0x00.length(); - JGeometry::TVec3<f32> aTStack_38; - JGeometry::setTVec3f(*(Vec*)&relPos->field_0x00, *(Vec*)&aTStack_38); + + JGeometry::TVec3<f32> aTStack_38(relPos->field_0x00); aTStack_38.z += mVolCenterZ; relPos->field_0x10 = aTStack_38.length(); } /* 802BCC7C-802BCCC0 2B75BC 0044+00 2/2 0/0 0/0 .text convertAbsToRel__13Z2AudioCameraCFR3VecP3Vec */ -bool Z2AudioCamera::convertAbsToRel(Vec& param_0, Vec* param_1) const { - MTXMultVec(field_0x0, ¶m_0, param_1); - return isInSight(*param_1); +bool Z2AudioCamera::convertAbsToRel(Vec& src, Vec* dst) const { + MTXMultVec(field_0x0, &src, dst); + return isInSight(*dst); } /* 802BCCC0-802BCD28 2B7600 0068+00 1/1 0/0 0/0 .text isInSight__13Z2AudioCameraCFR3Vec @@ -360,15 +383,11 @@ bool Z2AudioCamera::isInSight(Vec& param_0) const { return false; } - f32 zabs = J3DUD::JMAAbs(param_0.z); - f32 xabs = J3DUD::JMAAbs(param_0.x); - - if (xabs > field_0x68 * zabs) { + if (J3DUD::JMAAbs(param_0.x) > field_0x68 * J3DUD::JMAAbs(param_0.z)) { return false; } - f32 yabs = J3DUD::JMAAbs(param_0.y); - if (yabs > field_0x6c * zabs) { + if (J3DUD::JMAAbs(param_0.y) > field_0x6c * J3DUD::JMAAbs(param_0.z)) { return false; } @@ -385,67 +404,75 @@ Z2SpotMic::Z2SpotMic() { mIgnoreIfOut = true; mMicOn = true; field_0x1c = 255.0f / (field_0x4 - field_0x0); - clearMicState(0); + + for (int i = 0; i < 1; i++) { + clearMicState(i); + } } /* 802BCDA8-802BCDE8 2B76E8 0040+00 2/2 0/0 0/0 .text clearMicState__9Z2SpotMicFi */ -void Z2SpotMic::clearMicState(int param_0) { - field_0x10[param_0] = NULL; - field_0x18[param_0] = field_0xc; - field_0x26[param_0] = 0; - calcVolumeFactor(param_0); +void Z2SpotMic::clearMicState(int camID) { + field_0x10[camID] = NULL; + field_0x18[camID] = field_0xc; + field_0x26[camID] = 0; + calcVolumeFactor(camID); } /* 802BCDE8-802BCE14 2B7728 002C+00 2/2 0/0 0/0 .text calcVolumeFactor__9Z2SpotMicFi */ -void Z2SpotMic::calcVolumeFactor(int param_0) { - field_0x20[param_0] = (field_0x8 - field_0x18[param_0]) / (field_0x4 - field_0x0); +void Z2SpotMic::calcVolumeFactor(int camID) { + field_0x20[camID] = (field_0x8 - field_0x18[camID]) / (field_0x4 - field_0x0); } /* 802BCE14-802BCF5C 2B7754 0148+00 1/1 0/0 0/0 .text setMicState__9Z2SpotMicFP13Z2AudioCamerai */ -void Z2SpotMic::setMicState(Z2AudioCamera* param_0, int param_1) { - if (mMicOn && mPosPtr != 0 && param_0 != NULL) { - clearMicState(param_1); +void Z2SpotMic::setMicState(Z2AudioCamera* camera, int camID) { + JUT_ASSERT(622, camID >= 0); + JUT_ASSERT(623, camID < 1); + + if (mMicOn && mPosPtr != 0 && camera != NULL) { + clearMicState(camID); JGeometry::TVec3<f32> aVStack_58; - field_0x26[param_1] = param_0->convertAbsToRel(*mPosPtr, aVStack_58); - if (!mIgnoreIfOut || field_0x26[param_1]) { - field_0x10[param_1] = param_0; - aVStack_58.z = aVStack_58[0].z + param_0->getVolCenterZ(); + field_0x26[camID] = camera->convertAbsToRel(*mPosPtr, (Vec*)&aVStack_58); + if (!mIgnoreIfOut || field_0x26[camID]) { + field_0x10[camID] = camera; + aVStack_58.z += camera->getVolCenterZ(); + f32 dVar10 = aVStack_58.length(); f32 dVar11 = Z2GetAudience()->getSetting()->field_0x0[0]; f32 dVar12 = Z2GetAudience()->getSetting()->field_0x3c; if (dVar10 > dVar11) { - field_0x18[param_1] = field_0xc; + field_0x18[camID] = field_0xc; } else { if (dVar10 < dVar12) { - field_0x18[param_1] = 1.0f; + field_0x18[camID] = 1.0f; } else { - field_0x18[param_1] = JGeometry::TUtil<f32>::clamp( + field_0x18[camID] = JGeometry::TUtil<f32>::clamp( 1.0f + ((field_0xc - 1.0f) / (dVar11 - dVar12)) * (dVar10 - dVar12), 0.0f, 1.0f); } } - calcVolumeFactor(param_1); + + calcVolumeFactor(camID); } } } /* 802BCF5C-802BCFE4 2B789C 0088+00 2/2 0/0 0/0 .text calcMicDist__9Z2SpotMicFP9Z2Audible */ -f32 Z2SpotMic::calcMicDist(Z2Audible* param_0) { +f32 Z2SpotMic::calcMicDist(Z2Audible* audible) { if (!mMicOn) { return 0.0f; } if (mPosPtr == NULL) { return 0.0f; } - if (param_0 == NULL) { + if (audible == NULL) { return 0.0f; } JGeometry::TVec3<f32> aTStack_1c; - JGeometry::TVec3<f32> aTStack_28; - JGeometry::setTVec3f(*mPosPtr, *(Vec*)&aTStack_28); - aTStack_1c.sub(param_0->getPos(), aTStack_28); + JGeometry::TVec3<f32> aTStack_28(*mPosPtr); + + aTStack_1c.sub(audible->getPos(), aTStack_28); return aTStack_1c.length(); } @@ -463,7 +490,10 @@ u32 Z2SpotMic::calcMicPriority(f32 param_0) { } /* 802BD03C-802BD130 2B797C 00F4+00 1/1 0/0 0/0 .text calcMicVolume__9Z2SpotMicFfif */ -f32 Z2SpotMic::calcMicVolume(f32 param_0, int param_1, f32 param_2) { +f32 Z2SpotMic::calcMicVolume(f32 param_0, int camID, f32 param_2) { + JUT_ASSERT(687, camID >= 0); + JUT_ASSERT(688, camID < 1); + if (mMicOn == NULL) { return param_2; } @@ -472,11 +502,11 @@ f32 Z2SpotMic::calcMicVolume(f32 param_0, int param_1, f32 param_2) { return param_2; } - if (field_0x10[param_1] == NULL) { + if (field_0x10[camID] == NULL) { return param_2; } - if (mIgnoreIfOut && field_0x26[param_1] == 0) { + if (mIgnoreIfOut && field_0x26[camID] == 0) { return param_2; } @@ -484,17 +514,17 @@ f32 Z2SpotMic::calcMicVolume(f32 param_0, int param_1, f32 param_2) { return -1.0f; } - if (param_2 >= field_0x18[param_1]) { + if (param_2 >= field_0x18[camID]) { return param_2; } if (param_0 < field_0x0) { - return field_0x18[param_1]; + return field_0x18[camID]; } f32 dVar7 = JGeometry::TUtil<f32>::clamp( - field_0x18[param_1] + field_0x20[param_1] * (param_0 - field_0x0), - field_0x8, field_0x18[param_1]); + field_0x18[camID] + field_0x20[camID] * (param_0 - field_0x0), + field_0x8, field_0x18[camID]); if (param_2 < dVar7) { param_2 = dVar7; } @@ -503,96 +533,104 @@ f32 Z2SpotMic::calcMicVolume(f32 param_0, int param_1, f32 param_2) { /* 802BD130-802BD1FC 2B7A70 00CC+00 0/0 1/1 0/0 .text __ct__10Z2AudienceFv */ Z2Audience::Z2Audience() : JASGlobalInstance<Z2Audience>(true), field_0x4(1.0f), field_0x8(0x7f) { - mMaxChannels = 1; + mNumPlayers = 1; mUsingOffMicVol = false; mAudioCamera[0].init(); - mAudioCamera[0].setMainCamera(); + mAudioCamera[0].setMainCamera(true); mLinkMic = mSpotMic; } /* 802BD1FC-802BD288 2B7B3C 008C+00 1/0 1/1 0/0 .text __dt__10Z2AudienceFv */ Z2Audience::~Z2Audience() { - //JUT_ASSERT(751, !isActive()); + // JUT_ASSERT(751, !isActive()); // TODO: need to setup rest of JASMemPool stuff } /* 802BD2DC-802BD338 2B7C1C 005C+00 0/0 1/1 0/0 .text * setAudioCamera__10Z2AudienceFPA4_fR3VecR3Vecffbib */ -void Z2Audience::setAudioCamera(f32 (*param_0)[4], Vec& param_1, Vec& param_2, f32 param_3, - f32 param_4, bool param_5, int param_6, bool param_7) { - mAudioCamera[param_6].setCameraState(param_0, param_1, param_2, param_3, param_4, param_5, param_7); - mLinkMic->setMicState(&mAudioCamera[param_6], param_6); +void Z2Audience::setAudioCamera(f32 (*param_0)[4], Vec& pos, Vec& param_2, f32 param_3, + f32 param_4, bool param_5, int camID, bool param_7) { + JUT_ASSERT(687, camID >= 0); + JUT_ASSERT(688, camID < mNumPlayers); + mAudioCamera[camID].setCameraState(param_0, pos, param_2, param_3, param_4, param_5, param_7); + mLinkMic->setMicState(&mAudioCamera[camID], camID); } /* 802BD338-802BD4D4 2B7C78 019C+00 1/0 0/0 0/0 .text * newAudible__10Z2AudienceFRCQ29JGeometry8TVec3<f>10JAISoundIDPCQ29JGeometry8TVec3<f>Ul */ -JAIAudible* Z2Audience::newAudible(JGeometry::TVec3<f32> const& param_0, JAISoundID param_1, - JGeometry::TVec3<f32> const* param_2, u32 param_3) { - u32 uVar4 = param_3 | ~((1 << mMaxChannels) + -1); - if (uVar4 == 0xffffffff) { +JAIAudible* Z2Audience::newAudible(const JGeometry::TVec3<f32>& pos, JAISoundID soundID, + const JGeometry::TVec3<f32>* param_2, u32 param_3) { + u32 channelNum = param_3 | ~((1 << mNumPlayers) + -1); + if (channelNum == 0xFFFFFFFF) { + JUT_WARN(826, "%s", "You masked all audible channels !"); return NULL; } - JAUAudibleParam local_34 = Z2GetSoundInfo()->getAudibleSwFull(param_1); - bool x = local_34.field_0x0.bytes.b0_0 != 0; - Z2Audible* this_01 = new Z2Audible(param_0, param_2, uVar4, x); - if (this_01 == NULL) { + + JAUAudibleParam params = Z2GetSoundInfo()->getAudibleSwFull(soundID); + bool x = params.field_0x0.bytes.b0_0 != 0; + + Z2Audible* audible = new Z2Audible(pos, param_2, channelNum, x); + if (audible == NULL) { return NULL; } - this_01->setAudibleParam(local_34); - for (int iVar5 = 0; iVar5 < mMaxChannels; iVar5++) { - Z2AudibleChannel* iVar2 = this_01->getChannel(iVar5); - if (iVar2 != NULL) { - u32 local_38 = this_01->getDistVolBit(); - mAudioCamera[iVar5].convertAbsToRel(this_01, iVar5); - calcDeltaPriority_(iVar2->field_0x14.field_0x10, local_38, false); + audible->setAudibleParam(params); + + for (int i = 0; i < mNumPlayers; i++) { + Z2AudibleChannel* channel = audible->getChannel(i); + if (channel != NULL) { + u32 distVolBit = audible->getDistVolBit(); + mAudioCamera[i].convertAbsToRel(audible, i); + calcDeltaPriority_(channel->field_0x14.field_0x10, distVolBit, false); } } - for (int iVar5 = 0; iVar5 < 1; iVar5++) { - if (mSpotMic[iVar5].isOn()) { - this_01->field_0x64[iVar5] = mSpotMic[iVar5].calcMicDist(this_01); + + for (int i = 0; i < 1; i++) { + if (mSpotMic[i].isOn()) { + audible->field_0x64[i] = mSpotMic[i].calcMicDist(audible); } } - return this_01; + return audible; } /* 802BD4D4-802BD510 2B7E14 003C+00 1/0 0/0 0/0 .text deleteAudible__10Z2AudienceFP10JAIAudible */ -void Z2Audience::deleteAudible(JAIAudible* param_0) { - delete param_0; +void Z2Audience::deleteAudible(JAIAudible* audible) { + delete audible; } /* 802BD510-802BD5B8 2B7E50 00A8+00 1/0 0/0 0/0 .text __dt__9Z2AudibleFv */ -Z2Audible::~Z2Audible() { -} +Z2Audible::~Z2Audible() {} /* 802BD5B8-802BD704 2B7EF8 014C+00 1/0 0/0 0/0 .text calcPriority__10Z2AudienceFP10JAIAudible */ -u32 Z2Audience::calcPriority(JAIAudible* param_0) { - Z2Audible* z2Audible = (Z2Audible*)param_0; - if (!z2Audible->getAudibleParam()->field_0x0.bytes.b0_4) { - for (int i = 0; i < mMaxChannels; i++) { - mAudioCamera[i].convertAbsToRel(z2Audible, i); +u32 Z2Audience::calcPriority(JAIAudible* audible) { + Z2Audible* Z2audible = (Z2Audible*)audible; + + if (!Z2audible->getAudibleParam()->field_0x0.bytes.b0_4) { + for (int i = 0; i < mNumPlayers; i++) { + mAudioCamera[i].convertAbsToRel(Z2audible, i); } return 0; } u32 deltaPriority[1]; - u32 rv = 0xffffffff; - for (int i = 0; i < mMaxChannels; i++) { - Z2AudibleChannel* iVar4 = (z2Audible)->getChannel(i); - if (iVar4 != NULL) { - mAudioCamera[i].convertAbsToRel(z2Audible, i); - u32 distvolBit = z2Audible->getDistVolBit(); - const JAUAudibleParam* puVar1 = z2Audible->getAudibleParam(); - deltaPriority[i] = calcDeltaPriority_(iVar4->field_0x14.field_0x10, distvolBit, puVar1->field_0x0.bytes.b0_7); + u32 rv = 0xFFFFFFFF; + for (int i = 0; i < mNumPlayers; i++) { + Z2AudibleChannel* channel = (Z2audible)->getChannel(i); + if (channel != NULL) { + mAudioCamera[i].convertAbsToRel(Z2audible, i); + u32 distvolBit = Z2audible->getDistVolBit(); + const JAUAudibleParam* puVar1 = Z2audible->getAudibleParam(); + deltaPriority[i] = calcDeltaPriority_(channel->field_0x14.field_0x10, distvolBit, puVar1->field_0x0.bytes.b0_7); if (deltaPriority[i] < rv) { rv = deltaPriority[i]; } } } + for (int i = 0; i < 1; i++) { if (mSpotMic[i].isOn()) { - z2Audible->field_0x64[i] = mSpotMic[i].calcMicDist(z2Audible); - u32 micPriority = mSpotMic[i].calcMicPriority(z2Audible->field_0x64[i]); + Z2audible->field_0x64[i] = mSpotMic[i].calcMicDist(Z2audible); + u32 micPriority = mSpotMic[i].calcMicPriority(Z2audible->field_0x64[i]); if (micPriority < rv) { rv = micPriority; } @@ -613,63 +651,63 @@ f32 Z2Audience::calcOffMicSound(f32 param_0) { /* 802BD71C-802BD90C 2B805C 01F0+00 1/0 0/0 0/0 .text * mixChannelOut__10Z2AudienceFRC14JASSoundParamsP10JAIAudiblei */ -void Z2Audience::mixChannelOut(JASSoundParams const& param_0, JAIAudible* param_1, - int param_2) { - Z2Audible* z2Audible = (Z2Audible*)param_1; - Z2AudibleChannel* pZVar5 = z2Audible->getChannel(param_2); - if (pZVar5 == NULL) { +void Z2Audience::mixChannelOut(const JASSoundParams& outParams, JAIAudible* audible, int channelNum) { + Z2Audible* Z2audible = (Z2Audible*)audible; + Z2AudibleChannel* channel = Z2audible->getChannel(channelNum); + if (channel == NULL) { return; } JASSoundParams local_60; - u32 iVar6 = z2Audible->getDistVolBit(); - if (z2Audible->getAudibleParam()->field_0x0.bytes.b0_5) { - local_60.mVolume = calcVolume_(pZVar5->field_0x14.field_0x10, iVar6); - f32 dVar9 = mLinkMic->calcMicVolume(z2Audible->field_0x64[0], param_2, local_60.mVolume); + u32 distVolBit = Z2audible->getDistVolBit(); + if (Z2audible->getAudibleParam()->field_0x0.bytes.b0_5) { + local_60.mVolume = calcVolume_(channel->field_0x14.field_0x10, distVolBit); + f32 dVar9 = mLinkMic->calcMicVolume(Z2audible->field_0x64[0], channelNum, local_60.mVolume); if (dVar9 < 0.0f) { dVar9 = calcOffMicSound(local_60.mVolume); } local_60.mVolume = dVar9; - JAUAudibleParam* puVar7 = z2Audible->getAudibleParam(); - if ((puVar7->field_0x0.bytes.b1_2_7 & 8) && (local_60.mVolume <= 0.2f)) { + + JAUAudibleParam* params = Z2audible->getAudibleParam(); + if ((params->field_0x0.bytes.b1_2_7 & 8) && (local_60.mVolume <= 0.2f)) { local_60.mVolume = 0.2f; } } else { local_60.mVolume = 1.0f; } - if (z2Audible->getAudibleParam()->field_0x0.bytes.b1_1 && mMaxChannels == 1) { - local_60.mDolby = calcRelPosDolby(*(Vec*)&pZVar5->field_0x14.field_0x00, param_2); + if (Z2audible->getAudibleParam()->field_0x0.bytes.b1_1 && mNumPlayers == 1) { + local_60.mDolby = calcRelPosDolby(*(Vec*)&channel->field_0x14.field_0x00, channelNum); } else { local_60.mDolby = 0.5f; } - if (z2Audible->getAudibleParam()->field_0x0.bytes.b1_0) { - if (mMaxChannels > 2) { + if (Z2audible->getAudibleParam()->field_0x0.bytes.b1_0) { + if (mNumPlayers > 2) { f32 fVar1; - if (param_2 & 1) { + if (channelNum & 1) { fVar1 = 1.0f; } else { fVar1 = 0.0f; } local_60.mPan = fVar1; } else { - local_60.mPan = calcRelPosPan(*(Vec*)&pZVar5->field_0x14.field_0x00, param_2); + local_60.mPan = calcRelPosPan(*(Vec*)&channel->field_0x14.field_0x00, channelNum); } } else { local_60.mPan = 0.5f; } - local_60.mPitch = calcPitch_(pZVar5, z2Audible, &mAudioCamera[param_2]); + local_60.mPitch = calcPitch_(channel, Z2audible, &mAudioCamera[channelNum]); f32 dVar9; - if (z2Audible->getAudibleParam()->field_0x0.bytes.b0_6) { - dVar9 = calcFxMix_(pZVar5->field_0x14.field_0xC, iVar6); + if (Z2audible->getAudibleParam()->field_0x0.bytes.b0_6) { + dVar9 = calcFxMix_(channel->field_0x14.field_0xC, distVolBit); } else { dVar9 = 0.0f; } local_60.mFxMix = dVar9; local_60.clamp(); - z2Audible->setOuterParams(param_0, local_60, param_2); + Z2audible->setOuterParams(outParams, local_60, channelNum); } @@ -678,38 +716,41 @@ void Z2Audience::setTargetVolume(f32 volume, int index) { mAudioCamera[index].setTargetVolume(volume); } - /* 802BD92C-802BD95C 2B826C 0030+00 0/0 4/4 0/0 .text convertAbsToRel__10Z2AudienceFR3VecP3Veci */ -bool Z2Audience::convertAbsToRel(Vec& param_0, Vec* param_1, int param_2) { - return mAudioCamera[param_2].convertAbsToRel(param_0, param_1); +bool Z2Audience::convertAbsToRel(Vec& src, Vec* dst, int camID) { + JUT_ASSERT(1036, camID >= 0); + JUT_ASSERT(1037, camID < mNumPlayers); + return getAudioCamera(camID)->convertAbsToRel(src, dst); } /* 802BD95C-802BDA44 2B829C 00E8+00 0/0 3/3 0/0 .text calcRelPosVolume__10Z2AudienceFRC3Vecfi */ -f32 Z2Audience::calcRelPosVolume(Vec const& param_0, f32 param_1, int param_2) { - JGeometry::TVec3<f32> aTStack_3c; - JGeometry::setTVec3f(param_0, *(Vec*)&aTStack_3c); - aTStack_3c.z += mAudioCamera[param_2].getVolCenterZ(); +f32 Z2Audience::calcRelPosVolume(const Vec& param_0, f32 param_1, int camID) { + JGeometry::TVec3<f32> aTStack_3c(param_0); + aTStack_3c.z += mAudioCamera[camID].getVolCenterZ(); aTStack_3c.y *= 1.5f; - f32 this_00 = aTStack_3c.length(); - if (this_00 > mSetting.field_0x0[0] * param_1) { + + f32 len = aTStack_3c.length(); + if (len > mSetting.field_0x0[0] * param_1) { return mSetting.field_0x40; } - if (this_00 < mSetting.field_0x3c) { + if (len < mSetting.field_0x3c) { return 1.0f; } + return JGeometry::TUtil<f32>::clamp( 1.0f + ((mSetting.field_0x40 - 1.0f) / ((mSetting.field_0x0[0] * param_1) - mSetting.field_0x3c)) * - (this_00 - mSetting.field_0x3c), + (len - mSetting.field_0x3c), 0.0f, 1.0f); } /* 802BDA44-802BDB44 2B8384 0100+00 1/1 3/3 0/0 .text calcRelPosPan__10Z2AudienceFRC3Veci */ -f32 Z2Audience::calcRelPosPan(Vec const& param_0, int param_1) { +f32 Z2Audience::calcRelPosPan(const Vec& param_0, int camID) { Vec local_54 = param_0; local_54.y = 0.0f; + f32 dVar6 = VECMag(&local_54); if (dVar6 < 0.1f) { return 0.5f; @@ -717,17 +758,18 @@ f32 Z2Audience::calcRelPosPan(Vec const& param_0, int param_1) { dVar6 = (0.5f + mSetting.field_0x58 * (local_54.x / dVar6)); if (local_54.z <= 0.0f) { - f32 dVar7 = mAudioCamera[param_1].getFovySin(); + f32 fovySin = mAudioCamera[camID].getFovySin(); if (dVar6 < 0.5f) { dVar6 = Z2Calc::getParamByExp( dVar6, 0.0f, 0.5f, - dVar7, 0.0f, 0.5f, Z2Calc::CURVE_SIGN_1); + fovySin, 0.0f, 0.5f, Z2Calc::CURVE_POSITIVE); } else { dVar6 = Z2Calc::getParamByExp( dVar6, 0.5f, 1.0f, - dVar7, 0.5f, 1.0f, Z2Calc::CURVE_SIGN_0); + fovySin, 0.5f, 1.0f, Z2Calc::CURVE_NEGATIVE); } } + if (dVar6 > 1.0f) { return 1.0f; } @@ -735,33 +777,37 @@ f32 Z2Audience::calcRelPosPan(Vec const& param_0, int param_1) { if (dVar6 < 0.0f) { return 0.0f; } + return dVar6; } /* 802BDB44-802BDBDC 2B8484 0098+00 1/1 3/3 0/0 .text calcRelPosDolby__10Z2AudienceFRC3Veci */ -f32 Z2Audience::calcRelPosDolby(Vec const& param_0, int param_1) { - f32 fVar1 = param_0.z + mAudioCamera[param_1].getDolbyCenterZ(); +f32 Z2Audience::calcRelPosDolby(const Vec& param_0, int camID) { + f32 fVar1 = param_0.z + mAudioCamera[camID].getDolbyCenterZ(); if (fVar1 > mSetting.field_0x48) { return 1.0f; } + if (fVar1 < mSetting.field_0x44) { return 0.0f; } + if (fVar1 < 0.0f) { return Z2Calc::getParamByExp( fVar1, mSetting.field_0x44, 0.0f, 0.3f, 0.0f, - mSetting.field_0x4c, Z2Calc::CURVE_SIGN_1); + mSetting.field_0x4c, Z2Calc::CURVE_POSITIVE); } + return Z2Calc::getParamByExp( fVar1, 0.0f, mSetting.field_0x48, 0.3f, mSetting.field_0x4c, - 1.0f, Z2Calc::CURVE_SIGN_0); + 1.0f, Z2Calc::CURVE_NEGATIVE); } /* 802BDBDC-802BDC44 2B851C 0068+00 1/1 0/0 0/0 .text calcVolume___10Z2AudienceCFfi */ -f32 Z2Audience::calcVolume_(f32 param_0, int param_1) const { - if (param_0 > mSetting.field_0x0[param_1]) { +f32 Z2Audience::calcVolume_(f32 param_0, int distVolBit) const { + if (param_0 > mSetting.field_0x0[distVolBit]) { return mSetting.field_0x40; } @@ -769,20 +815,12 @@ f32 Z2Audience::calcVolume_(f32 param_0, int param_1) const { return 1.0f; } - f32 volume = 1.0f + mSetting.field_0x70[param_1] * (param_0 - mSetting.field_0x3c); - if (volume < 0.0f) { - return 0.0f; - } - - if (volume > 1.0f) { - return 1.0f; - } - return volume; + return JGeometry::TUtil<f32>::clamp((mSetting.field_0x70[distVolBit] * (param_0 - mSetting.field_0x3c)) + 1.0f, 0.0f, 1.0f); } /* 802BDC44-802BDCB0 2B8584 006C+00 2/2 0/0 0/0 .text calcDeltaPriority___10Z2AudienceCFfib */ -u32 Z2Audience::calcDeltaPriority_(f32 param_0, int param_1, bool param_2) const { - if (param_0 > mSetting.field_0x0[param_1]) { +u32 Z2Audience::calcDeltaPriority_(f32 param_0, int distVolBit, bool param_2) const { + if (param_0 > mSetting.field_0x0[distVolBit]) { if (param_2) { return -1; } @@ -793,83 +831,66 @@ u32 Z2Audience::calcDeltaPriority_(f32 param_0, int param_1, bool param_2) const return 0; } - return mSetting.field_0xac[param_1] * (param_0 - mSetting.field_0x3c); + return mSetting.field_0xac[distVolBit] * (param_0 - mSetting.field_0x3c); } /* 802BDCB0-802BDD00 2B85F0 0050+00 1/1 0/0 0/0 .text * calcPitchDoppler___10Z2AudienceCFRCQ29JGeometry8TVec3<f>RCQ29JGeometry8TVec3<f>RCQ29JGeometry8TVec3<f>f */ -f32 Z2Audience::calcPitchDoppler_(JGeometry::TVec3<f32> const& param_0, - JGeometry::TVec3<f32> const& param_1, - JGeometry::TVec3<f32> const& param_2, f32 param_3) const { +f32 Z2Audience::calcPitchDoppler_(const JGeometry::TVec3<f32>& param_0, + const JGeometry::TVec3<f32>& param_1, + const JGeometry::TVec3<f32>& param_2, f32 param_3) const { f32 dVar8 = param_0.dot(param_1); f32 dVar7 = param_0.dot(param_2); return (mSetting.field_0x5c + param_3 * dVar8) / (mSetting.field_0x5c + param_3 * dVar7); } /* 802BDD00-802BDD48 2B8640 0048+00 1/1 0/0 0/0 .text calcFxMix___10Z2AudienceCFfi */ -f32 Z2Audience::calcFxMix_(f32 param_0, int param_1) const { - if (param_0 > mSetting.field_0x0[param_1]) { +f32 Z2Audience::calcFxMix_(f32 param_0, int distVolBit) const { + if (param_0 > mSetting.field_0x0[distVolBit]) { return mSetting.field_0x54; } if (param_0 < mSetting.field_0x3c) { return mSetting.field_0x50; } - return mSetting.field_0x50 + mSetting.field_0xe8[param_1] * (param_0 - mSetting.field_0x3c); + return mSetting.field_0x50 + mSetting.field_0xe8[distVolBit] * (param_0 - mSetting.field_0x3c); } /* 802BDD48-802BDED4 2B8688 018C+00 1/1 0/0 0/0 .text * calcPitch___10Z2AudienceCFP16Z2AudibleChannelPC9Z2AudiblePC13Z2AudioCamera */ -f32 Z2Audience::calcPitch_(Z2AudibleChannel* param_0, Z2Audible const* param_1, - Z2AudioCamera const* param_2) const { - JAUAudibleParam audParam = *param_1->getAudibleParam(); +f32 Z2Audience::calcPitch_(Z2AudibleChannel* channel, const Z2Audible* audible, const Z2AudioCamera* camera) const { + JAUAudibleParam audParam = *audible->getAudibleParam(); if ((*(u8*)&audParam.field_0x0.raw >> 4) & 0xf) { JGeometry::TVec3<f32> aTStack_4c; - aTStack_4c.normalize(param_0->field_0x14.field_0x00); - JAUAudibleParam audParam = *param_1->getAudibleParam(); - f32 dVar7 = audParam.getDopplerPower(); - dVar7 = calcPitchDoppler_(aTStack_4c, *param_2->getVel(), *param_1->getVel(), dVar7); - if (param_0->field_0x34 > 0.0f) { - if (param_0->field_0x34 > (dVar7 * mSetting.field_0x60)) { - return param_0->field_0x34; + aTStack_4c.normalize(channel->field_0x14.field_0x00); + JAUAudibleParam audParam = *audible->getAudibleParam(); + + f32 doppler = audParam.getDopplerPower(); + doppler = calcPitchDoppler_(aTStack_4c, *camera->getVel(), *audible->getVel(), doppler); + + if (channel->field_0x34 > 0.0f) { + if (channel->field_0x34 > (doppler * mSetting.field_0x60)) { + return channel->field_0x34; } - if (dVar7 > (param_0->field_0x34 * mSetting.field_0x60)) { - return param_0->field_0x34; + if (doppler > (channel->field_0x34 * mSetting.field_0x60)) { + return channel->field_0x34; } - param_0->field_0x34 = dVar7; - return dVar7; - } - if (dVar7 > 0.0f) { - param_0->field_0x34 = dVar7; - return dVar7; + channel->field_0x34 = doppler; + return doppler; + } + + if (doppler > 0.0f) { + channel->field_0x34 = doppler; + return doppler; } + return 1.0f; } + return 1.0f; } - /* 802BDED4-802BDEDC 2B8814 0008+00 1/0 0/0 0/0 .text getMaxChannels__10Z2AudienceFv */ int Z2Audience::getMaxChannels() { - return mMaxChannels; -} - -static void dummyMempool() { - + return mNumPlayers; } - - - -// padding (???) -s8 data_80451355; -s8 data_80451356; -s8 data_80451357; - -/* ############################################################################################## */ -/* 80451358-80451360 -00001 0008+00 0/0 1/1 0/0 .sbss None */ -/* 80451358 0001+00 data_80451358 None */ -/* 80451359 0007+00 data_80451359 None */ -// extern u8 struct_80451358[8]; -// u8 struct_80451358[8]; -s8 data_80451358; -s8 data_80451359; |
