aboutsummaryrefslogtreecommitdiff
path: root/sp/src/public/vgui_controls/AnimationController.h
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /sp/src/public/vgui_controls/AnimationController.h
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'sp/src/public/vgui_controls/AnimationController.h')
-rw-r--r--sp/src/public/vgui_controls/AnimationController.h270
1 files changed, 270 insertions, 0 deletions
diff --git a/sp/src/public/vgui_controls/AnimationController.h b/sp/src/public/vgui_controls/AnimationController.h
new file mode 100644
index 00000000..101debf4
--- /dev/null
+++ b/sp/src/public/vgui_controls/AnimationController.h
@@ -0,0 +1,270 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#ifndef ANIMATIONCONTROLLER_H
+#define ANIMATIONCONTROLLER_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include <vgui_controls/Panel.h>
+#include <vgui_controls/PHandle.h>
+
+#include "tier1/utlsymbol.h"
+#include "tier1/utlvector.h"
+
+namespace vgui
+{
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles controlling panel animation
+// It is never visible, but needs to be a panel so that can receive messages
+//-----------------------------------------------------------------------------
+class AnimationController : public Panel
+{
+ DECLARE_CLASS_SIMPLE( AnimationController, Panel );
+
+public:
+ AnimationController(Panel *parent);
+ ~AnimationController();
+
+ // sets which script file to use
+ bool SetScriptFile( VPANEL sizingPanel, const char *fileName, bool wipeAll = false );
+
+ // reloads the currently set script file
+ void ReloadScriptFile();
+
+ // runs a frame of animation (time is passed in so slow motion, etc. works)
+ void UpdateAnimations( float curtime );
+
+ int GetNumActiveAnimations( void ) { return m_ActiveAnimations.Count(); }
+
+ // plays all animations to completion instantly
+ void RunAllAnimationsToCompletion();
+
+ // stops all animations
+ void CancelAllAnimations();
+
+ // starts an animation sequence script
+ bool StartAnimationSequence(const char *sequenceName);
+ bool StartAnimationSequence(Panel *pWithinParent, const char *sequenceName);
+
+ // gets the length of an animation sequence, in seconds
+ float GetAnimationSequenceLength(const char *sequenceName);
+
+ // sets that the script file should be reloaded each time a script is ran
+ // used for development
+ void SetAutoReloadScript(bool state);
+
+ enum Interpolators_e
+ {
+ INTERPOLATOR_LINEAR,
+ INTERPOLATOR_ACCEL,
+ INTERPOLATOR_DEACCEL,
+ INTERPOLATOR_PULSE,
+ INTERPOLATOR_FLICKER,
+ INTERPOLATOR_SIMPLESPLINE, // ease in / out
+ INTERPOLATOR_BOUNCE, // gravitational bounce
+ };
+
+ // runs the specific animation command (doesn't use script file at all)
+ void RunAnimationCommand(vgui::Panel *panel, const char *variable, float targetValue, float startDelaySeconds, float durationSeconds, Interpolators_e interpolator, float animParameter = 0 );
+ void RunAnimationCommand(vgui::Panel *panel, const char *variable, Color targetValue, float startDelaySeconds, float durationSeconds, Interpolators_e interpolator, float animParameter = 0 );
+
+private:
+ bool UpdateScreenSize();
+
+ bool LoadScriptFile(const char *fileName);
+ bool ParseScriptFile(char *pMem, int length);
+
+ void UpdatePostedMessages(bool bRunToCompletion);
+ void UpdateActiveAnimations(bool bRunToCompletion);
+
+ bool m_bAutoReloadScript;
+ float m_flCurrentTime;
+
+ enum AnimCommandType_e
+ {
+ CMD_ANIMATE,
+ CMD_RUNEVENT,
+ CMD_STOPEVENT,
+ CMD_STOPANIMATION,
+ CMD_STOPPANELANIMATIONS,
+ CMD_SETFONT,
+ CMD_SETTEXTURE,
+ CMD_SETSTRING,
+ };
+
+ enum RelativeAlignment
+ {
+ a_northwest = 0,
+ a_north,
+ a_northeast,
+ a_west,
+ a_center,
+ a_east,
+ a_southwest,
+ a_south,
+ a_southeast,
+ };
+
+ struct RelativeAlignmentLookup
+ {
+ RelativeAlignment align;
+ char const *name;
+ };
+
+ // a single animatable value
+ // some var types use 1, 2, 3 or all 4 of the values
+ struct Value_t
+ {
+ float a, b, c, d;
+ };
+
+ struct AnimAlign_t
+ {
+ // For Position, Xpos, YPos
+ bool relativePosition;
+ UtlSymId_t alignPanel;
+ RelativeAlignment alignment;
+ };
+
+ // info for the animate command
+ struct AnimCmdAnimate_t
+ {
+ UtlSymId_t panel;
+ UtlSymId_t variable;
+ Value_t target;
+ int interpolationFunction;
+ float interpolationParameter;
+ float startTime;
+ float duration;
+
+ AnimAlign_t align;
+
+ };
+
+ // info for the run event command
+ struct AnimCmdEvent_t
+ {
+ UtlSymId_t event;
+ UtlSymId_t variable;
+ UtlSymId_t variable2;
+ float timeDelay;
+ };
+
+ // holds a single command from an animation sequence
+ struct AnimCommand_t
+ {
+ AnimCommandType_e commandType;
+ union
+ {
+ AnimCmdAnimate_t animate;
+ AnimCmdEvent_t runEvent;
+ } cmdData;
+ };
+
+ // holds a full sequence
+ struct AnimSequence_t
+ {
+ UtlSymId_t name;
+ float duration;
+ CUtlVector<AnimCommand_t> cmdList;
+ };
+
+ // holds the list of sequences
+ CUtlVector<AnimSequence_t> m_Sequences;
+
+ // list of active animations
+ struct ActiveAnimation_t
+ {
+ PHandle panel;
+ UtlSymId_t seqName; // the sequence this belongs to
+ UtlSymId_t variable;
+ bool started;
+ Value_t startValue;
+ Value_t endValue;
+ int interpolator;
+ float interpolatorParam;
+ float startTime;
+ float endTime;
+
+ AnimAlign_t align;
+ };
+ CUtlVector<ActiveAnimation_t> m_ActiveAnimations;
+
+ // posted messages
+ struct PostedMessage_t
+ {
+ AnimCommandType_e commandType;
+ UtlSymId_t seqName;
+ UtlSymId_t event;
+ UtlSymId_t variable;
+ UtlSymId_t variable2;
+ float startTime;
+ PHandle parent;
+ };
+ CUtlVector<PostedMessage_t> m_PostedMessages;
+
+ struct RanEvent_t
+ {
+ UtlSymId_t event;
+ Panel *pParent;
+
+ bool operator==( const RanEvent_t &other ) const
+ {
+ return ( event == other.event && pParent == other.pParent );
+ }
+ };
+
+ // variable names
+ UtlSymId_t m_sPosition, m_sSize, m_sFgColor, m_sBgColor;
+ UtlSymId_t m_sXPos, m_sYPos, m_sWide, m_sTall;
+
+ // file name
+ CUtlVector<UtlSymId_t> m_ScriptFileNames;
+
+ // runs a single line of the script
+ void ExecAnimationCommand(UtlSymId_t seqName, AnimCommand_t &animCommand, Panel *pWithinParent);
+ // removes all commands belonging to a script
+ void RemoveQueuedAnimationCommands(UtlSymId_t seqName, vgui::Panel *panel = NULL);
+ // removes an existing instance of a command
+ void RemoveQueuedAnimationByType(vgui::Panel *panel, UtlSymId_t variable, UtlSymId_t sequenceToIgnore);
+
+ // handlers
+ void StartCmd_Animate(UtlSymId_t seqName, AnimCmdAnimate_t &cmd, Panel *pWithinParent);
+ void StartCmd_Animate(Panel *panel, UtlSymId_t seqName, AnimCmdAnimate_t &cmd);
+ void RunCmd_RunEvent(PostedMessage_t &msg);
+ void RunCmd_StopEvent(PostedMessage_t &msg);
+ void RunCmd_StopPanelAnimations(PostedMessage_t &msg);
+ void RunCmd_StopAnimation(PostedMessage_t &msg);
+ void RunCmd_SetFont(PostedMessage_t &msg);
+ void RunCmd_SetTexture(PostedMessage_t &msg);
+ void RunCmd_SetString(PostedMessage_t &msg);
+
+ // value access
+ Value_t GetValue(ActiveAnimation_t& anim, Panel *panel, UtlSymId_t var);
+ void SetValue(ActiveAnimation_t& anim, Panel *panel, UtlSymId_t var, Value_t &value);
+
+ // interpolation
+ Value_t GetInterpolatedValue(int interpolator, float interpolatorParam, float currentTime, float startTime, float endTime, Value_t &startValue, Value_t &endValue);
+
+ void SetupPosition( AnimCmdAnimate_t& cmd, float *output, char const *psz, int screendimension );
+ static RelativeAlignment LookupAlignment( char const *token );
+ static RelativeAlignmentLookup g_AlignmentLookup[];
+
+ int GetRelativeOffset( AnimAlign_t& cmd, bool xcoord );
+
+ VPANEL m_hSizePanel;
+ int m_nScreenBounds[ 4 ];
+};
+
+// singleton accessor for use only by other vgui_controls
+extern AnimationController *GetAnimationController();
+
+} // namespace vgui
+
+#endif // ANIMATIONCONTROLLER_H