mirror of
https://github.com/zeldaret/ss
synced 2026-08-31 09:20:48 -04:00
57 lines
1.6 KiB
C++
57 lines
1.6 KiB
C++
#include "d/snd/d_snd_3d_engine.h"
|
|
|
|
#include "common.h"
|
|
#include "nw4r/snd/snd_Sound3DListener.h"
|
|
|
|
dSnd3DEngine_c::dSnd3DEngine_c() {}
|
|
|
|
static void CalcPitch(
|
|
const nw4r::math::VEC3 *vec, f32 mag, const nw4r::snd::Sound3DManager &mgr,
|
|
const nw4r::snd::Sound3DListener &listener, const nw4r::snd::Sound3DParam ¶m, f32 *pPitch
|
|
);
|
|
|
|
void dSnd3DEngine_c::UpdateAmbientParam(
|
|
const nw4r::snd::Sound3DManager *mgr, const nw4r::snd::Sound3DParam *param3d, u32 unk, u32 flags,
|
|
nw4r::snd::SoundAmbientParam *paramAmb
|
|
) {
|
|
f32 pitch;
|
|
CalcPitch(nullptr, 0.0f, *mgr, mgr->GetListenerList().GetFront(), *param3d, &pitch);
|
|
}
|
|
|
|
// Largely copied from Sound3DCalculator::CalcPitch
|
|
static void CalcPitch(
|
|
const nw4r::math::VEC3 *vec, f32 mag, const nw4r::snd::Sound3DManager &mgr,
|
|
const nw4r::snd::Sound3DListener &listener, const nw4r::snd::Sound3DParam ¶m, f32 *pPitch
|
|
) {
|
|
f32 f0 = mgr.GetField0x24();
|
|
if (f0 == 0.0f) {
|
|
*pPitch = 1.0f;
|
|
return;
|
|
}
|
|
|
|
nw4r::math::VEC3 relativePos(*vec);
|
|
if (mag > 0.0f) {
|
|
relativePos /= mag;
|
|
}
|
|
f32 f3 = param.field_0x1E / 32.0f;
|
|
f32 f1, f2;
|
|
if (mag > 0.0f) {
|
|
f1 = -nw4r::math::VEC3Dot(&relativePos, ¶m.velocity);
|
|
f2 = -nw4r::math::VEC3Dot(&relativePos, &listener.GetVelocity());
|
|
} else {
|
|
f1 = -nw4r::math::VEC3Len(¶m.velocity);
|
|
f2 = nw4r::math::VEC3Len(&listener.GetVelocity());
|
|
}
|
|
f32 pitch;
|
|
f1 *= f3;
|
|
f2 *= f3;
|
|
if (f2 > f0) {
|
|
pitch = 0.0f;
|
|
} else if (f1 >= f0) {
|
|
pitch = 65535.0f;
|
|
} else {
|
|
pitch = (f0 - f2) / (f0 - f1);
|
|
}
|
|
*pPitch = pitch;
|
|
}
|