1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-17 01:10:10 +00:00

Merge branch 'decoupled-audio' into 'master'

Add option to use camera as sound listener

Closes #5944

See merge request OpenMW/openmw!3836
This commit is contained in:
psi29a 2024-02-13 09:18:18 +00:00
commit 744cd50520
13 changed files with 79 additions and 11 deletions

View File

@ -79,6 +79,7 @@ Programmers
Eduard Cot (trombonecot)
Eli2
Emanuel Guével (potatoesmaster)
Epoch
Eris Caffee (eris)
eroen
escondida

View File

@ -146,6 +146,7 @@
Feature #5173: Support for NiFogProperty
Feature #5492: Let rain and snow collide with statics
Feature #5926: Refraction based on water depth
Feature #5944: Option to use camera as sound listener
Feature #6149: Dehardcode Lua API_REVISION
Feature #6152: Playing music via lua scripts
Feature #6188: Specular lighting from point light sources

View File

@ -294,6 +294,7 @@ bool Launcher::SettingsPage::loadSettings()
hrtfProfileSelectorComboBox->setCurrentIndex(hrtfProfileIndex);
}
}
loadSettingBool(Settings::sound().mCameraListener, *cameraListenerCheckBox);
}
// Interface Changes
@ -490,6 +491,9 @@ void Launcher::SettingsPage::saveSettings()
Settings::sound().mHrtf.set(hrtfProfileSelectorComboBox->currentText().toStdString());
else
Settings::sound().mHrtf.set({});
const bool cCameraListener = cameraListenerCheckBox->checkState() != Qt::Unchecked;
Settings::sound().mCameraListener.set(cCameraListener);
}
// Interface Changes

View File

@ -1320,6 +1320,16 @@
</item>
</layout>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="cameraListenerCheckBox">
<property name="toolTip">
<string>In third-person view, use the camera as the sound listener instead of the player character.</string>
</property>
<property name="text">
<string>Use the camera as the sound listener</string>
</property>
</widget>
</item>
<item>
<spacer>
<property name="orientation">

View File

@ -109,8 +109,7 @@ namespace MWRender
void Camera::updateCamera(osg::Camera* cam)
{
osg::Quat orient = osg::Quat(mRoll + mExtraRoll, osg::Vec3d(0, 1, 0))
* osg::Quat(mPitch + mExtraPitch, osg::Vec3d(1, 0, 0)) * osg::Quat(mYaw + mExtraYaw, osg::Vec3d(0, 0, 1));
osg::Quat orient = getOrient();
osg::Vec3d forward = orient * osg::Vec3d(0, 1, 0);
osg::Vec3d up = orient * osg::Vec3d(0, 0, 1);
@ -209,6 +208,12 @@ namespace MWRender
mPosition = focal + offset;
}
osg::Quat Camera::getOrient() const
{
return osg::Quat(mRoll + mExtraRoll, osg::Vec3d(0, 1, 0)) * osg::Quat(mPitch + mExtraPitch, osg::Vec3d(1, 0, 0))
* osg::Quat(mYaw + mExtraYaw, osg::Vec3d(0, 0, 1));
}
void Camera::setMode(Mode newMode, bool force)
{
if (mMode == newMode)

View File

@ -72,6 +72,8 @@ namespace MWRender
void setExtraYaw(float angle) { mExtraYaw = angle; }
void setExtraRoll(float angle) { mExtraRoll = angle; }
osg::Quat getOrient() const;
/// @param Force view mode switch, even if currently not allowed by the animation.
void toggleViewMode(bool force = false);
bool toggleVanityMode(bool enable);

View File

@ -1738,23 +1738,27 @@ namespace MWWorld
void World::updateSoundListener()
{
osg::Vec3f cameraPosition = mRendering->getCamera()->getPosition();
const MWRender::Camera* camera = mRendering->getCamera();
const auto& player = getPlayerPtr();
const ESM::Position& refpos = player.getRefData().getPosition();
osg::Vec3f listenerPos;
osg::Vec3f listenerPos, up, forward;
osg::Quat listenerOrient;
if (isFirstPerson())
listenerPos = cameraPosition;
if (isFirstPerson() || Settings::sound().mCameraListener)
listenerPos = camera->getPosition();
else
listenerPos = refpos.asVec3() + osg::Vec3f(0, 0, 1.85f * mPhysics->getHalfExtents(player).z());
osg::Quat listenerOrient = osg::Quat(refpos.rot[1], osg::Vec3f(0, -1, 0))
* osg::Quat(refpos.rot[0], osg::Vec3f(-1, 0, 0)) * osg::Quat(refpos.rot[2], osg::Vec3f(0, 0, -1));
if (isFirstPerson() || Settings::sound().mCameraListener)
listenerOrient = camera->getOrient();
else
listenerOrient = osg::Quat(refpos.rot[1], osg::Vec3f(0, -1, 0))
* osg::Quat(refpos.rot[0], osg::Vec3f(-1, 0, 0)) * osg::Quat(refpos.rot[2], osg::Vec3f(0, 0, -1));
osg::Vec3f forward = listenerOrient * osg::Vec3f(0, 1, 0);
osg::Vec3f up = listenerOrient * osg::Vec3f(0, 0, 1);
forward = listenerOrient * osg::Vec3f(0, 1, 0);
up = listenerOrient * osg::Vec3f(0, 0, 1);
bool underwater = isUnderwater(player.getCell(), cameraPosition);
bool underwater = isUnderwater(player.getCell(), camera->getPosition());
MWBase::Environment::get().getSoundManager()->setListenerPosDir(listenerPos, forward, up, underwater);
}

View File

@ -23,6 +23,7 @@ namespace Settings
SettingValue<int> mBufferCacheMax{ mIndex, "Sound", "buffer cache max", makeMaxSanitizerInt(1) };
SettingValue<HrtfMode> mHrtfEnable{ mIndex, "Sound", "hrtf enable" };
SettingValue<std::string> mHrtf{ mIndex, "Sound", "hrtf" };
SettingValue<bool> mCameraListener{ mIndex, "Sound", "camera listener" };
};
}

View File

@ -127,3 +127,16 @@ Allowed values for this field are enumerated in openmw.log file is an HRTF enabl
The default value is empty, which uses the default profile.
This setting can be controlled in the Settings tab of the launcher.
camera listener
---------------
:Type: boolean
:Range: True/False
:Default: False
When true, uses the camera position and direction for audio instead of the player position.
This makes audio in third person sound relative to camera instead of the player.
False is vanilla Morrowind behaviour.
This setting can be controlled in the Settings tab of the launcher.

View File

@ -1447,5 +1447,13 @@ to default Morrowind fonts. Check this box if you still prefer original fonts ov
<source>Lights minimum interior brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>In third-person view, use the camera as the sound listener instead of the player character.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use the camera as the sound listener</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -1447,5 +1447,13 @@ to default Morrowind fonts. Check this box if you still prefer original fonts ov
<source>Lights minimum interior brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>In third-person view, use the camera as the sound listener instead of the player character.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use the camera as the sound listener</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -1462,5 +1462,13 @@ to default Morrowind fonts. Check this box if you still prefer original fonts ov
<source>Lights minimum interior brightness</source>
<translation>Минимальный уровень освещения в помещениях</translation>
</message>
<message>
<source>In third-person view, use the camera as the sound listener instead of the player character.</source>
<translation>Использовать в виде от третьего лица положение камеры, а не персонажа игрока для прослушивания звуков.</translation>
</message>
<message>
<source>Use the camera as the sound listener</source>
<translation>Использовать камеру как слушателя</translation>
</message>
</context>
</TS>

View File

@ -608,6 +608,9 @@ hrtf enable = -1
# Specifies which HRTF to use when HRTF is used. Blank means use the default.
hrtf =
# Specifies whether to use camera as audio listener
camera listener = false
[Video]
# Resolution of the OpenMW window or screen.