sfxEnvironment.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2012 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22. #include "sfx/sfxEnvironment.h"
  23. #include "sim/netConnection.h"
  24. #include "core/stream/bitStream.h"
  25. #include "core/module.h"
  26. IMPLEMENT_CO_DATABLOCK_V1( SFXEnvironment );
  27. // Reverb flags.
  28. static const U32 sReverbFlagDecayTimeScale = 0x001;
  29. static const U32 sReverbFlagReflectionsScale = 0x002;
  30. static const U32 sReverbFlagReflectionsDelayScale = 0x004;
  31. static const U32 sReverbFlagReverbScale = 0x008;
  32. static const U32 sReverbFlagReverbDelayScale = 0x010;
  33. static const U32 sReverbFlagDecayHFLimit = 0x020;
  34. static const U32 sReverbFlagEchoTimeScale = 0x040;
  35. static const U32 sReverbFlagModulationTimeScale = 0x080;
  36. static const U32 sReverbFlagCore0 = 0x100;
  37. static const U32 sReverbFlagCore1 = 0x200;
  38. static const U32 sReverbFlagHighQualityReverb = 0x400;
  39. static const U32 sReverbFlagHighQualityDPL2Reverb = 0x800;
  40. AFTER_MODULE_INIT( SFX )
  41. {
  42. Con::addConstant( "SFXEnvironment::REVERB_DECAYTIMESCALE", TypeS32, &sReverbFlagDecayTimeScale,
  43. "SFXEnvironment::envSize affects reverberation decay time.\n"
  44. "@see SFXEnvironment::flags\n\n"
  45. "@ingroup SFXEnvironment" );
  46. Con::addConstant( "SFXEnvironment::REVERB_REFLECTIONSSCALE", TypeS32, &sReverbFlagReflectionsScale,
  47. "SFXEnvironment::envSize affects reflection level.\n"
  48. "@see SFXEnvironment::flags\n\n"
  49. "@ingroup SFXEnvironment" );
  50. Con::addConstant( "SFXEnvironment::REVERB_REFLECTIONSDELAYSCALE", TypeS32, &sReverbFlagReflectionsScale,
  51. "SFXEnvironment::envSize affects initial reflection delay time.\n"
  52. "@see SFXEnvironment::flags\n\n"
  53. "@ingroup SFXEnvironment" );
  54. Con::addConstant( "SFXEnvironment::REVERB_REVERBSCALE", TypeS32, &sReverbFlagReverbScale,
  55. "SFXEnvironment::envSize affects reflections level.\n"
  56. "@see SFXEnvironment::flags\n\n"
  57. "@ingroup SFXEnvironment" );
  58. Con::addConstant( "SFXEnvironment::REVERB_REVERBDELAYSCALE", TypeS32, &sReverbFlagReverbDelayScale,
  59. "SFXEnvironment::envSize affects late reverberation delay time.\n"
  60. "@see SFXEnvironment::flags\n\n"
  61. "@ingroup SFXEnvironment" );
  62. Con::addConstant( "SFXEnvironment::REVERB_DECAYHFLIMIT", TypeS32, &sReverbFlagDecayHFLimit,
  63. "SFXEnvironment::airAbsorptionHF affects SFXEnvironment::decayHFRatio.\n"
  64. "@see SFXEnvironment::flags\n\n"
  65. "@ingroup SFXEnvironment" );
  66. Con::addConstant( "SFXEnvironment::REVERB_ECHOTIMESCALE", TypeS32, &sReverbFlagEchoTimeScale,
  67. "SFXEnvironment::envSize affects echo time.\n"
  68. "@see SFXEnvironment::flags\n\n"
  69. "@ingroup SFXEnvironment" );
  70. Con::addConstant( "SFXEnvironment::REVERB_MODULATIONTIMESCALE", TypeS32, &sReverbFlagModulationTimeScale,
  71. "SFXEnvironment::envSize affects modulation time.\n"
  72. "@see SFXEnvironment::flags\n\n"
  73. "@ingroup SFXEnvironment" );
  74. Con::addConstant( "SFXEnvironment::REVERB_CORE0", TypeS32, &sReverbFlagCore0,
  75. "PS2 Only - Reverb is applied to CORE0 (hw voices 0-23).\n"
  76. "@see SFXEnvironment::flags\n\n"
  77. "@ingroup SFXEnvironment" );
  78. Con::addConstant( "SFXEnvironment::REVERB_CORE1", TypeS32, &sReverbFlagCore1,
  79. "PS2 Only - Reverb is applied to CORE1 (hw voices 24-47).\n"
  80. "@see SFXEnvironment::flags\n\n"
  81. "@ingroup SFXEnvironment" );
  82. Con::addConstant( "SFXEnvironment::REVERB_HIGHQUALITYREVERB", TypeS32, &sReverbFlagHighQualityReverb,
  83. "GameCube/Wii Only - Use high-quality reverb.\n"
  84. "@see SFXEnvironment::flags\n\n"
  85. "@ingroup SFXEnvironment" );
  86. Con::addConstant( "SFXEnvironment::REVERB_HIGHQUALITYDPL2REVERB", TypeS32, &sReverbFlagHighQualityDPL2Reverb,
  87. "GameCube/Wii Only - Use high-quality DPL2 reverb.\n"
  88. "@see SFXEnvironment::flags\n\n"
  89. "@ingroup SFXEnvironment" );
  90. }
  91. ConsoleDocClass( SFXEnvironment,
  92. "@brief Description of a reverb environment.\n\n"
  93. "A reverb environment specifies how the audio mixer should render advanced environmental audio "
  94. "effects. \n\n"
  95. "To use reverb environments in your level, set up one or more ambient audio spaces, assign "
  96. "reverb environments appropriately, and then attach the SFXAmbiences to your LevelInfo (taking effect "
  97. "globally) or Zone objects (taking effect locally).\n\n"
  98. "To define your own custom reverb environments, it is usually easiest to adapt one of the pre-existing "
  99. "reverb definitions:\n"
  100. "@tsexample_nopar\n"
  101. "singleton SFXEnvironment( AudioEnvCustomUnderwater : AudioEnvUnderwater )\n"
  102. "{\n"
  103. " // Override select properties from AudioEnvUnderwater here.\n"
  104. "};\n"
  105. "@endtsexample\n\n"
  106. "In the Datablock Editor, this can be done by selecting an existing environment to copy from when creating "
  107. "the SFXEnvironment datablock.\n\n"
  108. "For a precise description of reverb audio and the properties of this class, please consult the EAX "
  109. "documentation.\n\n"
  110. "All SFXEnvironment instances are automatically added to the global @c SFXEnvironmentSet.\n\n"
  111. "@see http://www.atc.creative.com/algorithms/eax20.pdf\n"
  112. "@see http://connect.creativelabs.com/developer/Gaming/Forms/AllItems.aspx\n"
  113. "@see SFXAmbience::environment\n\n"
  114. "@ref SFX_reverb\n"
  115. "@ingroup SFX\n"
  116. );
  117. //-----------------------------------------------------------------------------
  118. SFXEnvironment::SFXEnvironment()
  119. {
  120. }
  121. //-----------------------------------------------------------------------------
  122. void SFXEnvironment::initPersistFields()
  123. {
  124. addGroup( "Reverb" );
  125. addField( "envSize", TypeF32, Offset( mReverb.mEnvSize, SFXEnvironment ),
  126. "Environment size in meters." );
  127. addField( "envDiffusion", TypeF32, Offset( mReverb.mEnvDiffusion, SFXEnvironment ),
  128. "Environment diffusion." );
  129. addField( "room", TypeS32, Offset( mReverb.mRoom, SFXEnvironment ),
  130. "Room effect level at mid-frequencies." );
  131. addField( "roomHF", TypeS32, Offset( mReverb.mRoomHF, SFXEnvironment ),
  132. "Relative room effect level at high frequencies." );
  133. addField( "roomLF", TypeS32, Offset( mReverb.mRoomLF, SFXEnvironment ),
  134. "Relative room effect level at low frequencies." );
  135. addField( "decayTime", TypeF32, Offset( mReverb.mDecayTime, SFXEnvironment ),
  136. "Reverberation decay time at mid frequencies." );
  137. addField( "decayHFRatio", TypeF32, Offset( mReverb.mDecayHFRatio, SFXEnvironment ),
  138. "High-frequency to mid-frequency decay time ratio." );
  139. addField( "decayLFRatio", TypeF32, Offset( mReverb.mDecayLFRatio, SFXEnvironment ),
  140. "Low-frequency to mid-frequency decay time ratio." );
  141. addField( "reflections", TypeS32, Offset( mReverb.mReflections, SFXEnvironment ),
  142. "Early reflections level relative to room effect." );
  143. addField( "reflectionsDelay", TypeF32, Offset( mReverb.mReflectionsDelay, SFXEnvironment ),
  144. "Initial reflection delay time." );
  145. addField( "reflectionsPan", TypeF32, Offset( mReverb.mReflectionsPan, SFXEnvironment ), 3,
  146. "Early reflections panning vector." );
  147. addField( "reverb", TypeS32, Offset( mReverb.mReverb, SFXEnvironment ),
  148. "Late reverberation level relative to room effect." );
  149. addField( "reverbDelay", TypeF32, Offset( mReverb.mReverbDelay, SFXEnvironment ),
  150. "Late reverberation delay time relative to initial reflection." );
  151. addField( "reverbPan", TypeF32, Offset( mReverb.mReverbPan, SFXEnvironment ), 3,
  152. "Late reverberation panning vector." );
  153. addField( "echoTime", TypeF32, Offset( mReverb.mEchoTime, SFXEnvironment ),
  154. "Echo time." );
  155. addField( "echoDepth", TypeF32, Offset( mReverb.mEchoDepth, SFXEnvironment ),
  156. "Echo depth." );
  157. addField( "modulationTime", TypeF32, Offset( mReverb.mModulationTime, SFXEnvironment ),
  158. "Modulation time." );
  159. addField( "modulationDepth", TypeF32, Offset( mReverb.mModulationDepth, SFXEnvironment ),
  160. "Modulation depth." );
  161. addField( "airAbsorptionHF", TypeF32, Offset( mReverb.mAirAbsorptionHF, SFXEnvironment ),
  162. "Change in level per meter at high frequencies." );
  163. addField( "HFReference", TypeF32, Offset( mReverb.mHFReference, SFXEnvironment ),
  164. "Reference high frequency in Hertz." );
  165. addField( "LFReference", TypeF32, Offset( mReverb.mLFReference, SFXEnvironment ),
  166. "Reference low frequency in Hertz." );
  167. addField( "roomRolloffFactor", TypeF32, Offset( mReverb.mRoomRolloffFactor, SFXEnvironment ),
  168. "Logarithmic distance attenuation rolloff scale factor for reverb room size effect." );
  169. addField( "diffusion", TypeF32, Offset( mReverb.mDiffusion, SFXEnvironment ),
  170. "Value that controls the echo density in the late reverberation decay." );
  171. addField( "density", TypeF32, Offset( mReverb.mDensity, SFXEnvironment ),
  172. "Value that controls the modal density in the late reverberation decay." );
  173. addField( "flags", TypeS32, Offset( mReverb.mFlags, SFXEnvironment ),
  174. "A bitfield of reverb flags.\n"
  175. "@see REVERB_DECAYTIMESCALE\n"
  176. "@see REVERB_REFLECTIONSSCALE\n"
  177. "@see REVERB_REFLECTIONSDELAYSCALE\n"
  178. "@see REVERB_REVERBSCALE\n"
  179. "@see REVERB_REVERBDELAYSCALE\n"
  180. "@see REVERB_DECAYHFLIMIT\n"
  181. "@see REVERB_ECHOTIMESCALE\n"
  182. "@see REVERB_MODULATIONTIMESCALE\n"
  183. "@see REVERB_CORE0\n"
  184. "@see REVERB_CORE1\n"
  185. "@see REVERB_HIGHQUALITYREVERB\n"
  186. "@see REVERB_HIGHQUALITYDPL2REVERB\n" );
  187. endGroup( "Reverb" );
  188. Parent::initPersistFields();
  189. }
  190. //-----------------------------------------------------------------------------
  191. bool SFXEnvironment::onAdd()
  192. {
  193. if( !Parent::onAdd() )
  194. return false;
  195. Sim::getSFXEnvironmentSet()->addObject( this );
  196. return true;
  197. }
  198. //-----------------------------------------------------------------------------
  199. bool SFXEnvironment::preload( bool server, String& errorStr )
  200. {
  201. if( !Parent::preload( server, errorStr ) )
  202. return false;
  203. validate();
  204. return true;
  205. }
  206. //-----------------------------------------------------------------------------
  207. void SFXEnvironment::inspectPostApply()
  208. {
  209. Parent::inspectPostApply();
  210. validate();
  211. }
  212. //-----------------------------------------------------------------------------
  213. void SFXEnvironment::validate()
  214. {
  215. mReverb.validate();
  216. }
  217. //-----------------------------------------------------------------------------
  218. void SFXEnvironment::packData( BitStream* stream )
  219. {
  220. Parent::packData( stream );
  221. stream->write( mReverb.mEnvSize );
  222. stream->write( mReverb.mEnvDiffusion );
  223. stream->write( mReverb.mRoom );
  224. stream->write( mReverb.mRoomHF );
  225. stream->write( mReverb.mRoomLF );
  226. stream->write( mReverb.mDecayTime );
  227. stream->write( mReverb.mDecayHFRatio );
  228. stream->write( mReverb.mDecayLFRatio );
  229. stream->write( mReverb.mReflections );
  230. stream->write( mReverb.mReflectionsDelay );
  231. stream->write( mReverb.mReflectionsPan[ 0 ] );
  232. stream->write( mReverb.mReflectionsPan[ 1 ] );
  233. stream->write( mReverb.mReflectionsPan[ 2 ] );
  234. stream->write( mReverb.mReverb );
  235. stream->write( mReverb.mReverbDelay );
  236. stream->write( mReverb.mReverbPan[ 0 ] );
  237. stream->write( mReverb.mReverbPan[ 1 ] );
  238. stream->write( mReverb.mReverbPan[ 2 ] );
  239. stream->write( mReverb.mEchoTime );
  240. stream->write( mReverb.mEchoDepth );
  241. stream->write( mReverb.mModulationTime );
  242. stream->write( mReverb.mModulationDepth );
  243. stream->write( mReverb.mAirAbsorptionHF );
  244. stream->write( mReverb.mHFReference );
  245. stream->write( mReverb.mLFReference );
  246. stream->write( mReverb.mRoomRolloffFactor );
  247. stream->write( mReverb.mDiffusion );
  248. stream->write( mReverb.mDensity );
  249. stream->write( mReverb.mFlags );
  250. }
  251. //-----------------------------------------------------------------------------
  252. void SFXEnvironment::unpackData( BitStream* stream )
  253. {
  254. Parent::unpackData( stream );
  255. stream->read( &mReverb.mEnvSize );
  256. stream->read( &mReverb.mEnvDiffusion );
  257. stream->read( &mReverb.mRoom );
  258. stream->read( &mReverb.mRoomHF );
  259. stream->read( &mReverb.mRoomLF );
  260. stream->read( &mReverb.mDecayTime );
  261. stream->read( &mReverb.mDecayHFRatio );
  262. stream->read( &mReverb.mDecayLFRatio );
  263. stream->read( &mReverb.mReflections );
  264. stream->read( &mReverb.mReflectionsDelay );
  265. stream->read( &mReverb.mReflectionsPan[ 0 ] );
  266. stream->read( &mReverb.mReflectionsPan[ 1 ] );
  267. stream->read( &mReverb.mReflectionsPan[ 2 ] );
  268. stream->read( &mReverb.mReverb );
  269. stream->read( &mReverb.mReverbDelay );
  270. stream->read( &mReverb.mReverbPan[ 0 ] );
  271. stream->read( &mReverb.mReverbPan[ 1 ] );
  272. stream->read( &mReverb.mReverbPan[ 2 ] );
  273. stream->read( &mReverb.mEchoTime );
  274. stream->read( &mReverb.mEchoDepth );
  275. stream->read( &mReverb.mModulationTime );
  276. stream->read( &mReverb.mModulationDepth );
  277. stream->read( &mReverb.mAirAbsorptionHF );
  278. stream->read( &mReverb.mHFReference );
  279. stream->read( &mReverb.mLFReference );
  280. stream->read( &mReverb.mRoomRolloffFactor );
  281. stream->read( &mReverb.mDiffusion );
  282. stream->read( &mReverb.mDensity );
  283. stream->read( &mReverb.mFlags );
  284. }