123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #ifndef CRYINCLUDE_EDITOR_ANIMATIONCONTEXT_H
- #define CRYINCLUDE_EDITOR_ANIMATIONCONTEXT_H
- #pragma once
- #include "Undo/Undo.h"
- #include "TrackView/TrackViewSequenceManager.h"
- #include <Range.h>
- #include <IMovieSystem.h>
- class CTrackViewSequence;
- /** CAnimationContext listener interface
- */
- struct IAnimationContextListener
- {
- virtual void OnSequenceChanged([[maybe_unused]] CTrackViewSequence* pNewSequence) {}
- virtual void OnTimeChanged([[maybe_unused]] float newTime) {}
- };
- AZ_PUSH_DISABLE_DLL_EXPORT_BASECLASS_WARNING
- /** CAnimationContext stores information about current editable animation sequence.
- Stores information about whenever animation is being recorded know,
- current sequence, current time in sequence etc.
- */
- class SANDBOX_API CAnimationContext
- : public IEditorNotifyListener
- , public IUndoManagerListener
- , public ITrackViewSequenceManagerListener
- {
- AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING
- public:
- //////////////////////////////////////////////////////////////////////////
- // Constructors.
- //////////////////////////////////////////////////////////////////////////
- /** Constructor.
- */
- CAnimationContext();
- ~CAnimationContext();
- //////////////////////////////////////////////////////////////////////////
- // Accessors
- //////////////////////////////////////////////////////////////////////////
- void Init();
- // Listeners
- void AddListener(IAnimationContextListener* pListener);
- void RemoveListener(IAnimationContextListener* pListener);
- /** Return current animation time in active sequence.
- @return Current time.
- */
- float GetTime() const { return m_currTime; };
- float GetTimeScale() const { return m_fTimeScale; }
- void SetTimeScale(float fScale) { m_fTimeScale = fScale; }
- /** Set active editing sequence.
- @param sequence New active sequence.
- @param force Set to true to always run all of the new active sequence code including listeners even if the sequences is already selected.
- @param noNotify Set to true to skip over notifying listeners when a new sequences is selected.
- @param user Set to true if the new sequence is being selected by the user, false if set by internal system code.
- */
- void SetSequence(CTrackViewSequence* sequence, bool force, bool noNotify, bool user = false);
- /** Get currently edited sequence.
- */
- CTrackViewSequence* GetSequence() const { return m_pSequence; };
- /** Set time markers to play within.
- */
- void SetMarkers(Range Marker) { m_timeMarker = Marker; }
- /** Get time markers to play within.
- */
- Range GetMarkers() { return m_timeMarker; }
- /** Get time range of active animation sequence.
- */
- Range GetTimeRange() const { return m_timeRange; }
- /** Returns true if editor is recording animations now.
- */
- bool IsRecording() const { return m_recording && m_paused == 0; };
- /** Returns true if editor is playing animation now.
- */
- bool IsPlaying() const { return m_playing && m_paused == 0; };
- /** Returns true if currently playing or recording is paused.
- */
- bool IsPaused() const { return m_paused > 0; }
- /** Return if animation context is now in playing mode.
- In difference from IsPlaying function this function not affected by pause state.
- */
- bool IsPlayMode() const { return m_playing; };
- /** Return if animation context is now in recording mode.
- In difference from IsRecording function this function not affected by pause state.
- */
- bool IsRecordMode() const { return m_recording; };
- /** Returns true if currently looping as activated.
- */
- bool IsLoopMode() const { return m_bLooping; }
- /** Enable/Disable looping.
- */
- void SetLoopMode(bool bLooping) { m_bLooping = bLooping; }
- //////////////////////////////////////////////////////////////////////////
- // Operators
- //////////////////////////////////////////////////////////////////////////
- /** Set current animation time in active sequence.
- @param seq New active time.
- */
- void SetTime(float t);
- /** Set time in active sequence for reset animation.
- @param seq New active time.
- */
- void SetResetTime(float t) {m_resetTime = t; };
- /** Start animation recorduing.
- Automatically stop playing.
- @param recording True to start recording, false to stop.
- */
- void SetRecording(bool playing);
- /** Enables/Disables automatic recording, sets the time step for each recorded frame.
- */
- void SetAutoRecording(bool bEnable, float fTimeStep);
- //! Check if auto recording enabled.
- bool IsAutoRecording() const { return m_bAutoRecording; };
- /** Start/Stop animation playing.
- Automatically stop recording.
- @param playing True to start playing, false to stop.
- */
- void SetPlaying(bool playing);
- /** Pause animation playing/recording.
- */
- void Pause();
- /** Toggle playback
- */
- void TogglePlay();
- /** Resume animation playing/recording.
- */
- void Resume();
- /** Called every frame to update all animations if animation should be playing.
- */
- void Update();
- /** Force animation for current sequence.
- */
- void ForceAnimation();
- void OnPostRender();
- void UpdateTimeRange();
- /** Notify after a time change is complete and time control is released to 'playback' controls, for example after
- * a timeline drag
- */
- void TimeChanged(float newTime);
- /** Notify after a sequence has been activated, useful for Undo/Redo
- */
- void OnSequenceActivated(AZ::EntityId entityId);
- private:
- static void GoToFrameCmd(IConsoleCmdArgs* pArgs);
- void NotifyTimeChangedListenersUsingCurrTime() const;
- virtual void BeginUndoTransaction() override;
- virtual void EndUndoTransaction() override;
- virtual void OnSequenceRemoved(CTrackViewSequence* pSequence) override;
- virtual void OnEditorNotifyEvent(EEditorNotifyEvent event) override;
- void AnimateActiveSequence();
- void SetRecordingInternal(bool enableRecording);
- //! Current time within active animation sequence.
- float m_currTime;
- //! Used to stash the time we send out OnTimeChanged notifications
- mutable float m_lastTimeChangedNotificationTime;
- //! Force update in next frame
- bool m_bForceUpdateInNextFrame;
- //! Time within active animation sequence while reset animation.
- float m_resetTime;
- float m_fTimeScale;
- // Recording time step.
- float m_fRecordingTimeStep;
- float m_fRecordingCurrTime;
- bool m_bAutoRecording;
- AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING
- //! Time range of active animation sequence.
- Range m_timeRange;
- Range m_timeMarker;
- //! Currently active animation sequence.
- CTrackViewSequence* m_pSequence;
- //! Id of latest valid sequence that was selected. Useful for restoring the selected
- //! sequence after undo has destroyed and recreated it.
- AZ::EntityId m_mostRecentSequenceId;
- //! The current time of the most recent selected sequence. It's very useful to restore this after an undo.
- float m_mostRecentSequenceTime;
- //! Id of active sequence to restore (for switching back from game mode and saving)
- AZ::EntityId m_sequenceToRestore;
- //! Time of active sequence (for switching back from game mode and saving)
- float m_sequenceRestoreTime;
- bool m_bLooping;
- //! True if editor is recording animations now.
- bool m_recording;
- bool m_bSavedRecordingState;
- //! True if editor is playing animation now.
- bool m_playing;
- //! Stores how many times animation have been paused prior to calling resume.
- int m_paused;
- bool m_bSingleFrame;
- bool m_bPostRenderRegistered;
- bool m_bForcingAnimation;
- //! Listeners
- std::vector<IAnimationContextListener*> m_contextListeners;
- AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING
- };
- #endif // CRYINCLUDE_EDITOR_ANIMATIONCONTEXT_H
|