//====== Copyright © 1996-2009, Valve Corporation, All rights reserved. ======= // // Declaration of CGraphEditorView class // //============================================================================= #ifndef GRAPHEDITORVIEW_H #define GRAPHEDITORVIEW_H #ifdef _WIN32 #pragma once #endif #include "sfmobjects/grapheditor.h" #include "loggraph.h" // Forward declarations class CDmeGraphEditorState; // Function declarations for head time manipulation callbacks. typedef void (*FnSetHeadTime )( DmeTime_t newTime, void *pData ); typedef void (*FnMoveHead )( int nPixels, void *pData ); typedef void (*FnScaleAboutHead )( float flScaleFactor, void *pData ); typedef void (*FnSetTimeSelection)( DmeTime_t times[ TS_TIME_COUNT ], void *pData ); // Enumeration for the major types of operations // which can be performed within the graph editor view. enum GraphOperationType_t { GRAPH_OPERATION_NONE, GRAPH_OPERATION_SELECT, GRAPH_OPERATION_ZOOM, GRAPH_OPERATION_PAN, GRAPH_OPERATION_DRAG_KEYS, GRAPH_OPERATION_SCALE_KEYS, }; //----------------------------------------------------------------------------- // The CGraphEditorView provides a management and manipulation of the the graph // editor and the graph display of the the curves and logs being edited. //----------------------------------------------------------------------------- class CGraphEditorView { public: enum AxisMode_t { AXIS_MODE_XY, AXIS_MODE_SELECT, AXIS_MODE_X, AXIS_MODE_Y }; struct Point_t { Point_t() { x = 0; y = 0; } Point_t( int xVal, int yVal ) { x = xVal; y = yVal; } int x; int y; }; public: // Constructor, sets the graph editor which is being viewed CGraphEditorView( CGraphEditor &graphEditor ); // Set the head position and time manipulation callback functions void SetCallbacks( FnSetHeadTime pfnSetHeadTime, FnMoveHead pfnSetMoveTime, FnScaleAboutHead pfnScaleAboutHead, FnSetTimeSelection pfnSetTimeSelection, void *pData ); // Set the area in which the curve graph may be drawn void SetGraphDisplayBounds( int x, int y, int width, int height ); // Set the time range currently being displayed by the graph void SetGraphTimeRange( DmeTime_t minTime, DmeTime_t maxTime ); // Set the active time range, this time range where the graph operations are effective, such as the time range of the current shot void SetActiveTimeRange( DmeTime_t startTime, DmeTime_t endTime ); // Set the screen position void SetScreenPosition( int x, int y ); // Draw the background of the graph void DrawBackground( DmeFramerate_t frame, bool bDisplayFrames, bool bFrameSnap, const DmeClipStack_t &shotToRoot ); // Draw the graph elements void Draw(); // Draw the selection preview of the keys void DrawSelection() const; // Start an operation of the specified type if an operation is not currently underway bool StartOperation( GraphOperationType_t operationType ); // Complete the current active operation void FinishOperation(); // Update the currently active operation bool UpdateOperation( int nCursorPosX, int nCursorPosY, bool bCtrlDown, bool bAltDown, bool bShiftDown, bool bFrameSnap, DmeTime_t currentTime, SelectionMode_t selectionMode, bool bFinal ); // Apply the specified vertical scale to the the graph using the provided center location void ApplyVerticalScale( int delta, int nCursorPosY ); // Set the vertical range of the graph void SetVerticalRange( float minValue, float maxValue ); // Compute the bounding time and values of the current selection bool ComputeSelectionBounds( DmeTime_t &minTime, DmeTime_t &maxTime, float &minValue, float &maxValue ) const; // Determine if the cursor is currently within the graph display area bool IsPointInGraphArea( int x, int y ) const; // Find the curves at the specified location void FindCurvesAtPosition( int nPosX, int nPosY, CUtlVector< CDmeGraphEditorCurve * > &curveList, CUtlVector< LogComponents_t > &componentFlags ) const; // Accessors GraphOperationType_t GetCurrentOperation() const { return m_CurrentOperation; } AxisMode_t GetAxisMode() const { return m_AxisMode; } const Rect_t &GetArea() const { return m_GraphArea; } CLogGraph &GetLogGraph() { return m_LogGraph; } private: // Update the axis mode based on the mouse movement bool UpdateAxisMode( bool bAxisLock ); // Update the panning operation void UpdatePanning( bool bMoveHead, bool bAxisLock ); // Update the zoom operation void UpdateZoom( bool bAxisLock ); // Update the current key manipulation operation bool UpdateKeyManipulation( bool bAxisLock, bool bSnapToFrames, bool bUnifiedTangents, GraphOperationType_t operationType, bool bFinal ); // Update the selection operation void UpdateSelection( SelectionMode_t selectionMode ); // Compute the selection rectangle base on the current cursor position and the pressed cursor position void ComputeSelectionRectangle( const Point_t &startPoint, const Point_t &endPoint, Rect_t &rect ) const; // Select the keys in the specified rectangle void SelectKeysInRectangle( const Rect_t &rect, SelectionMode_t selectionMode ); // Get a list of the keys in the rectangle specified local to the panel void FindKeysInRectangle( CDmeGraphEditorCurve *pCurve, const Rect_t &rect, CUtlVector< CDmeCurveKey * > &keyList ) const; // Get a list of the tangents belonging to the provided keys that are in the specified rectangle void FindKeyTangentsInRectangle( const Rect_t &rect, CUtlVector< CDmeCurveKey * > &keyList, CUtlVector< bool > &inTangents, CUtlVector< bool > &outTangents ) const; // Get a list of the curves in the specified rectangle void FindCurvesInRectangle( const Rect_t &rect, CUtlVector< CDmeGraphEditorCurve * > &curveList, CUtlVector< LogComponents_t > &componentFlags ) const; // Determine which components of the specified curve intersect the specified rectangle void FindCurveComponentsInRectangle( const Rect_t &rect, CDmeGraphEditorCurve *pCurve, LogComponents_t &nComponentFlags ) const; // Determine if the specified log intersects the specified rectangle. template < typename T > void IsLogInRectangle( const Rect_t &rect, const CDmeTypedLog< T > *pLog, const DmeClipStack_t &curveClipStack, LogComponents_t &nComponentFlags ) const; CGraphEditor &m_GraphEditor; // Graph editor instance used to manipulate the logs using curves CLogGraph m_LogGraph; // Pointer to the log graph to be used to draw the logs GraphOperationType_t m_CurrentOperation; // Current state of the panel, specifies what operations are currently happening AxisMode_t m_AxisMode; // Current axis mode selected for panning bool m_bUnifiedTangents; // Current unified tangent mode for tangent manipulations SelectionMode_t m_SelectionMode; // Current selection mode ( add, remove, toggle ) Rect_t m_SelectionRect; // Current area selection rectangle Rect_t m_GraphArea; // Graph area within the panel float m_flVerticalScale; // Vertical scale (range) of the graph DmeTime_t m_ActiveStartTime; // Start time of the active time range of the graph DmeTime_t m_ActiveEndTime; // End time of the active time range of the graph DmeTime_t m_StartDocTime; // Document time at the start of the current operation DmeTime_t m_CurrentDocTime; // Current document time Point_t m_CursorPos; // Position of the cursor when the last Think() occurred Point_t m_CursorDelta; // Number of pixels the cursor moved during the last frame Point_t m_StartCursorPos; // Cursor position at the start of the current operation FnSetHeadTime m_pfnSetHeadTime; // Callback function for setting the head time FnMoveHead m_pfnMoveHead; // Callback function for moving the head FnScaleAboutHead m_pfnScaleAboutHead; // Callback function for scaling time about the head position FnSetTimeSelection m_pfnSetTimeSelection; // Callback function for setting the current time selection void *m_pCallbackData; // Pointer to be provided to the callback time }; #endif // GRAPHEDITORPANEL_H