summaryrefslogtreecommitdiff
path: root/utils/hlfaceposer/expressiontool.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/hlfaceposer/expressiontool.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'utils/hlfaceposer/expressiontool.h')
-rw-r--r--utils/hlfaceposer/expressiontool.h368
1 files changed, 368 insertions, 0 deletions
diff --git a/utils/hlfaceposer/expressiontool.h b/utils/hlfaceposer/expressiontool.h
new file mode 100644
index 0000000..49365b8
--- /dev/null
+++ b/utils/hlfaceposer/expressiontool.h
@@ -0,0 +1,368 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef EXPRESSIONTOOL_H
+#define EXPRESSIONTOOL_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include <mxtk/mx.h>
+#include "studio.h"
+#include "utlvector.h"
+#include "tier1/utldict.h"
+#include "faceposertoolwindow.h"
+
+class CChoreoEvent;
+class TimelineItem;
+class CFlexAnimationTrack;
+class CExpClass;
+class CChoreoWidgetDrawHelper;
+class CExpressionToolWorkspace;
+class CChoreoView;
+class CFlexTimingTag;
+class CExpression;
+class mxSlider;
+
+#define IDC_EXPRESSIONTOOLVSCROLL 1000
+#define IDC_ADDTRACKS 1001
+#define IDC_COLLAPSEALL 1002
+#define IDC_EXPANDALL 1003
+#define IDC_EXPANDVALID 1004
+#define IDC_INSERT_TIMING_TAG 1005
+#define IDC_DELETE_TIMING_TAG 1006
+#define IDC_LOCK_TIMING_TAG 1007
+#define IDC_UNLOCK_TIMING_TAG 1008
+
+#define IDC_COPY_TO_FLEX 1009
+#define IDC_COPY_FROM_FLEX 1010
+
+#define IDC_NEW_EXPRESSION_FROM_FLEXANIMATION 1011
+
+#define IDC_EXPORT_FA 1012
+#define IDC_IMPORT_FA 1013
+
+#define IDC_REDO_FA 1014
+#define IDC_UNDO_FA 1015
+
+#define IDC_TL_COPY 1016
+#define IDC_TL_PASTE 1017
+#define IDC_TL_DELETE 1018
+#define IDC_TL_DESELECT 1019
+#define IDC_TL_SELECTALL 1020
+
+#define IDC_TL_COLLAPSE 1021
+#define IDC_TL_EXPAND 1022
+#define IDC_TL_ENABLE 1023
+#define IDC_TL_DISABLE 1024
+
+#define IDC_TL_EDITNORMAL 1025
+#define IDC_TL_EDITLEFTRIGHT 1026
+
+#define IDC_COLLAPSE_ALL_EXCEPT 1027
+#define IDC_DISABLE_ALL_EXCEPT 1028
+#define IDC_ENABLE_ALL_VALID 1029
+
+#define IDC_TL_SNAPSELECTED 1030
+#define IDC_TL_SNAPPOINTS 1031
+#define IDC_TL_DELETECOLUMN 1032
+#define IDC_TL_SNAPALL 1033
+
+#define IDC_FLEX_CHANGESCALE 1034
+#define IDC_FLEXHSCROLL 1035
+
+#define IDC_ET_SORT_BY_USED 1036
+#define IDC_ET_SORT_BY_NAME 1037
+
+#define IDC_ET_SELECTION_DELETE 1038
+#define IDC_ET_SELECTION_EXCISE 1039
+
+#define IDC_ET_RESET_ITEM_SIZE 1040
+#define IDC_ET_RESET_ALL_ITEM_SIZES 1041
+
+#define IDC_FLEX_SCALESAMPLES 1042
+
+#define IDC_TL_KB_TENSION 1050
+#define IDC_TL_KB_BIAS 1051
+#define IDC_TL_KB_CONTINUITY 1052
+
+#define IDC_ET_EDGEPROPERTIES 1053
+#define IDC_ET_SELECTION_COPY 1054
+#define IDC_ET_SELECTION_PASTE 1055
+
+#include "ExpressionSample.h"
+
+class ExpressionTool : public mxWindow, public IFacePoserToolWindow
+{
+public:
+ // Construction
+ ExpressionTool( mxWindow *parent );
+ ~ExpressionTool( void );
+
+ virtual void Think( float dt );
+ void ScrubThink( float dt, bool scrubbing );
+ virtual bool IsScrubbing( void ) const;
+ virtual bool IsProcessing( void );
+
+
+ virtual int handleEvent( mxEvent *event );
+ virtual void redraw( void );
+ virtual bool PaintBackground();
+
+ bool SetFlexAnimationTrackFromExpression( int mx, int my, CExpClass *cl, CExpression *exp );
+
+ void SetEvent( CChoreoEvent *event );
+
+ bool HasCopyData( void );
+
+ void Copy( CFlexAnimationTrack *source );
+ void Paste( CFlexAnimationTrack *destination );
+
+ void GetScrubHandleRect( RECT& rcHandle, bool clipped = false );
+ void DrawScrubHandle( CChoreoWidgetDrawHelper& drawHelper, RECT& rcHandle );
+ void DrawEventEnd( CChoreoWidgetDrawHelper& drawHelper );
+
+ CChoreoEvent *GetSafeEvent( void );
+
+ void ExpandAll( void );
+ void ExpandValid( void );
+
+ void LayoutItems( bool force = false );
+
+ void OnCopyToFlex( bool isEdited );
+ void OnCopyFromFlex( bool isEdited );
+
+ void OnCopyToFlex( float scenetime, bool isEdited );
+ void OnCopyFromFlex( float scenetime, bool isEdited );
+ void OnSetSingleKeyFromFlex( char const *sliderName );
+
+ void OnNewExpression( void );
+ void ShowContextMenu( mxEvent *event, bool include_track_menus );
+
+ void ForceScrubPosition( float newtime );
+ void ForceScrubPositionFromSceneTime( float scenetime );
+
+ void SetScrubTime( float t );
+ void SetScrubTargetTime( float t );
+
+ void DrawScrubHandles();
+
+ void SetClickedPos( int x, int y );
+ float GetTimeForClickedPos( void );
+
+ void SetMouseOverPos( int x, int y );
+ void GetMouseOverPos( int &x, int& y );
+ void GetMouseOverPosRect( RECT& rcPos );
+ void DrawMouseOverPos( CChoreoWidgetDrawHelper& drawHelper, RECT& rcPos );
+ void DrawMouseOverPos();
+
+
+ void MoveSelectedSamples( float dfdx, float dfdy, bool snap );
+ void DeleteSelectedSamples( void );
+ int CountSelectedSamples( void );
+ void DeselectAll( void );
+
+ void RepositionHSlider( void );
+
+ bool IsFocusItem( TimelineItem *item );
+ virtual void OnModelChanged();
+
+ float GetScrub() const { return m_flScrub; }
+ float GetScrubberSceneTime();
+
+ void GetTimelineItems( CUtlVector< TimelineItem * >& list );
+ void InvalidateLayout( void );
+
+private:
+ void DoTrackLookup( CChoreoEvent *event );
+
+ void AddFlexTimingTag( int mx );
+ void DeleteFlexTimingTag( int mx, int my );
+
+ void OnSortByUsed( void );
+ void OnSortByName( void );
+
+ void OnDeleteSelection( bool excise_time );
+ void OnResetItemSize();
+ void OnResetAllItemSizes();
+ void ResampleControlPoints( CFlexTimingTag *tag, float newposition );
+
+ void OnScaleSamples();
+
+ void LockTimingTag( void );
+ void UnlockTimingTag( void );
+
+ bool GetTimingTagRect( RECT& rcClient, CChoreoEvent *event, CFlexTimingTag *tag, RECT& rcTag );
+
+// float MouseToFrac( int mx );
+//float MouseToTime( int mx );
+// int TimeToMouse( float t );
+
+ void GetWorkspaceLeftRight( int& left, int& right );
+
+ bool IsMouseOverScrubHandle( mxEvent *event );
+ CFlexTimingTag *IsMouseOverTag( int mx, int my );
+
+ void DrawRelativeTags( CChoreoWidgetDrawHelper& drawHelper );
+
+ void DrawFocusRect( void );
+
+ void ApplyBounds( int& mx, int& my );
+ void CalcBounds( int movetype );
+
+ void OnExportFlexAnimation( void );
+ void OnImportFlexAnimation( void );
+
+ void OnUndo( void );
+ void OnRedo( void );
+
+ void StartDragging( int dragtype, int startx, int starty, HCURSOR cursor );
+ void GetWorkspaceRect( RECT &rc );
+ void AddFocusRect( RECT& rc );
+ void OnMouseMove( mxEvent *event );
+
+ // Mouse control over selected samples
+ void SelectPoints( float starttime, float endtime );
+ void FinishSelect( int startx, int mx );
+ void FinishMoveSelection( int startx, int mx );
+ void FinishMoveSelectionStart( int startx, int mx );
+ void FinishMoveSelectionEnd( int startx, int mx );
+
+ // In general over the point area tray
+ bool IsMouseOverPoints( int mx, int my );
+ // Specifically over selected points
+ bool IsMouseOverSelection( int mx, int my );
+ bool IsMouseOverSelectionStartEdge( mxEvent *event );
+ bool IsMouseOverSelectionEndEdge( mxEvent *event );
+
+ // Readjust slider
+ void MoveTimeSliderToPos( int x );
+ void OnChangeScale();
+ int ComputeHPixelsNeeded( void );
+ float GetTimeValueForMouse( int mx, bool clip = false );
+
+ void OnEdgeProperties();
+
+public:
+ int GetPixelForTimeValue( float time, bool *clipped = NULL );
+ float GetPixelsPerSecond( void );
+ void GetStartAndEndTime( float& st, float& ed );
+ float GetEventEndTime();
+
+private:
+
+ class CColumnCopier
+ {
+ public:
+ class CTrackData
+ {
+ public:
+ CTrackData() {};
+ CTrackData( const CTrackData& other )
+ {
+ m_Samples[ 0 ].CopyArray( other.m_Samples[ 0 ].Base(), other.m_Samples[ 0 ].Count() );
+ m_Samples[ 1 ].CopyArray( other.m_Samples[ 1 ].Base(), other.m_Samples[ 1 ].Count() );
+ }
+ CUtlVector< CExpressionSample > m_Samples[ 2 ];
+ };
+
+ bool m_bActive;
+ float m_flCopyTimes[ 2 ];
+ CUtlDict< CTrackData, int > m_Data;
+
+ CColumnCopier() : m_bActive( false )
+ {
+ m_flCopyTimes[ 0 ] = m_flCopyTimes[ 1 ] = 0.0f;
+ }
+
+ void Reset()
+ {
+ m_bActive = false;
+ m_flCopyTimes[ 0 ] = m_flCopyTimes[ 1 ] = 0.0f;
+ m_Data.Purge();
+ }
+ };
+
+ bool HasCopiedColumn();
+ void OnCopyColumn();
+ void OnPasteColumn();
+ void ClearColumnCopy();
+
+ CColumnCopier m_ColumnCopy;
+
+ int m_nFocusEventGlobalID;
+
+ float m_flScrub;
+ float m_flScrubTarget;
+
+ enum
+ {
+ DRAGTYPE_NONE = 0,
+ DRAGTYPE_SCRUBBER,
+ DRAGTYPE_FLEXTIMINGTAG,
+
+ DRAGTYPE_SELECTSAMPLES,
+ DRAGTYPE_MOVESELECTION,
+ DRAGTYPE_MOVESELECTIONSTART,
+ DRAGTYPE_MOVESELECTIONEND,
+ };
+
+ HCURSOR m_hPrevCursor;
+ int m_nDragType;
+
+ int m_nStartX;
+ int m_nStartY;
+ int m_nLastX;
+ int m_nLastY;
+
+ int m_nClickedX;
+ int m_nClickedY;
+
+ bool m_bUseBounds;
+ int m_nMinX;
+ int m_nMaxX;
+
+ struct CFocusRect
+ {
+ RECT m_rcOrig;
+ RECT m_rcFocus;
+ };
+ CUtlVector < CFocusRect > m_FocusRects;
+
+ CUtlVector< CExpressionSample > m_CopyData[2];
+
+ CExpressionToolWorkspace *m_pWorkspace;
+
+ CChoreoEvent *m_pLastEvent;
+
+ int m_nMousePos[ 2 ];
+
+ float m_flSelection[ 2 ];
+ bool m_bSelectionActive;
+
+ bool m_bSuppressLayout;
+ // Height/width of scroll bars
+ int m_nScrollbarHeight;
+ float m_flLeftOffset;
+ mxScrollbar *m_pHorzScrollBar;
+ int m_nLastHPixelsNeeded;
+ // How many pixels per second we are showing in the UI
+ float m_flPixelsPerSecond;
+ // Do we need to move controls?
+ bool m_bLayoutIsValid;
+ float m_flLastDuration;
+ bool m_bInSetEvent;
+ float m_flScrubberTimeOffset;
+
+ friend class CChoreoView;
+
+
+};
+
+extern ExpressionTool *g_pExpressionTool;
+
+#endif // EXPRESSIONTOOL_H