forked from mirror/openmw-tes3mp
Merge remote-tracking branch 'scrawl/soundlistener'
This commit is contained in:
commit
8b0659c4f2
9 changed files with 29 additions and 15 deletions
|
@ -153,7 +153,7 @@ namespace MWBase
|
|||
|
||||
virtual void update(float duration) = 0;
|
||||
|
||||
virtual void setListenerPosDir(const osg::Vec3f &pos, const osg::Vec3f &dir, const osg::Vec3f &up) = 0;
|
||||
virtual void setListenerPosDir(const osg::Vec3f &pos, const osg::Vec3f &dir, const osg::Vec3f &up, bool underwater) = 0;
|
||||
|
||||
virtual void updatePtr (const MWWorld::Ptr& old, const MWWorld::Ptr& updated) = 0;
|
||||
|
||||
|
|
|
@ -387,6 +387,7 @@ namespace MWRender
|
|||
|
||||
osg::Vec3f focal, cameraPos;
|
||||
mCamera->getPosition(focal, cameraPos);
|
||||
mCurrentCameraPos = cameraPos;
|
||||
if (mWater->isUnderwater(cameraPos))
|
||||
{
|
||||
setFogColor(mUnderwaterColor * mUnderwaterWeight + mFogColor * (1.f-mUnderwaterWeight));
|
||||
|
@ -865,6 +866,11 @@ namespace MWRender
|
|||
return mCamera.get();
|
||||
}
|
||||
|
||||
const osg::Vec3f &RenderingManager::getCameraPosition() const
|
||||
{
|
||||
return mCurrentCameraPos;
|
||||
}
|
||||
|
||||
void RenderingManager::togglePOV()
|
||||
{
|
||||
mCamera->toggleViewMode();
|
||||
|
|
|
@ -159,6 +159,7 @@ namespace MWRender
|
|||
void resetCamera();
|
||||
float getCameraDistance() const;
|
||||
Camera* getCamera();
|
||||
const osg::Vec3f& getCameraPosition() const;
|
||||
void togglePOV();
|
||||
void togglePreviewMode(bool enable);
|
||||
bool toggleVanityMode(bool enable);
|
||||
|
@ -188,6 +189,7 @@ namespace MWRender
|
|||
std::auto_ptr<NpcAnimation> mPlayerAnimation;
|
||||
osg::ref_ptr<SceneUtil::PositionAttitudeTransform> mPlayerNode;
|
||||
std::auto_ptr<Camera> mCamera;
|
||||
osg::Vec3f mCurrentCameraPos;
|
||||
|
||||
osg::ref_ptr<StateUpdater> mStateUpdater;
|
||||
|
||||
|
|
|
@ -144,7 +144,9 @@ namespace MWScript
|
|||
return;
|
||||
}
|
||||
MWWorld::CellStore *cell = MWMechanics::getPlayer().getCell();
|
||||
if (cell->getCell()->hasWater())
|
||||
if (cell->isExterior())
|
||||
runtime.push(0.f); // vanilla oddity, return 0 even though water is actually at -1
|
||||
else if (cell->getCell()->hasWater())
|
||||
runtime.push (cell->getWaterLevel());
|
||||
else
|
||||
runtime.push (-std::numeric_limits<float>::max());
|
||||
|
|
|
@ -946,16 +946,13 @@ namespace MWSound
|
|||
mOutput->finishUpdate();
|
||||
}
|
||||
|
||||
void SoundManager::setListenerPosDir(const osg::Vec3f &pos, const osg::Vec3f &dir, const osg::Vec3f &up)
|
||||
void SoundManager::setListenerPosDir(const osg::Vec3f &pos, const osg::Vec3f &dir, const osg::Vec3f &up, bool underwater)
|
||||
{
|
||||
mListenerPos = pos;
|
||||
mListenerDir = dir;
|
||||
mListenerUp = up;
|
||||
|
||||
MWWorld::Ptr player = MWMechanics::getPlayer();
|
||||
const MWWorld::CellStore *cell = player.getCell();
|
||||
|
||||
mListenerUnderwater = ((cell->getCell()->mData.mFlags&ESM::Cell::HasWater) && mListenerPos.z() < cell->getWaterLevel());
|
||||
mListenerUnderwater = underwater;
|
||||
}
|
||||
|
||||
void SoundManager::updatePtr(const MWWorld::Ptr &old, const MWWorld::Ptr &updated)
|
||||
|
|
|
@ -218,7 +218,7 @@ namespace MWSound
|
|||
|
||||
virtual void update(float duration);
|
||||
|
||||
virtual void setListenerPosDir(const osg::Vec3f &pos, const osg::Vec3f &dir, const osg::Vec3f &up);
|
||||
virtual void setListenerPosDir(const osg::Vec3f &pos, const osg::Vec3f &dir, const osg::Vec3f &up, bool underwater);
|
||||
|
||||
virtual void updatePtr (const MWWorld::Ptr& old, const MWWorld::Ptr& updated);
|
||||
|
||||
|
|
|
@ -296,6 +296,8 @@ namespace MWWorld
|
|||
|
||||
float CellStore::getWaterLevel() const
|
||||
{
|
||||
if (isExterior())
|
||||
return -1;
|
||||
return mWaterLevel;
|
||||
}
|
||||
|
||||
|
|
|
@ -265,7 +265,7 @@ namespace MWWorld
|
|||
|
||||
mRendering.addCell(cell);
|
||||
bool waterEnabled = cell->getCell()->hasWater() || cell->isExterior();
|
||||
float waterLevel = cell->isExterior() ? -1.f : cell->getWaterLevel();
|
||||
float waterLevel = cell->getWaterLevel();
|
||||
mRendering.setWaterEnabled(waterEnabled);
|
||||
if (waterEnabled)
|
||||
{
|
||||
|
|
|
@ -1601,18 +1601,23 @@ namespace MWWorld
|
|||
void World::updateSoundListener()
|
||||
{
|
||||
const ESM::Position& refpos = getPlayerPtr().getRefData().getPosition();
|
||||
osg::Vec3f playerPos = refpos.asVec3();
|
||||
osg::Vec3f listenerPos;
|
||||
|
||||
playerPos.z() += 1.85f * mPhysics->getHalfExtents(getPlayerPtr()).z();
|
||||
if (isFirstPerson())
|
||||
listenerPos = mRendering->getCameraPosition();
|
||||
else
|
||||
listenerPos = refpos.asVec3() + osg::Vec3f(0, 0, 1.85f * mPhysics->getHalfExtents(getPlayerPtr()).z());
|
||||
|
||||
osg::Quat playerOrient = osg::Quat(refpos.rot[1], osg::Vec3f(0,-1,0)) *
|
||||
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));
|
||||
|
||||
osg::Vec3f forward = playerOrient * osg::Vec3f(0,1,0);
|
||||
osg::Vec3f up = playerOrient * osg::Vec3f(0,0,1);
|
||||
osg::Vec3f forward = listenerOrient * osg::Vec3f(0,1,0);
|
||||
osg::Vec3f up = listenerOrient * osg::Vec3f(0,0,1);
|
||||
|
||||
MWBase::Environment::get().getSoundManager()->setListenerPosDir(playerPos, forward, up);
|
||||
bool underwater = isUnderwater(getPlayerPtr().getCell(), listenerPos);
|
||||
|
||||
MWBase::Environment::get().getSoundManager()->setListenerPosDir(listenerPos, forward, up, underwater);
|
||||
}
|
||||
|
||||
void World::updateWindowManager ()
|
||||
|
|
Loading…
Reference in a new issue