mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-02-22 08:03:45 +00:00
commit
f940360b96
6 changed files with 36 additions and 31 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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<SFXTrack*>(&mPlaylist) : dynamic_cast<SFXTrack*>(&mSFXProfile[0]); }
|
||||
SFXTrack* getSFXTrack() { load(); return mIsPlaylist ? dynamic_cast<SFXTrack*>(&mPlaylist) : dynamic_cast<SFXTrack*>(&mSFXProfile[0]); }
|
||||
SFXDescription* getSfxDescription() { return &mProfileDesc; }
|
||||
bool isPlaylist(){ return mIsPlaylist; }
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -110,11 +110,11 @@ class SimSoundAssetEvent : public NetEvent
|
|||
private:
|
||||
AssetPtr<SoundAsset> 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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue