123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- //-----------------------------------------------------------------------------
- // 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.
- //-----------------------------------------------------------------------------
- #ifndef _SFXMODIFIER_H_
- #define _SFXMODIFIER_H_
- #ifndef _TSTREAM_H_
- #include "core/stream/tStream.h"
- #endif
- class SFXSource;
- /// An SFXModifier modifies the properties of an SFXSource while its playback
- /// is running.
- class SFXModifier : public IPolled
- {
- protected:
-
- /// The source that this effect works on.
- SFXSource* mSource;
-
- /// If true, the effect is removed from the effects stack
- bool mRemoveWhenDone;
-
- public:
-
- /// Create an effect that operates on "source".
- SFXModifier( SFXSource* source, bool removeWhenDone = false )
- : mSource( source ), mRemoveWhenDone(removeWhenDone) {}
-
- virtual ~SFXModifier() {}
- };
- /// An SFXModifier that is triggered once after passing a certain playback position.
- class SFXOneShotModifier : public SFXModifier
- {
- public:
-
- typedef SFXModifier Parent;
-
- protected:
-
- /// Playback position that triggers the effect.
- F32 mTriggerPos;
-
- ///
- virtual void _onTrigger() = 0;
-
- public:
-
- /// Create an effect that triggers when playback of "source" passes "triggerPos".
- SFXOneShotModifier( SFXSource* source, F32 triggerPos, bool removeWhenDone = false );
-
- // IPolled.
- virtual bool update();
- };
- /// An SFXModifier that is spans a certain range of playback time.
- class SFXRangeModifier : public SFXModifier
- {
- public:
- typedef SFXModifier Parent;
-
- protected:
-
- /// If true, the effect is currently being applied to the source.
- bool mIsActive;
-
- /// Playback position in milliseconds when this effect becomes active.
- F32 mStartTime;
-
- /// Playback position in milliseconds when this effect becomes inactive.
- F32 mEndTime;
-
- /// Called when the play cursor passes mStartTime.
- /// @note There may be latency between the cursor actually passing mStartTime
- /// and this method being called.
- virtual void _onStart() {}
-
- /// Called on each update() while the play cursor is in range.
- virtual void _onUpdate() {}
-
- /// Called when the play cursor passes mEndTime.
- /// @note There may be latency between the cursor actually passing mEndTime
- /// and this method being called.
- virtual void _onEnd() {}
-
- public:
-
- /// Create an effect that operates on "source" between "startTime" seconds
- /// (inclusive) and "endTime" seconds (exclusive).
- SFXRangeModifier( SFXSource* source, F32 startTime, F32 endTime, bool removeWhenDone = false );
-
- ///
- bool isActive() const { return mIsActive; }
-
- // IPolled.
- virtual bool update();
- };
- /// A volume fade effect (fade-in or fade-out).
- class SFXFadeModifier : public SFXRangeModifier
- {
- public:
-
- typedef SFXRangeModifier Parent;
-
- enum EOnEnd
- {
- ON_END_Nop, ///< Do nothing with source when fade is complete.
- ON_END_Stop, ///< Stop source when fade is complete.
- ON_END_Pause, ///< Pause source when fade is complete.
- };
-
- protected:
-
- /// Volume when beginning fade. Set when effect is activated.
- F32 mStartVolume;
-
- /// Volume when ending fade.
- F32 mEndVolume;
-
- /// Current volume level.
- F32 mCurrentVolume;
-
- /// Action to perform when the fade has been completed. Defaults to no action.
- EOnEnd mOnEnd;
-
- // SFXModifier.
- virtual void _onStart();
- virtual void _onUpdate();
- virtual void _onEnd();
-
- public:
-
- /// Create an effect that fades the volume of "source" to "endVolume" over the
- /// period of "time" seconds. The fade will start at "referenceTime" using the
- /// source's current volume at the time as the start.
- SFXFadeModifier( SFXSource* source, F32 time, F32 endVolume, F32 startTime, EOnEnd onEndDo = ON_END_Nop, bool removeWhenDone = false );
-
- virtual ~SFXFadeModifier();
- };
- /// A modifer that calls a method on the SFXSource when a particular playback position
- /// is passed.
- ///
- /// @note At the moment, doing a setPosition() on a source will not cause markers that have
- /// been jumped over in the operation to be ignored. Instead they will trigger on the
- /// next update.
- class SFXMarkerModifier : public SFXOneShotModifier
- {
- public:
-
- typedef SFXOneShotModifier Parent;
-
- protected:
-
- /// Symbolic marker name that is passed to the "onMarkerPassed" callback.
- String mMarkerName;
-
- // SFXOneShotModifier
- virtual void _onTrigger();
-
- public:
-
- SFXMarkerModifier( SFXSource* source, const String& name, F32 pos, bool removeWhenDone = false );
- };
- #endif // !_SFXMODIFIER_H_
|