mirror of
https://github.com/alliedmodders/hl2sdk.git
synced 2025-09-19 03:56:10 +08:00
First version of the SOurce SDK 2013
This commit is contained in:
270
public/vgui_controls/AnimationController.h
Normal file
270
public/vgui_controls/AnimationController.h
Normal file
@ -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
|
Reference in New Issue
Block a user