Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

283 lines
7.4 KiB

//========= 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 bCanBeCancelled = true );
bool StartAnimationSequence(Panel *pWithinParent, const char *sequenceName, bool bCanBeCancelled = true );
bool StopAnimationSequence( Panel *pWithinParent, const char *sequenceName );
void CancelAnimationsForPanel( Panel *pWithinParent );
// 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
INTERPOLATOR_BIAS,
INTERPOLATOR_GAIN,
};
// 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,
CMD_RUNEVENTCHILD,
CMD_FIRECOMMAND,
CMD_PLAYSOUND,
CMD_SETVISIBLE,
CMD_SETINPUTENABLED,
};
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;
bool canBeCancelled;
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;
bool canBeCancelled;
};
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;
UtlSymId_t m_sModelPos;
// file name
CUtlVector<UtlSymId_t> m_ScriptFileNames;
// runs a single line of the script
void ExecAnimationCommand(UtlSymId_t seqName, AnimCommand_t &animCommand, Panel *pWithinParent, bool bCanBeCancelled);
// 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, bool bCanBeCancelled);
void StartCmd_Animate(Panel *panel, UtlSymId_t seqName, AnimCmdAnimate_t &cmd, bool bCanBeCancelled);
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