123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- //-----------------------------------------------------------------------------
- // Copyright (c) 2012 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.
- //-----------------------------------------------------------------------------
- #include "sfx/sfxEnvironment.h"
- #include "sim/netConnection.h"
- #include "core/stream/bitStream.h"
- #include "core/module.h"
- IMPLEMENT_CO_DATABLOCK_V1( SFXEnvironment );
- // Reverb flags.
- static const U32 sReverbFlagDecayTimeScale = 0x001;
- static const U32 sReverbFlagReflectionsScale = 0x002;
- //static const U32 sReverbFlagReflectionsDelayScale = 0x004; unused, but kept for doc purposes -BJR
- static const U32 sReverbFlagReverbScale = 0x008;
- static const U32 sReverbFlagReverbDelayScale = 0x010;
- static const U32 sReverbFlagDecayHFLimit = 0x020;
- static const U32 sReverbFlagEchoTimeScale = 0x040;
- static const U32 sReverbFlagModulationTimeScale = 0x080;
- static const U32 sReverbFlagCore0 = 0x100;
- static const U32 sReverbFlagCore1 = 0x200;
- static const U32 sReverbFlagHighQualityReverb = 0x400;
- static const U32 sReverbFlagHighQualityDPL2Reverb = 0x800;
- AFTER_MODULE_INIT( SFX )
- {
- Con::addConstant( "SFXEnvironment::REVERB_DECAYTIMESCALE", TypeS32, &sReverbFlagDecayTimeScale,
- "SFXEnvironment::envSize affects reverberation decay time.\n"
- "@see SFXEnvironment::flags\n\n"
- "@ingroup SFXEnvironment" );
- Con::addConstant( "SFXEnvironment::REVERB_REFLECTIONSSCALE", TypeS32, &sReverbFlagReflectionsScale,
- "SFXEnvironment::envSize affects reflection level.\n"
- "@see SFXEnvironment::flags\n\n"
- "@ingroup SFXEnvironment" );
- Con::addConstant( "SFXEnvironment::REVERB_REFLECTIONSDELAYSCALE", TypeS32, &sReverbFlagReflectionsScale,
- "SFXEnvironment::envSize affects initial reflection delay time.\n"
- "@see SFXEnvironment::flags\n\n"
- "@ingroup SFXEnvironment" );
- Con::addConstant( "SFXEnvironment::REVERB_REVERBSCALE", TypeS32, &sReverbFlagReverbScale,
- "SFXEnvironment::envSize affects reflections level.\n"
- "@see SFXEnvironment::flags\n\n"
- "@ingroup SFXEnvironment" );
- Con::addConstant( "SFXEnvironment::REVERB_REVERBDELAYSCALE", TypeS32, &sReverbFlagReverbDelayScale,
- "SFXEnvironment::envSize affects late reverberation delay time.\n"
- "@see SFXEnvironment::flags\n\n"
- "@ingroup SFXEnvironment" );
- Con::addConstant( "SFXEnvironment::REVERB_DECAYHFLIMIT", TypeS32, &sReverbFlagDecayHFLimit,
- "SFXEnvironment::airAbsorptionHF affects SFXEnvironment::decayHFRatio.\n"
- "@see SFXEnvironment::flags\n\n"
- "@ingroup SFXEnvironment" );
- Con::addConstant( "SFXEnvironment::REVERB_ECHOTIMESCALE", TypeS32, &sReverbFlagEchoTimeScale,
- "SFXEnvironment::envSize affects echo time.\n"
- "@see SFXEnvironment::flags\n\n"
- "@ingroup SFXEnvironment" );
- Con::addConstant( "SFXEnvironment::REVERB_MODULATIONTIMESCALE", TypeS32, &sReverbFlagModulationTimeScale,
- "SFXEnvironment::envSize affects modulation time.\n"
- "@see SFXEnvironment::flags\n\n"
- "@ingroup SFXEnvironment" );
- Con::addConstant( "SFXEnvironment::REVERB_CORE0", TypeS32, &sReverbFlagCore0,
- "PS2 Only - Reverb is applied to CORE0 (hw voices 0-23).\n"
- "@see SFXEnvironment::flags\n\n"
- "@ingroup SFXEnvironment" );
- Con::addConstant( "SFXEnvironment::REVERB_CORE1", TypeS32, &sReverbFlagCore1,
- "PS2 Only - Reverb is applied to CORE1 (hw voices 24-47).\n"
- "@see SFXEnvironment::flags\n\n"
- "@ingroup SFXEnvironment" );
- Con::addConstant( "SFXEnvironment::REVERB_HIGHQUALITYREVERB", TypeS32, &sReverbFlagHighQualityReverb,
- "GameCube/Wii Only - Use high-quality reverb.\n"
- "@see SFXEnvironment::flags\n\n"
- "@ingroup SFXEnvironment" );
- Con::addConstant( "SFXEnvironment::REVERB_HIGHQUALITYDPL2REVERB", TypeS32, &sReverbFlagHighQualityDPL2Reverb,
- "GameCube/Wii Only - Use high-quality DPL2 reverb.\n"
- "@see SFXEnvironment::flags\n\n"
- "@ingroup SFXEnvironment" );
- }
- ConsoleDocClass( SFXEnvironment,
- "@brief Description of a reverb environment.\n\n"
-
- "A reverb environment specifies how the audio mixer should render advanced environmental audio "
- "effects. \n\n"
-
- "To use reverb environments in your level, set up one or more ambient audio spaces, assign "
- "reverb environments appropriately, and then attach the SFXAmbiences to your LevelInfo (taking effect "
- "globally) or Zone objects (taking effect locally).\n\n"
-
- "To define your own custom reverb environments, it is usually easiest to adapt one of the pre-existing "
- "reverb definitions:\n"
-
- "@tsexample_nopar\n"
- "singleton SFXEnvironment( AudioEnvCustomUnderwater : AudioEnvUnderwater )\n"
- "{\n"
- " // Override select properties from AudioEnvUnderwater here.\n"
- "};\n"
- "@endtsexample\n\n"
-
- "In the Datablock Editor, this can be done by selecting an existing environment to copy from when creating "
- "the SFXEnvironment datablock.\n\n"
-
- "For a precise description of reverb audio and the properties of this class, please consult the EAX "
- "documentation.\n\n"
-
- "All SFXEnvironment instances are automatically added to the global @c SFXEnvironmentSet.\n\n"
-
- "@see http://www.atc.creative.com/algorithms/eax20.pdf\n"
- "@see http://connect.creativelabs.com/developer/Gaming/Forms/AllItems.aspx\n"
- "@see SFXAmbience::environment\n\n"
- "@ref SFX_reverb\n"
- "@ingroup SFX\n"
- );
- //-----------------------------------------------------------------------------
- SFXEnvironment::SFXEnvironment()
- {
- }
- //-----------------------------------------------------------------------------
- void SFXEnvironment::initPersistFields()
- {
- addGroup( "Reverb" );
-
- addField("reverbDensity", TypeF32, Offset(mReverb.flDensity, SFXEnvironment),
- "Density of reverb environment.");
- addField("reverbDiffusion", TypeF32, Offset(mReverb.flDiffusion, SFXEnvironment),
- "Environment diffusion.");
- addField("reverbGain", TypeF32, Offset(mReverb.flGain, SFXEnvironment),
- "Reverb Gain Level.");
- addField("reverbGainHF", TypeF32, Offset(mReverb.flGainHF, SFXEnvironment),
- "Reverb Gain to high frequencies");
- addField("reverbGainLF", TypeF32, Offset(mReverb.flGainLF, SFXEnvironment),
- "Reverb Gain to high frequencies");
- addField("reverbDecayTime", TypeF32, Offset(mReverb.flDecayTime, SFXEnvironment),
- "Decay time for the reverb.");
- addField("reverbDecayHFRatio", TypeF32, Offset(mReverb.flDecayHFRatio, SFXEnvironment),
- "High frequency decay time ratio.");
- addField("reverbDecayLFRatio", TypeF32, Offset(mReverb.flDecayLFRatio, SFXEnvironment),
- "High frequency decay time ratio.");
- addField("reflectionsGain", TypeF32, Offset(mReverb.flReflectionsGain, SFXEnvironment),
- "Reflection Gain.");
- addField("reflectionDelay", TypeF32, Offset(mReverb.flReflectionsDelay, SFXEnvironment),
- "How long to delay reflections.");
- addField("reflectionsPan", TypeF32, Offset(mReverb.flReflectionsPan, SFXEnvironment), 3,
- "Reflection reverberation panning vector.");
- addField("lateReverbGain", TypeF32, Offset(mReverb.flLateReverbGain, SFXEnvironment),
- "Late reverb gain amount.");
- addField("lateReverbDelay", TypeF32, Offset(mReverb.flLateReverbDelay, SFXEnvironment),
- "Late reverb delay time.");
- addField("lateReverbPan", TypeF32, Offset(mReverb.flLateReverbPan, SFXEnvironment), 3,
- "Late reverberation panning vector.");
- addField("reverbEchoTime", TypeF32, Offset(mReverb.flEchoTime, SFXEnvironment),
- "Reverb echo time.");
- addField("reverbEchoDepth", TypeF32, Offset(mReverb.flEchoDepth, SFXEnvironment),
- "Reverb echo depth.");
- addField("reverbModTime", TypeF32, Offset(mReverb.flModulationTime, SFXEnvironment),
- "Reverb Modulation time.");
- addField("reverbModDepth", TypeF32, Offset(mReverb.flModulationDepth, SFXEnvironment),
- "Reverb Modulation time.");
- addField("airAbsorbtionGainHF", TypeF32, Offset(mReverb.flAirAbsorptionGainHF, SFXEnvironment),
- "High Frequency air absorbtion");
- addField("reverbHFRef", TypeF32, Offset(mReverb.flHFReference, SFXEnvironment),
- "Reverb High Frequency Reference.");
- addField("reverbLFRef", TypeF32, Offset(mReverb.flLFReference, SFXEnvironment),
- "Reverb Low Frequency Reference.");
- addField("roomRolloffFactor", TypeF32, Offset(mReverb.flRoomRolloffFactor, SFXEnvironment),
- "Rolloff factor for reverb.");
- addField("decayHFLimit", TypeS32, Offset(mReverb.iDecayHFLimit, SFXEnvironment),
- "High Frequency decay limit.");
- endGroup("Reverb");
- Parent::initPersistFields();
- }
- //-----------------------------------------------------------------------------
- bool SFXEnvironment::onAdd()
- {
- if( !Parent::onAdd() )
- return false;
-
- Sim::getSFXEnvironmentSet()->addObject( this );
-
- return true;
- }
- //-----------------------------------------------------------------------------
- bool SFXEnvironment::preload( bool server, String& errorStr )
- {
- if( !Parent::preload( server, errorStr ) )
- return false;
-
- validate();
-
- return true;
- }
- //-----------------------------------------------------------------------------
- void SFXEnvironment::inspectPostApply()
- {
- Parent::inspectPostApply();
- validate();
- }
- //-----------------------------------------------------------------------------
- void SFXEnvironment::validate()
- {
- mReverb.validate();
- }
- //-----------------------------------------------------------------------------
- void SFXEnvironment::packData( BitStream* stream )
- {
- Parent::packData( stream );
- stream->write(mReverb.flDensity);
- stream->write(mReverb.flDiffusion);
- stream->write(mReverb.flGain);
- stream->write(mReverb.flGainHF);
- stream->write(mReverb.flGainLF);
- stream->write(mReverb.flDecayTime);
- stream->write(mReverb.flDecayHFRatio);
- stream->write(mReverb.flDecayLFRatio);
- stream->write(mReverb.flReflectionsGain);
- stream->write(mReverb.flReflectionsDelay);
- stream->write(mReverb.flLateReverbGain);
- stream->write(mReverb.flLateReverbDelay);
- stream->write(mReverb.flEchoTime);
- stream->write(mReverb.flEchoDepth);
- stream->write(mReverb.flModulationTime);
- stream->write(mReverb.flModulationDepth);
- stream->write(mReverb.flAirAbsorptionGainHF);
- stream->write(mReverb.flHFReference);
- stream->write(mReverb.flLFReference);
- stream->write(mReverb.flRoomRolloffFactor);
- stream->write(mReverb.iDecayHFLimit);
- }
- //-----------------------------------------------------------------------------
- void SFXEnvironment::unpackData( BitStream* stream )
- {
- Parent::unpackData( stream );
-
- stream->read(&mReverb.flDensity);
- stream->read(&mReverb.flDiffusion);
- stream->read(&mReverb.flGain);
- stream->read(&mReverb.flGainHF);
- stream->read(&mReverb.flGainLF);
- stream->read(&mReverb.flDecayTime);
- stream->read(&mReverb.flDecayHFRatio);
- stream->read(&mReverb.flDecayLFRatio);
- stream->read(&mReverb.flReflectionsGain);
- stream->read(&mReverb.flReflectionsDelay);
- stream->read(&mReverb.flLateReverbGain);
- stream->read(&mReverb.flLateReverbDelay);
- stream->read(&mReverb.flEchoTime);
- stream->read(&mReverb.flEchoDepth);
- stream->read(&mReverb.flModulationTime);
- stream->read(&mReverb.flModulationDepth);
- stream->read(&mReverb.flAirAbsorptionGainHF);
- stream->read(&mReverb.flHFReference);
- stream->read(&mReverb.flLFReference);
- stream->read(&mReverb.flRoomRolloffFactor);
- stream->read(&mReverb.iDecayHFLimit);
- }
|