sfxEnvironment.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  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; unused, but kept for doc purposes -BJR
  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("reverbDensity", TypeF32, Offset(mReverb.flDensity, SFXEnvironment),
  126. "Density of reverb environment.");
  127. addField("reverbDiffusion", TypeF32, Offset(mReverb.flDiffusion, SFXEnvironment),
  128. "Environment diffusion.");
  129. addField("reverbGain", TypeF32, Offset(mReverb.flGain, SFXEnvironment),
  130. "Reverb Gain Level.");
  131. addField("reverbGainHF", TypeF32, Offset(mReverb.flGainHF, SFXEnvironment),
  132. "Reverb Gain to high frequencies");
  133. addField("reverbGainLF", TypeF32, Offset(mReverb.flGainLF, SFXEnvironment),
  134. "Reverb Gain to high frequencies");
  135. addField("reverbDecayTime", TypeF32, Offset(mReverb.flDecayTime, SFXEnvironment),
  136. "Decay time for the reverb.");
  137. addField("reverbDecayHFRatio", TypeF32, Offset(mReverb.flDecayHFRatio, SFXEnvironment),
  138. "High frequency decay time ratio.");
  139. addField("reverbDecayLFRatio", TypeF32, Offset(mReverb.flDecayLFRatio, SFXEnvironment),
  140. "High frequency decay time ratio.");
  141. addField("reflectionsGain", TypeF32, Offset(mReverb.flReflectionsGain, SFXEnvironment),
  142. "Reflection Gain.");
  143. addField("reflectionDelay", TypeF32, Offset(mReverb.flReflectionsDelay, SFXEnvironment),
  144. "How long to delay reflections.");
  145. addField("reflectionsPan", TypeF32, Offset(mReverb.flReflectionsPan, SFXEnvironment), 3,
  146. "Reflection reverberation panning vector.");
  147. addField("lateReverbGain", TypeF32, Offset(mReverb.flLateReverbGain, SFXEnvironment),
  148. "Late reverb gain amount.");
  149. addField("lateReverbDelay", TypeF32, Offset(mReverb.flLateReverbDelay, SFXEnvironment),
  150. "Late reverb delay time.");
  151. addField("lateReverbPan", TypeF32, Offset(mReverb.flLateReverbPan, SFXEnvironment), 3,
  152. "Late reverberation panning vector.");
  153. addField("reverbEchoTime", TypeF32, Offset(mReverb.flEchoTime, SFXEnvironment),
  154. "Reverb echo time.");
  155. addField("reverbEchoDepth", TypeF32, Offset(mReverb.flEchoDepth, SFXEnvironment),
  156. "Reverb echo depth.");
  157. addField("reverbModTime", TypeF32, Offset(mReverb.flModulationTime, SFXEnvironment),
  158. "Reverb Modulation time.");
  159. addField("reverbModDepth", TypeF32, Offset(mReverb.flModulationDepth, SFXEnvironment),
  160. "Reverb Modulation time.");
  161. addField("airAbsorbtionGainHF", TypeF32, Offset(mReverb.flAirAbsorptionGainHF, SFXEnvironment),
  162. "High Frequency air absorbtion");
  163. addField("reverbHFRef", TypeF32, Offset(mReverb.flHFReference, SFXEnvironment),
  164. "Reverb High Frequency Reference.");
  165. addField("reverbLFRef", TypeF32, Offset(mReverb.flLFReference, SFXEnvironment),
  166. "Reverb Low Frequency Reference.");
  167. addField("roomRolloffFactor", TypeF32, Offset(mReverb.flRoomRolloffFactor, SFXEnvironment),
  168. "Rolloff factor for reverb.");
  169. addField("decayHFLimit", TypeS32, Offset(mReverb.iDecayHFLimit, SFXEnvironment),
  170. "High Frequency decay limit.");
  171. endGroup("Reverb");
  172. Parent::initPersistFields();
  173. }
  174. //-----------------------------------------------------------------------------
  175. bool SFXEnvironment::onAdd()
  176. {
  177. if( !Parent::onAdd() )
  178. return false;
  179. Sim::getSFXEnvironmentSet()->addObject( this );
  180. return true;
  181. }
  182. //-----------------------------------------------------------------------------
  183. bool SFXEnvironment::preload( bool server, String& errorStr )
  184. {
  185. if( !Parent::preload( server, errorStr ) )
  186. return false;
  187. validate();
  188. return true;
  189. }
  190. //-----------------------------------------------------------------------------
  191. void SFXEnvironment::inspectPostApply()
  192. {
  193. Parent::inspectPostApply();
  194. validate();
  195. }
  196. //-----------------------------------------------------------------------------
  197. void SFXEnvironment::validate()
  198. {
  199. mReverb.validate();
  200. }
  201. //-----------------------------------------------------------------------------
  202. void SFXEnvironment::packData( BitStream* stream )
  203. {
  204. Parent::packData( stream );
  205. stream->write(mReverb.flDensity);
  206. stream->write(mReverb.flDiffusion);
  207. stream->write(mReverb.flGain);
  208. stream->write(mReverb.flGainHF);
  209. stream->write(mReverb.flGainLF);
  210. stream->write(mReverb.flDecayTime);
  211. stream->write(mReverb.flDecayHFRatio);
  212. stream->write(mReverb.flDecayLFRatio);
  213. stream->write(mReverb.flReflectionsGain);
  214. stream->write(mReverb.flReflectionsDelay);
  215. stream->write(mReverb.flLateReverbGain);
  216. stream->write(mReverb.flLateReverbDelay);
  217. stream->write(mReverb.flEchoTime);
  218. stream->write(mReverb.flEchoDepth);
  219. stream->write(mReverb.flModulationTime);
  220. stream->write(mReverb.flModulationDepth);
  221. stream->write(mReverb.flAirAbsorptionGainHF);
  222. stream->write(mReverb.flHFReference);
  223. stream->write(mReverb.flLFReference);
  224. stream->write(mReverb.flRoomRolloffFactor);
  225. stream->write(mReverb.iDecayHFLimit);
  226. }
  227. //-----------------------------------------------------------------------------
  228. void SFXEnvironment::unpackData( BitStream* stream )
  229. {
  230. Parent::unpackData( stream );
  231. stream->read(&mReverb.flDensity);
  232. stream->read(&mReverb.flDiffusion);
  233. stream->read(&mReverb.flGain);
  234. stream->read(&mReverb.flGainHF);
  235. stream->read(&mReverb.flGainLF);
  236. stream->read(&mReverb.flDecayTime);
  237. stream->read(&mReverb.flDecayHFRatio);
  238. stream->read(&mReverb.flDecayLFRatio);
  239. stream->read(&mReverb.flReflectionsGain);
  240. stream->read(&mReverb.flReflectionsDelay);
  241. stream->read(&mReverb.flLateReverbGain);
  242. stream->read(&mReverb.flLateReverbDelay);
  243. stream->read(&mReverb.flEchoTime);
  244. stream->read(&mReverb.flEchoDepth);
  245. stream->read(&mReverb.flModulationTime);
  246. stream->read(&mReverb.flModulationDepth);
  247. stream->read(&mReverb.flAirAbsorptionGainHF);
  248. stream->read(&mReverb.flHFReference);
  249. stream->read(&mReverb.flLFReference);
  250. stream->read(&mReverb.flRoomRolloffFactor);
  251. stream->read(&mReverb.iDecayHFLimit);
  252. }