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:
commit
744cd50520
@ -79,6 +79,7 @@ Programmers
|
||||
Eduard Cot (trombonecot)
|
||||
Eli2
|
||||
Emanuel Guével (potatoesmaster)
|
||||
Epoch
|
||||
Eris Caffee (eris)
|
||||
eroen
|
||||
escondida
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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">
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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" };
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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.
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user