Ver código fonte

Merge pull request #1199 from Azaezel/alpha41/sfxSafties

sfx safeties
Brian Roberts 1 ano atrás
pai
commit
f940360b96

+ 6 - 1
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

+ 1 - 1
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<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; }
 

+ 3 - 3
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));
       }
 
    }

+ 18 - 18
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)

+ 2 - 2
Engine/source/T3D/gameBase/gameConnectionEvents.h

@@ -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);

+ 6 - 6
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)