diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/hlfaceposer/choreoview.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'utils/hlfaceposer/choreoview.h')
| -rw-r--r-- | utils/hlfaceposer/choreoview.h | 832 |
1 files changed, 832 insertions, 0 deletions
diff --git a/utils/hlfaceposer/choreoview.h b/utils/hlfaceposer/choreoview.h new file mode 100644 index 0000000..bd741c1 --- /dev/null +++ b/utils/hlfaceposer/choreoview.h @@ -0,0 +1,832 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// +#ifndef CHOREOVIEW_H +#define CHOREOVIEW_H +#ifdef _WIN32 +#pragma once +#endif + + +#include <mxtk/mx.h> +#include <mxtk/mxWindow.h> +#include "mxBitmapButton.h" +#include "utlvector.h" +#include "ChoreoWidget.h" +#include "ichoreoeventcallback.h" +#include "faceposertoolwindow.h" +#include "ChoreoEvent.h" +#include "mathlib/mathlib.h" +#include "SoundEmitterSystem/isoundemittersystembase.h" + +#define IDC_CV_CC_LANGUAGESTART 5300 + +#define IDC_STOPSCENE 5000 +#define IDC_PLAYSCENE 5001 +#define IDC_PAUSESCENE 5002 +#define IDC_CHOREOVSCROLL 5003 +#define IDC_CHOREOHSCROLL 5004 + +#define IDC_ADDACTOR 5005 +#define IDC_DELETEACTOR 5006 +#define IDC_MOVEACTORUP 5007 +#define IDC_MOVEACTORDOWN 5008 +#define IDC_EDITACTOR 5009 + +#define IDC_EDITEVENT 5010 +#define IDC_DELETEEVENT 5011 + +#define IDC_ADDEVENT_EXPRESSION 5012 +#define IDC_ADDEVENT_GESTURE 5013 +#define IDC_ADDEVENT_LOOKAT 5014 +#define IDC_ADDEVENT_MOVETO 5015 +#define IDC_ADDEVENT_SPEAK 5016 +#define IDC_ADDEVENT_FACE 5017 +#define IDC_ADDEVENT_FIRETRIGGER 5018 +#define IDC_ADDEVENT_SEQUENCE 5019 +#define IDC_ADDEVENT_GENERIC 5020 + +#define IDC_CV_CHANGESCALE 5021 + +#define IDC_EDITGLOBALEVENT 5022 +#define IDC_DELETEGLOBALEVENT 5023 +#define IDC_ADDEVENT_PAUSE 5024 + +#define IDC_ADDCHANNEL 5025 +#define IDC_EDITCHANNEL 5026 +#define IDC_DELETECHANNEL 5027 +#define IDC_MOVECHANNELUP 5028 +#define IDC_MOVECHANNELDOWN 5029 + +#define IDC_CHANNELOPEN 5030 +#define IDC_CHANNELCLOSE 5031 +#define IDC_CBACTORACTIVE 5032 +#define IDC_DELETERELATIVETAG 5033 +#define IDC_ADDTIMINGTAG 5034 + +#define IDC_SELECTALL 5035 +#define IDC_DESELECTALL 5036 +#define IDC_MOVETOBACK 5037 + +#define IDC_UNDO 5038 +#define IDC_REDO 5039 + +#define IDC_EXPRESSIONTOOL 5040 +#define IDC_ASSOCIATEBSP 5041 + +#define IDC_ADDEVENT_FLEXANIMATION 5042 + +#define IDC_COPYEVENTS 5043 +#define IDC_PASTEEVENTS 5044 + +#define IDC_IMPORTEVENTS 5045 +#define IDC_EXPORTEVENTS 5046 + +#define IDC_ADDEVENT_SUBSCENE 5047 +#define IDC_PLAYSCENE_BACKWARD 5048 + +#define IDC_ASSOCIATEMODEL 5049 +#define IDC_CHOREO_PLAYBACKRATE 5050 + +#define IDC_CV_CHECKSEQLENGTHS 5051 +#define IDC_CV_PROCESSSEQUENCES 5052 + +#define IDC_GESTURETOOL 5053 + +#define IDC_ADDEVENT_LOOP 5054 +#define IDC_CV_TOGGLERAMPONLY 5055 + +#define IDC_ADDEVENT_INTERRUPT 5056 +#define IDC_ADDEVENT_STOPPOINT 5067 + +#define SCENE_ACTION_UNKNOWN 0 +#define SCENE_ACTION_CANCEL 1 +#define SCENE_ACTION_RESUME 2 + +#define SCENE_ANIMLAYER_SEQUENCE 0 +#define SCENE_ANIMLAYER_GESTURE 1 + +#define IDC_ADDEVENT_NULLGESTURE 5068 + +#define IDC_SELECTEVENTS_ALL_BEFORE 5069 +#define IDC_SELECTEVENTS_ALL_AFTER 5070 +#define IDC_SELECTEVENTS_ACTIVE_BEFORE 5071 +#define IDC_SELECTEVENTS_ACTIVE_AFTER 5072 +#define IDC_SELECTEVENTS_CHANNEL_BEFORE 5073 +#define IDC_SELECTEVENTS_CHANNEL_AFTER 5074 + +#define IDC_INSERT_TIME 5075 +#define IDC_DELETE_TIME 5076 + +#define IDC_EXPORT_VCD 5077 +#define IDC_IMPORT_VCD 5078 + +#define IDC_ADDEVENT_PERMITRESPONSES 5079 + +#define IDC_CV_CC_SHOW 5080 +#define IDC_CV_COMBINESPEAKEVENTS 5081 +#define IDC_CV_REMOVESPEAKEVENTFROMGROUP 5082 +#define IDC_CV_CHANGECLOSECAPTIONTOKEN 5083 +#define IDC_CV_TOGGLECLOSECAPTIONS 5084 + +#define IDC_CV_ALIGN_LEFT 5085 +#define IDC_CV_ALIGN_RIGHT 5086 +#define IDC_CV_SAMESIZE_SMALLEST 5087 +#define IDC_CV_SAMESIZE_LARGEST 5088 + +#define IDC_CV_ALLEVENTS_CHANNEL 5089 +#define IDC_CV_ALLEVENTS_ACTOR 5090 + +#define IDC_CV_ENABLEEVENTS 5091 +#define IDC_CV_DISABLEEVENTS 5092 + +///////////////////////////////////////////////////////////////////////////// +// CChoreoView window +class CChoreoScene; +class CChoreoEvent; +class CChoreoActor; +class CChoreoChannel; + +class CChoreoActorWidget; +class CChoreoChannelWidget; +class CChoreoEventWidget; +class CChoreoGlobalEventWidget; +class CChoreoWidgetDrawHelper; + +class PhonemeEditor; +class CExpression; +class CExpClass; +class StudioModel; + +//----------------------------------------------------------------------------- +// Purpose: The main view of the choreography data for a scene +//----------------------------------------------------------------------------- +class CChoreoView : public mxWindow, public IFacePoserToolWindow, public IChoreoEventCallback +{ +// Construction +public: + CChoreoView( mxWindow *parent, int x, int y, int w, int h, int id ); + virtual ~CChoreoView(); + + virtual void OnModelChanged(); + + virtual void OnDelete(); + virtual bool CanClose(); + + void InvalidateTrackLookup( void ); + + // Implements IChoreoEventCallback + virtual void StartEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ); + virtual void EndEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ); + virtual void ProcessEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ); + virtual bool CheckEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ); + + void SetChoreoFile( char const *filename ); + char const *GetChoreoFile( void ) const; + + // Scene load/unload + void LoadSceneFromFile( const char *filename ); + CChoreoScene *LoadScene( char const *filename ); + void UnloadScene( void ); + + // UI + void New( void ); + void Save( void ); + void SaveAs( void ); + void Load( void ); + void LoadNext( void ); + bool Close( void ); + + // Drag/drop from expression thumbnail + + bool CreateExpressionEvent( int mx, int my, CExpClass *cl, CExpression *exp ); + bool CreateAnimationEvent( int mx, int my, char const *animationname ); + + void SelectAll( void ); + void DeselectAll( void ); + + struct SelectionParams_t + { + enum + { + SP_CHANNEL = 0, + SP_ACTIVE, + SP_ALL + }; + + float time; + bool forward; + int type; + }; + + void SelectEvents( SelectionParams_t& params ); + + // Channel/actor right click menu + void NewChannel( void ); + void DeleteChannel( CChoreoChannel *channel ); + void MoveChannelUp( CChoreoChannel *channel ); + void MoveChannelDown( CChoreoChannel *channel ); + void EditChannel( CChoreoChannel *channel ); + void AddEvent( int type, int subtype = 0, char const *defaultparameters = NULL ); + + // Actor right click menu + void NewActor( void ); + void DeleteActor( CChoreoActor *actor ); + void MoveActorUp( CChoreoActor *actor ); + void MoveActorDown( CChoreoActor *actor ); + void EditActor( CChoreoActor *actor ); + + // Event menu + void EditEvent( CChoreoEvent *event ); + void DeleteSelectedEvents( void ); + void EnableSelectedEvents( bool state ); + void DeleteEventRelativeTag( CChoreoEvent *event, int tagnum ); + void AddEventRelativeTag( void ); + CChoreoEventWidget *FindWidgetForEvent( CChoreoEvent *event ); + CChoreoChannelWidget *FindChannelForEvent( CChoreoEvent *event ); + + void MoveEventToBack( CChoreoEvent *event ); + void OnExpressionTool( void ); + void OnGestureTool( void ); + + // Global event ( pause ) menu + void EditGlobalEvent( CChoreoEvent *event ); + void DeleteGlobalEvent( CChoreoEvent *event ); + void AddGlobalEvent( CChoreoEvent::EVENTTYPE type ); + + void AssociateBSP( void ); + void AssociateModel( void ); + void AssociateModelToActor( CChoreoActor *actor, int modelindex ); + + // UI Layout + void CreateSceneWidgets( void ); + void DeleteSceneWidgets( void ); + void LayoutScene( void ); + void InvalidateLayout( void ); + void ForceScrollBarsToRecompute( bool resetthumb ); + + // Layout data that children should obey + int GetLabelWidth( void ); + int GetStartRow( void ); + int GetRowHeight( void ); + int GetFontSize( void ); + int GetEndRow( void ); + + // Simulation + void PlayScene( bool forward ); + void PauseScene( void ); + + bool IsPlayingScene( void ); + void ResetTargetSettings( void ); + void UpdateCurrentSettings( void ); + + virtual void Think( float dt ); + virtual bool IsScrubbing( void ) const; + virtual bool IsProcessing( void ); + + + bool ShouldProcessSpeak( void ); + + void SceneThink( float time ); + void PauseThink( void ); + void FinishSimulation( void ); + void StopScene(); + + float GetStartTime( void ); + float GetEndTime( void ); + void SetStartTime( float time ); + + void ProcessExpression( CChoreoScene *scene, CChoreoEvent *event ); + void ProcessFlexAnimation( CChoreoScene *scene, CChoreoEvent *event ); + void ProcessLookat( CChoreoScene *scene, CChoreoEvent *event ); + bool GetTarget( CChoreoScene *scene, CChoreoEvent *event, Vector &vecTarget, QAngle &vecAngle ); + void ProcessFace( CChoreoScene *scene, CChoreoEvent *event ); + void ProcessGesture( CChoreoScene *scene, CChoreoEvent *event ); + void ProcessSequence( CChoreoScene *scene, CChoreoEvent *event ); + void ProcessMoveto( CChoreoScene *scene, CChoreoEvent *event ); + int GetMovetoSequence( CChoreoScene *scene, CChoreoEvent *event, StudioModel *model ); + void ProcessSubscene( CChoreoScene *scene, CChoreoEvent *event ); + void ProcessPause( CChoreoScene *scene, CChoreoEvent *event ); + void ProcessSpeak( CChoreoScene *scene, CChoreoEvent *event ); + void ProcessLoop( CChoreoScene *scene, CChoreoEvent *event ); + void ProcessInterrupt( CChoreoScene *scene, CChoreoEvent *event ); + void ProcessPermitResponses( CChoreoScene *scene, CChoreoEvent *event ); + + float GetPixelsPerSecond( void ); + + // mxWindow overrides + virtual void redraw(); + virtual bool PaintBackground( void ); + virtual int handleEvent( mxEvent *event ); + + // Draw helpers + void DrawSceneABTicks( CChoreoWidgetDrawHelper& drawHelper ); + void DrawTimeLine( CChoreoWidgetDrawHelper& drawHelper, RECT& rc, float left, float right ); + void DrawBackground( CChoreoWidgetDrawHelper& drawHelper, RECT& rc ); + void DrawRelativeTagLines( CChoreoWidgetDrawHelper& drawHelper, RECT& rc ); + + // Remap click position to/from time value + float GetTimeValueForMouse( int mx, bool clip = false ); + int GetPixelForTimeValue( float time, bool *clipped = NULL ); + float GetTimeDeltaForMouseDelta( int mx, int origmx ); + + // Readjust slider + void MoveTimeSliderToPos( int x ); + + // Dirty flag for file save prompting + + bool GetDirty( void ); + void SetDirty( bool dirty, bool clearundo = true ); + + void ShowContextMenu( int mx, int my ); + + // Caller must first translate mouse into screen coordinates + bool IsMouseOverTimeline( int mx, int my ); + + CChoreoActorWidget *GetActorUnderCursorPos( int mx, int my ); + CChoreoChannelWidget *GetChannelUnderCursorPos( int mx, int my ); + CChoreoEventWidget *GetEventUnderCursorPos( int mx, int my ); + CChoreoGlobalEventWidget *GetGlobalEventUnderCursorPos( int mx, int my ); + int GetTagUnderCursorPos( CChoreoEventWidget *event, int mx, int my ); + CEventAbsoluteTag *GetAbsoluteTagUnderCursorPos( CChoreoEventWidget *event, int mx, int my ); + + + void GetObjectsUnderMouse( int mx, int my, + CChoreoActorWidget **actor, + CChoreoChannelWidget **channel, + CChoreoEventWidget **event, + CChoreoGlobalEventWidget **globalevent, + int* clickedTag, + CEventAbsoluteTag **absolutetag, + int *clickedCCButton ); + + void OnDoubleClicked( void ); + + void ApplyBounds( int& mx, int& my ); + void CalcBounds( int movetype ); + + void MouseStartDrag( mxEvent *event, int mx, int my ); + void MouseContinueDrag( mxEvent *event, int mx, int my ); + void MouseFinishDrag( mxEvent *event, int mx, int my ); + void MouseMove( int mx, int my ); + + //void StartDraggingGlobalEvent( int mx, int my ); + void StartDraggingEvent( int mx, int my ); + //void FinishDraggingGlobalEvent( int mx, int my ); + void FinishDraggingEvent( mxEvent *event, int mx, int my ); + + // Draw focus rect while mouse dragging is going on + void DrawFocusRect( void ); + int ComputeEventDragType( int mx, int my ); + + void SetCurrentWaveFile( const char *filename, CChoreoEvent *event ); + + void RecomputeWaves(); + + typedef void (CChoreoView::*CVMEMBERFUNC)( CChoreoWidget *widget, CChoreoWidget *param1 ); + + void TraverseWidgets( CVMEMBERFUNC pfn, CChoreoWidget *param1 ); + + int CountSelectedEvents( void ); + int CountSelectedGlobalEvents( void ); + int GetSelectedEvents( CUtlVector< CChoreoEvent * >& events ); + int GetSelectedEventWidgets( CUtlVector< CChoreoEventWidget * >& events ); + int GetEarliestEventIndex( CUtlVector< CChoreoEventWidget * >& events ); + int GetLatestEventIndex( CUtlVector< CChoreoEventWidget * >& events ); + + // Traversal functions + void Deselect( CChoreoWidget *widget, CChoreoWidget *param1 ); + void Select( CChoreoWidget *widget, CChoreoWidget *param1 ); + void SelectInActor( CChoreoWidget *widget, CChoreoWidget *param1 ); + void SelectInChannel( CChoreoWidget *widget, CChoreoWidget *param1 ); + + void SelectAllEvents( CChoreoWidget *widget, CChoreoWidget *param1 ); + + void SelectAllEventsInActor( CChoreoActorWidget *actor ); + void SelectAllEventsInChannel( CChoreoChannelWidget *channel ); + + // Adjust scroll bars + void RepositionVSlider( void ); + void RepositionHSlider( void ); + + void UpdateStatusArea( int mx, int my ); + void ClearStatusArea( void ); + void RedrawStatusArea( CChoreoWidgetDrawHelper& drawHelper, RECT& rcStatus ); + + void GetUndoLevels( int& current, int& number ); + + // Undo/Redo + void Undo( void ); + void Redo( void ); + + bool CanUndo(); + bool CanRedo(); + + // Do push before changes + void PushUndo( const char *description ); + // Do this push after changes, must match pushundo 1for1 + void PushRedo( const char *description ); + + void WipeUndo( void ); + void WipeRedo( void ); + + const char *GetUndoDescription( void ); + const char *GetRedoDescription( void ); + + CChoreoScene *GetScene( void ); + + void ReportSceneClearToTools( void ); + + void CopyEvents( void ); + void PasteEvents( void ); + void ImportEvents( void ); + void ExportEvents( void ); + + void ExportVCD(); + void ImportVCD(); + + void ExportVCDFile( char const *filename ); + void ImportVCDFile( char const *filename ); + + bool CanPaste( void ); + + bool IsMouseOverScrubHandle( mxEvent *event ); + bool IsMouseOverScrubArea( mxEvent *event ); + + void GetScrubHandleRect( RECT& rcHandle, bool clipped = false ); + void GetScrubAreaRect( RECT& rcArea ); + void DrawScrubHandle( CChoreoWidgetDrawHelper& drawHelper ); + void DrawScrubHandle( void ); + void ScrubThink( float dt, bool scrubbing, IFacePoserToolWindow *invoker ); + + void ClampTimeToSelectionInterval( float& timeval ); + + void SetScrubTime( float t ); + void SetScrubTargetTime( float t ); + + void OnCheckSequenceLengths( void ); + + bool IsRampOnly( void ) const; + + void SetTimeZoom( const char *tool, int tz, bool preserveFocus ); + int GetTimeZoom( const char *tool ); + template< class T > + void SetPreservedTimeZoom( T *other, int tz ); + template< class T > + int HandleZoomKey( T *other, int keyCode ); + + void OnInsertTime(); + void OnDeleteTime(); + + bool GetShowCloseCaptionData( void ) const; + bool ValidateCombinedSoundCheckSum( CChoreoEvent *e ); + + void OnPlaceNextSpeakEvent(); + +private: + + void CheckInsertTime( CChoreoEvent *e, float dt, float starttime, float endtime ); + void CheckDeleteTime( CChoreoEvent *d, float dt, float starttime, float endtime, bool& deleteEvent ); + + bool FixupSequenceDurations( CChoreoScene *scene, bool checkonly ); + bool CheckSequenceLength( CChoreoEvent *e, bool checkonly ); + bool CheckGestureLength( CChoreoEvent *e, bool checkonly ); + bool DefaultGestureLength( CChoreoEvent *e, bool checkonly ); + bool AutoaddGestureKeys( CChoreoEvent *e, bool checkonly ); + + void InvalidateTrackLookup_R( CChoreoScene *scene ); + + void ShowButtons( bool show ); + + // Compute full size of data in pixels, for setting up scroll bars + int ComputeVPixelsNeeded( void ); + int ComputeHPixelsNeeded( void ); + void PositionControls(); + + void OnChangeScale(); + + float FindNextEventTime( CChoreoEvent::EVENTTYPE type, CChoreoChannel *channel, CChoreoEvent *e, bool forward ); + + bool ShouldSelectEvent( SelectionParams_t ¶ms, CChoreoEvent *event ); + + bool IsMouseOverSceneEndTime( int mx ); + + void StartDraggingSceneEndTime( int mx, int my ); + void FinishDraggingSceneEndTime( mxEvent *event, int mx, int my ); + + void SetShowCloseCaptionData( bool show ); + + void OnToggleCloseCaptionTags(); + void OnCombineSpeakEvents(); + void OnRemoveSpeakEventFromGroup(); + void OnChangeCloseCaptionToken( CChoreoEvent *e ); + + bool AreSelectedEventsCombinable(); + bool AreSelectedEventsInSpeakGroup(); + + void OnToggleCloseCaptionsForEvent(); + + bool GenerateCombinedFile( char const *outfilename, const char *cctoken, gender_t gender, CUtlRBTree< CChoreoEvent * >& sorted ); + bool ValidateCombinedFileCheckSum( char const *outfilename, char const *cctoken, gender_t gender, CUtlRBTree< CChoreoEvent * >& sorted ); + + void RememberSelectedEvents( CUtlVector< CChoreoEvent * >& list ); + void ReselectEvents( CUtlVector< CChoreoEvent * >& list ); + + void OnAlign( bool left ); + void OnMakeSameSize( bool smallest ); + + bool IsMouseOverEventEdge( CChoreoEventWidget *ew, bool bLeftEdge, int mx, int my ); + bool IsMouseOverEvent( CChoreoEventWidget *ew, int mx, int my ); + typedef struct + { + bool active; + float time; + } SCENEAB; + + void PlaceABPoint( int mx ); + void ClearABPoints( void ); + + SCENEAB m_rgABPoints[ 2 ]; + int m_nCurrentABPoint; + + bool m_bForward; + + // The underlying scene we are editing + CChoreoScene *m_pScene; + + enum + { + MAX_ACTORS = 32 + }; + + typedef struct + { + bool expanded; + } ACTORSTATE; + + ACTORSTATE m_ActorExpanded[ MAX_ACTORS ]; + // The scene's ui actors + CUtlVector < CChoreoActorWidget * > m_SceneActors; + // The scenes segment markers + CUtlVector < CChoreoGlobalEventWidget * > m_SceneGlobalEvents; + + // How many pixels per second we are showing in the UI + float m_flPixelsPerSecond; + + // Do we need to move controls? + bool m_bLayoutIsValid; + + // Starting row of first actor + int m_nStartRow; + // How wide the actor/channel name area is + int m_nLabelWidth; + // Height between channel/actor names + int m_nRowHeight; + // Font size for drawing event labels + int m_nFontSize; + + // Height/width of scroll bars + int m_nScrollbarHeight; + // Height off info area for flyover info / help + int m_nInfoHeight; + + // Simulation info + float m_flStartTime; + float m_flEndTime; + + float m_flFrameTime; + bool m_bSimulating; + bool m_bPaused; + float m_flLastSpeedScale; + bool m_bResetSpeedScale; + bool m_bAutomated; + int m_nAutomatedAction; + float m_flAutomationDelay; + float m_flAutomationTime; + + // Some rectangles for the UI + RECT m_rcTitles; + RECT m_rcTimeLine; + + // Play/pause buttons for simulation + mxBitmapButton *m_btnPlay; + mxBitmapButton *m_btnPause; + mxBitmapButton *m_btnStop; + + mxSlider *m_pPlaybackRate; + float m_flPlaybackRate; + + // The scroll bars + mxScrollbar *m_pVertScrollBar; + mxScrollbar *m_pHorzScrollBar; + int m_nLastHPixelsNeeded; + int m_nLastVPixelsNeeded; + + // Current sb values + int m_nTopOffset; + float m_flLeftOffset; + + // Need save? + bool m_bDirty; + // Currently loaded scene file + char m_szChoreoFile[ 256 ]; + + CChoreoActorWidget *m_pClickedActor; + CChoreoChannelWidget *m_pClickedChannel; + CChoreoEventWidget *m_pClickedEvent; + CChoreoGlobalEventWidget *m_pClickedGlobalEvent; + // Relative to the clicked event + int m_nClickedTag; + CEventAbsoluteTag *m_pClickedAbsoluteTag; + int m_nSelectedEvents; + int m_nClickedX, m_nClickedY; + int m_nClickedChannelCloseCaptionButton; + + // For mouse dragging + // How close to right or left edge the mouse has to be before the wider/shorten + // cursor shows up + enum + { + DRAG_EVENT_EDGE_TOLERANCE = 5, + }; + + // When dragging, what time of action is being performed + enum + { + DRAGTYPE_NONE = 0, + DRAGTYPE_EVENT_MOVE, + DRAGTYPE_EVENT_STARTTIME, + DRAGTYPE_EVENT_STARTTIME_RESCALE, + DRAGTYPE_EVENT_ENDTIME, + DRAGTYPE_EVENT_ENDTIME_RESCALE, + DRAGTYPE_EVENTTAG_MOVE, + DRAGTYPE_EVENTABSTAG_MOVE, + DRAGTYPE_SCRUBBER, + DRAGTYPE_SCENE_ENDTIME, + DRAGTYPE_RESCALELEFT, + DRAGTYPE_RESCALERIGHT, + }; + + float m_flScrub; + float m_flScrubTarget; + + bool m_bDragging; + int m_xStart; + int m_yStart; + + bool m_bUseBounds; + int m_nMinX; + int m_nMaxX; + + struct CFocusRect + { + RECT m_rcOrig; + RECT m_rcFocus; + }; + CUtlVector < CFocusRect > m_FocusRects; + + int m_nDragType; + HCURSOR m_hPrevCursor; + + struct FLYOVER + { + CChoreoActorWidget *a; + CChoreoChannelWidget *c; + CChoreoEventWidget *e; + CChoreoGlobalEventWidget *ge; + int tag; + CEventAbsoluteTag *at; + int ccbutton; + }; + + FLYOVER m_Flyover; + + bool m_bCanDraw; + + struct CVUndo + { + CChoreoScene *undo; + CChoreoScene *redo; + char *udescription; + char *rdescription; + }; + + CUtlVector< CVUndo * > m_UndoStack; + int m_nUndoLevel; + bool m_bRedoPending; + + bool m_bProcessSequences; + + float m_flLastMouseClickTime; + + bool m_bSuppressLayout; + + bool m_bRampOnly; + float m_flScrubberTimeOffset; + + bool m_bShowCloseCaptionData; + + bool m_bForceProcess; + + // cached version of the local directory when a scene is loaded + CUtlVector< CUtlString > m_nextFileList; +}; + +extern CChoreoView *g_pChoreoView; + +template< class T > +void CChoreoView::SetPreservedTimeZoom( T *other, int tz ) +{ + POINT pt; + ::GetCursorPos( &pt ); + ::ScreenToClient( (HWND)other->getHandle(), &pt ); + + // Now figure out time under cursor at old zoom scale + float t = other->GetTimeValueForMouse( pt.x, true ); + + // Call CChoreoView's version + SetTimeZoom( other->GetToolName(), tz, false ); + + // Now figure out tie under pt.x + float newT = other->GetTimeValueForMouse( pt.x, true ); + if ( newT != t ) + { + // We need to scroll over a bit + float pps = other->GetPixelsPerSecond(); + float movePixels = pps * ( newT - t ); + + float newOffset = other->m_flLeftOffset - movePixels; + if ( newOffset < 0.0f ) + { + newOffset = 0; + } + + float ed = other->GetEventEndTime(); + float flLastPixel = ed * pps; + if ( newOffset + other->w2() > flLastPixel ) + { + newOffset = flLastPixel - other->w2(); + } + + other->m_flLeftOffset = newOffset; + other->m_pHorzScrollBar->setValue( (int)( other->m_flLeftOffset ) ); + } + + other->RepositionHSlider(); +} + +template< class T > +int CChoreoView::HandleZoomKey( T *other, int keyCode ) +{ + int iret = 1; + switch ( keyCode ) + { + default: + { + iret = 0; + } + break; + + case VK_HOME: + { + other->MoveTimeSliderToPos( 0 ); + } + break; + case VK_END: + { + float maxtime = other->GetEventEndTime(); + int pixels = max( 0, (int)( maxtime * other->GetPixelsPerSecond() ) - other->w2() ); + other->MoveTimeSliderToPos( pixels ); + } + break; + case VK_PRIOR: // PgUp + { + int window = other->w2(); + other->m_flLeftOffset = max( other->m_flLeftOffset - (float)window, 0.0f ); + other->MoveTimeSliderToPos( (int)other->m_flLeftOffset ); + } + break; + case VK_NEXT: // PgDown + { + int window = other->w2(); + float maxtime = other->GetEventEndTime(); + int pixels = max( 0, (int)( maxtime * other->GetPixelsPerSecond() ) - other->w2() ); + other->m_flLeftOffset = min( other->m_flLeftOffset + (float)window, (float)pixels ); + other->MoveTimeSliderToPos( (int)other->m_flLeftOffset ); + } + break; + } + + return iret; +} + + +float SnapTime( float input, float granularity ); + +class StudioModel; +StudioModel *FindAssociatedModel( CChoreoScene *scene, CChoreoActor *a ); + +#endif // CHOREOVIEW_H |