diff --git a/Engine/source/T3D/assets/SoundAsset.cpp b/Engine/source/T3D/assets/SoundAsset.cpp index d9aeb7f4a..e182bf9bd 100644 --- a/Engine/source/T3D/assets/SoundAsset.cpp +++ b/Engine/source/T3D/assets/SoundAsset.cpp @@ -550,7 +550,12 @@ DefineEngineMethod(SoundAsset, playSound, S32, (Point3F position), (Point3F::Zer { MatrixF transform; transform.setPosition(position); - SFXSource* source = SFX->playOnce(object->getSFXTrack(), &transform, NULL, -1); + SFXSource* source; + if (position == Point3F::Zero || !object->is3D()) + source = SFX->playOnce(object->getSFXTrack()); + else + source = SFX->playOnce(object->getSFXTrack(), &transform, NULL, -1); + if(source) return source->getId(); else diff --git a/Engine/source/T3D/assets/SoundAsset.h b/Engine/source/T3D/assets/SoundAsset.h index 9aaf51224..5e2ecb3e7 100644 --- a/Engine/source/T3D/assets/SoundAsset.h +++ b/Engine/source/T3D/assets/SoundAsset.h @@ -161,7 +161,7 @@ public: inline StringTableEntry getSoundPath(const U32 slotId = 0) const { return mSoundPath[slotId]; }; SFXProfile* getSfxProfile(const U32 slotId = 0) { return &mSFXProfile[slotId]; } SFXPlayList* getSfxPlaylist() { return &mPlaylist; } - SFXTrack* getSFXTrack() { return mIsPlaylist ? dynamic_cast(&mPlaylist) : dynamic_cast(&mSFXProfile[0]); } + SFXTrack* getSFXTrack() { load(); return mIsPlaylist ? dynamic_cast(&mPlaylist) : dynamic_cast(&mSFXProfile[0]); } SFXDescription* getSfxDescription() { return &mProfileDesc; } bool isPlaylist(){ return mIsPlaylist; } diff --git a/Engine/source/T3D/gameBase/gameConnection.cpp b/Engine/source/T3D/gameBase/gameConnection.cpp index 6b19b40b5..6ee34df1b 100644 --- a/Engine/source/T3D/gameBase/gameConnection.cpp +++ b/Engine/source/T3D/gameBase/gameConnection.cpp @@ -1566,7 +1566,7 @@ void GameConnection::play2D(StringTableEntry assetId) { if (AssetDatabase.isDeclaredAsset(assetId)) { - postNetEvent(new SimSoundAssetEvent(assetId)); + postNetEvent(new SimSoundAssetEvent(assetId)); } } @@ -1582,7 +1582,7 @@ void GameConnection::play3D(StringTableEntry assetId, const MatrixF *transform) tempSoundAsset = assetId; if (!mControlObject) - postNetEvent(new SimSoundAssetEvent(assetId, *transform)); + postNetEvent(new SimSoundAssetEvent(assetId, transform)); else { // TODO: Maybe improve this to account for the duration @@ -1596,7 +1596,7 @@ void GameConnection::play3D(StringTableEntry assetId, const MatrixF *transform) transform->getColumn(3, &pos); mControlObject->getTransform().getColumn(3, &ear); if ((ear - pos).len() < tempSoundAsset->getSfxDescription()->mMaxDistance) - postNetEvent(new SimSoundAssetEvent(assetId, *transform)); + postNetEvent(new SimSoundAssetEvent(assetId, transform)); } } diff --git a/Engine/source/T3D/gameBase/gameConnectionEvents.cpp b/Engine/source/T3D/gameBase/gameConnectionEvents.cpp index a24a80c87..4b173902f 100644 --- a/Engine/source/T3D/gameBase/gameConnectionEvents.cpp +++ b/Engine/source/T3D/gameBase/gameConnectionEvents.cpp @@ -297,13 +297,16 @@ void SimDataBlockEvent::process(NetConnection *cptr) static F32 SoundPosAccuracy = 0.5; static S32 SoundRotBits = 8; -SimSoundAssetEvent::SimSoundAssetEvent(StringTableEntry assetId, const MatrixF& mat) +SimSoundAssetEvent::SimSoundAssetEvent(StringTableEntry assetId, const MatrixF* mat) { // cant get here unless the asset is declared. mAsset = assetId; - + sentTransform = false; if (mat) - mTransform = mat; + { + mTransform = *mat; + sentTransform = true; + } } void SimSoundAssetEvent::pack(NetConnection* con, BitStream* stream) @@ -311,10 +314,9 @@ void SimSoundAssetEvent::pack(NetConnection* con, BitStream* stream) NetStringHandle assetIdStr = mAsset->getAssetId(); con->packNetStringHandleU(stream, assetIdStr); - // only stream if this is a 3d sound asset. - if (mAsset->is3D()) + SFXDescription* ad = mAsset->getSfxDescription(); + if (stream->writeFlag(sentTransform)) { - SFXDescription* ad = mAsset->getSfxDescription(); if (stream->writeFlag(ad->mConeInsideAngle || ad->mConeOutsideAngle)) { QuatF q(mTransform); @@ -322,10 +324,10 @@ void SimSoundAssetEvent::pack(NetConnection* con, BitStream* stream) // LH - we can get a valid quat that's very slightly over 1 in and so // this fails (barely) check against zero. So use some error- - AssertFatal((1.0 - ((q.x * q.x) + (q.y * q.y) + (q.z * q.z))) >= (0.0 - 0.001), - "QuatF::normalize() is broken in Sim3DAudioEvent"); + AssertFatal((1.0 - ((q.x * q.x) + (q.y * q.y) + (q.z * q.z))) >= (0.0 - 0.001), + "QuatF::normalize() is broken in Sim3DAudioEvent"); - stream->writeSignedFloat(q.x, SoundRotBits); + stream->writeSignedFloat(q.x, SoundRotBits); stream->writeSignedFloat(q.y, SoundRotBits); stream->writeSignedFloat(q.z, SoundRotBits); stream->writeFlag(q.w < 0.0); @@ -335,7 +337,6 @@ void SimSoundAssetEvent::pack(NetConnection* con, BitStream* stream) mTransform.getColumn(3, &pos); stream->writeCompressedPoint(pos, SoundPosAccuracy); } - } void SimSoundAssetEvent::write(NetConnection* con, BitStream* stream) @@ -356,8 +357,8 @@ void SimSoundAssetEvent::unpack(NetConnection* con, BitStream* stream) mAsset = temp; } - if (mAsset->is3D()) - { + sentTransform = stream->readFlag(); + if (sentTransform) { if (stream->readFlag()) { QuatF q; q.x = stream->readSignedFloat(SoundRotBits); @@ -381,16 +382,15 @@ void SimSoundAssetEvent::unpack(NetConnection* con, BitStream* stream) stream->readCompressedPoint(&pos, SoundPosAccuracy); mTransform.setColumn(3, pos); } + else + { + mTransform = SFX->getListener(0).getTransform(); + } } void SimSoundAssetEvent::process(NetConnection* con) { - - if (mAsset->is3D()) - SFX->playOnce(mAsset->getSFXTrack(), &mTransform); - else - SFX->playOnce(mAsset->getSFXTrack()); - + SFX->playOnce(mAsset->getSFXTrack(), &mTransform); } Sim2DAudioEvent::Sim2DAudioEvent(SFXProfile *profile) diff --git a/Engine/source/T3D/gameBase/gameConnectionEvents.h b/Engine/source/T3D/gameBase/gameConnectionEvents.h index 755e02957..195c5b00f 100644 --- a/Engine/source/T3D/gameBase/gameConnectionEvents.h +++ b/Engine/source/T3D/gameBase/gameConnectionEvents.h @@ -110,11 +110,11 @@ class SimSoundAssetEvent : public NetEvent private: AssetPtr mAsset; MatrixF mTransform; - + bool sentTransform; public: typedef NetEvent Parent; - SimSoundAssetEvent(StringTableEntry assetId = StringTable->EmptyString(), const MatrixF& mat = MatrixF::Identity); + SimSoundAssetEvent(StringTableEntry assetId = StringTable->EmptyString(), const MatrixF* mat = NULL); void pack(NetConnection*, BitStream* bstream); void write(NetConnection*, BitStream* bstream); void unpack(NetConnection*, BitStream* bstream); diff --git a/Templates/BaseGame/game/core/clientServer/scripts/server/audio.tscript b/Templates/BaseGame/game/core/clientServer/scripts/server/audio.tscript index 7cc7abd60..0fcb6be80 100644 --- a/Templates/BaseGame/game/core/clientServer/scripts/server/audio.tscript +++ b/Templates/BaseGame/game/core/clientServer/scripts/server/audio.tscript @@ -21,21 +21,21 @@ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- - -function ServerPlay2D(%profile) +// +function ServerPlay2D(%assetID) { // Play the given sound profile on every client. // The sounds will be transmitted as an event, not attached to any object. for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) - ClientGroup.getObject(%idx).play2D(%profile); + ClientGroup.getObject(%idx).play2D(%assetID); } -function ServerPlay3D(%profile,%transform) +function ServerPlay3D(%assetID,%transform) { - // Play the given sound profile at the given position on every client + // Play the given sound assetID at the given position on every client // The sound will be transmitted as an event, not attached to any object. for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) - ClientGroup.getObject(%idx).play3D(%profile,%transform); + ClientGroup.getObject(%idx).play3D(%assetID,%transform); } function ServerPlaySound(%profile,%pos)