2018-01-28 20:48:02 +00:00
//-----------------------------------------------------------------------------
// Copyright (c) 2013 GarageGames, LLC
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
//-----------------------------------------------------------------------------
# ifndef SOUND_ASSET_H
# include "SoundAsset.h"
# endif
# ifndef _ASSET_MANAGER_H_
# include "assets/assetManager.h"
# endif
# ifndef _CONSOLETYPES_H_
# include "console/consoleTypes.h"
# endif
# ifndef _TAML_
# include "persistence/taml/taml.h"
# endif
# ifndef _ASSET_PTR_H_
# include "assets/assetPtr.h"
# endif
// Debug Profiling.
# include "platform/profiler.h"
2021-07-19 06:07:08 +00:00
# include "sfx/sfxTypes.h"
2018-01-28 20:48:02 +00:00
//-----------------------------------------------------------------------------
IMPLEMENT_CONOBJECT ( SoundAsset ) ;
2021-07-19 06:07:08 +00:00
ConsoleType ( SoundAssetPtr , TypeSoundAssetPtr , const char * , ASSET_ID_FIELD_PREFIX )
2018-01-28 20:48:02 +00:00
//-----------------------------------------------------------------------------
ConsoleGetType ( TypeSoundAssetPtr )
{
// Fetch asset Id.
2021-07-19 06:07:08 +00:00
return * ( ( const char * * ) ( dptr ) ) ;
2018-01-28 20:48:02 +00:00
}
//-----------------------------------------------------------------------------
ConsoleSetType ( TypeSoundAssetPtr )
{
// Was a single argument specified?
if ( argc = = 1 )
{
// Yes, so fetch field value.
2021-07-19 06:07:08 +00:00
* ( ( const char * * ) dptr ) = StringTable - > insert ( argv [ 0 ] ) ;
2018-01-28 20:48:02 +00:00
2021-07-19 06:07:08 +00:00
return ;
}
2018-01-28 20:48:02 +00:00
2021-07-19 06:07:08 +00:00
// Warn.
Con : : warnf ( " (TypeSoundAssetPtr) - Cannot set multiple args to a single asset. " ) ;
}
//-----------------------------------------------------------------------------
2018-01-28 20:48:02 +00:00
2021-07-19 06:07:08 +00:00
ConsoleType ( assetIdString , TypeSoundAssetId , const char * , ASSET_ID_FIELD_PREFIX )
ConsoleGetType ( TypeSoundAssetId )
{
// Fetch asset Id.
return * ( ( const char * * ) ( dptr ) ) ;
}
ConsoleSetType ( TypeSoundAssetId )
{
// Was a single argument specified?
if ( argc = = 1 )
{
// Yes, so fetch field value.
* ( ( const char * * ) dptr ) = StringTable - > insert ( argv [ 0 ] ) ;
2018-01-28 20:48:02 +00:00
return ;
}
// Warn.
2021-07-19 06:07:08 +00:00
Con : : warnf ( " (TypeAssetId) - Cannot set multiple args to a single asset. " ) ;
2018-01-28 20:48:02 +00:00
}
//-----------------------------------------------------------------------------
SoundAsset : : SoundAsset ( )
{
2019-05-04 16:49:42 +00:00
mSoundFile = StringTable - > EmptyString ( ) ;
2020-08-09 06:32:27 +00:00
mSoundPath = StringTable - > EmptyString ( ) ;
2021-07-19 06:07:08 +00:00
mSubtitleString = StringTable - > EmptyString ( ) ;
mLoadedState = AssetErrCode : : NotLoaded ;
mPreload = false ;
// SFX description inits
// reverb is useless here, reverb is inacted on listener.
mProfileDesc . mPitch = 1 ;
mProfileDesc . mVolume = 1 ;
mProfileDesc . mIs3D = false ;
mProfileDesc . mIsLooping = false ;
mProfileDesc . mIsStreaming = false ;
mProfileDesc . mUseHardware = false ;
mProfileDesc . mMinDistance = 1 ;
mProfileDesc . mMaxDistance = 100 ;
mProfileDesc . mConeInsideAngle = 360 ;
mProfileDesc . mConeOutsideAngle = 360 ;
mProfileDesc . mConeOutsideVolume = 1 ;
mProfileDesc . mRolloffFactor = - 1.0f ;
mProfileDesc . mScatterDistance = Point3F ( 0.f , 0.f , 0.f ) ;
mProfileDesc . mPriority = 1.0f ;
mProfileDesc . mSourceGroup = NULL ;
2018-01-28 20:48:02 +00:00
}
//-----------------------------------------------------------------------------
SoundAsset : : ~ SoundAsset ( )
{
}
//-----------------------------------------------------------------------------
void SoundAsset : : initPersistFields ( )
{
// Call parent.
Parent : : initPersistFields ( ) ;
2019-05-04 16:49:42 +00:00
addProtectedField ( " soundFile " , TypeAssetLooseFilePath , Offset ( mSoundFile , SoundAsset ) ,
& setSoundFile , & getSoundFile , " Path to the sound file. " ) ;
2018-01-28 20:48:02 +00:00
2021-07-19 06:07:08 +00:00
addField ( " pitchAdjust " , TypeF32 , Offset ( mProfileDesc . mPitch , SoundAsset ) , " Adjustment of the pitch value 1 is default. " ) ;
addField ( " volumeAdjust " , TypeF32 , Offset ( mProfileDesc . mVolume , SoundAsset ) , " Adjustment to the volume. " ) ;
addField ( " is3D " , TypeBool , Offset ( mProfileDesc . mIs3D , SoundAsset ) , " Set this sound to 3D. " ) ;
addField ( " isLooping " , TypeBool , Offset ( mProfileDesc . mIsLooping , SoundAsset ) , " Does this sound loop. " ) ;
// if streaming, a default packet size should be chosen for all sounds.
addField ( " isStreaming " , TypeBool , Offset ( mProfileDesc . mIsStreaming , SoundAsset ) , " Use streaming. " ) ;
//....why?
addField ( " useHardware " , TypeBool , Offset ( mProfileDesc . mUseHardware , SoundAsset ) , " Use hardware mixing for this sound. " ) ;
addField ( " minDistance " , TypeF32 , Offset ( mProfileDesc . mMinDistance , SoundAsset ) , " Minimum distance for sound. " ) ;
// more like it.
addField ( " maxDistance " , TypeF32 , Offset ( mProfileDesc . mMaxDistance , SoundAsset ) , " Max distance for sound. " ) ;
addField ( " coneInsideAngle " , TypeS32 , Offset ( mProfileDesc . mConeInsideAngle , SoundAsset ) , " Cone inside angle. " ) ;
addField ( " coneOutsideAngle " , TypeS32 , Offset ( mProfileDesc . mConeOutsideAngle , SoundAsset ) , " Cone outside angle. " ) ;
addField ( " coneOutsideVolume " , TypeS32 , Offset ( mProfileDesc . mConeOutsideVolume , SoundAsset ) , " Cone outside volume. " ) ;
addField ( " rolloffFactor " , TypeF32 , Offset ( mProfileDesc . mRolloffFactor , SoundAsset ) , " Rolloff factor. " ) ;
addField ( " scatterDistance " , TypePoint3F , Offset ( mProfileDesc . mScatterDistance , SoundAsset ) , " Randomization to the spacial position of the sound. " ) ;
addField ( " sourceGroup " , TypeSFXSourceName , Offset ( mProfileDesc . mSourceGroup , SoundAsset ) , " Group that sources playing with this description should be put into. " ) ;
2018-01-28 20:48:02 +00:00
}
//------------------------------------------------------------------------------
void SoundAsset : : copyTo ( SimObject * object )
{
// Call to parent.
Parent : : copyTo ( object ) ;
}
void SoundAsset : : initializeAsset ( void )
{
2021-07-19 06:07:08 +00:00
Parent : : initializeAsset ( ) ;
if ( mSoundFile = = StringTable - > EmptyString ( ) )
return ;
//ResourceManager::get().getChangedSignal.notify(this, &SoundAsset::_onResourceChanged);
//Ensure our path is expando'd if it isn't already
2021-08-22 04:12:37 +00:00
mSoundPath = getOwned ( ) ? expandAssetFilePath ( mSoundFile ) : mSoundPath ;
2021-07-19 06:07:08 +00:00
mSoundPath = expandAssetFilePath ( mSoundPath ) ;
loadSound ( ) ;
}
void SoundAsset : : _onResourceChanged ( const Torque : : Path & path )
{
if ( path ! = Torque : : Path ( mSoundPath ) )
return ;
refreshAsset ( ) ;
loadSound ( ) ;
2018-01-28 20:48:02 +00:00
}
void SoundAsset : : onAssetRefresh ( void )
{
2021-07-19 06:07:08 +00:00
if ( mSoundFile = = StringTable - > EmptyString ( ) )
return ;
//Update
2021-08-22 04:12:37 +00:00
mSoundPath = getOwned ( ) ? expandAssetFilePath ( mSoundFile ) : mSoundPath ;
2021-07-19 06:07:08 +00:00
loadSound ( ) ;
}
bool SoundAsset : : loadSound ( )
{
if ( mSoundPath )
{
2021-07-23 02:27:13 +00:00
if ( ! Torque : : FS : : IsFile ( mSoundPath ) )
2021-07-19 06:07:08 +00:00
{
Con : : errorf ( " SoundAsset::initializeAsset: Attempted to load file %s but it was not valid! " , mSoundFile ) ;
mLoadedState = BadFileReference ;
return false ;
}
else
{ // = new SFXProfile(mProfileDesc, mSoundFile, mPreload);
mSFXProfile . setDescription ( & mProfileDesc ) ;
mSFXProfile . setSoundFileName ( mSoundFile ) ;
mSFXProfile . setPreload ( mPreload ) ;
}
}
mChangeSignal . trigger ( ) ;
mLoadedState = Ok ;
return true ;
2019-05-04 16:49:42 +00:00
}
void SoundAsset : : setSoundFile ( const char * pSoundFile )
{
// Sanity!
2021-07-19 06:07:08 +00:00
AssertFatal ( pSoundFile ! = NULL , " Cannot use a NULL sound file. " ) ;
2019-05-04 16:49:42 +00:00
2021-07-19 06:07:08 +00:00
// Fetch sound file.
2021-08-22 04:12:37 +00:00
pSoundFile = StringTable - > insert ( pSoundFile , true ) ;
2019-05-04 16:49:42 +00:00
// Ignore no change,
if ( pSoundFile = = mSoundFile )
return ;
// Update.
2021-08-22 04:12:37 +00:00
mSoundFile = getOwned ( ) ? expandAssetFilePath ( pSoundFile ) : pSoundFile ;
2019-05-04 16:49:42 +00:00
// Refresh the asset.
refreshAsset ( ) ;
}
2020-08-25 01:24:50 +00:00
DefineEngineMethod ( SoundAsset , getSoundPath , const char * , ( ) , , " " )
{
return object - > getSoundPath ( ) ;
}
2021-07-19 06:07:08 +00:00
IMPLEMENT_CONOBJECT ( GuiInspectorTypeSoundAssetPtr ) ;
ConsoleDocClass ( GuiInspectorTypeSoundAssetPtr ,
" @brief Inspector field type for Sounds \n \n "
" Editor use only. \n \n "
" @internal "
) ;
void GuiInspectorTypeSoundAssetPtr : : consoleInit ( )
{
Parent : : consoleInit ( ) ;
ConsoleBaseType : : getType ( TypeSoundAssetPtr ) - > setInspectorFieldType ( " GuiInspectorTypeSoundAssetPtr " ) ;
}
GuiControl * GuiInspectorTypeSoundAssetPtr : : constructEditControl ( )
{
return nullptr ;
}
bool GuiInspectorTypeSoundAssetPtr : : updateRects ( )
{
return false ;
}
IMPLEMENT_CONOBJECT ( GuiInspectorTypeSoundAssetId ) ;
ConsoleDocClass ( GuiInspectorTypeSoundAssetId ,
" @brief Inspector field type for Sounds \n \n "
" Editor use only. \n \n "
" @internal "
) ;
void GuiInspectorTypeSoundAssetId : : consoleInit ( )
{
Parent : : consoleInit ( ) ;
ConsoleBaseType : : getType ( TypeSoundAssetId ) - > setInspectorFieldType ( " GuiInspectorTypeSoundAssetId " ) ;
}