csgo-2018-source/public/sfmobjects/grapheditor.h
2021-07-24 21:11:47 -07:00

233 lines
9.6 KiB
C++

//====== Copyright © 1996-2009, Valve Corporation, All rights reserved. =======
//
// Declaration of the CGraphEditor class, which is used to perform direct
// manipulation of log data as if it were a curve.
//
//=============================================================================
#ifndef GRAPHEDITOR_H
#define GRAPHEDITOR_H
#ifdef _WIN32
#pragma once
#endif
#include "datamodel/dmelement.h"
#include "sfmobjects/dmegrapheditorstate.h"
class CDmeGraphEditorState;
//-----------------------------------------------------------------------------
// The CGraphEditor class performs direct manipulations of log data by fitting
// a cubic bezier curve to a segment of sample data and then manipulating the
// controls points of the curve.
//-----------------------------------------------------------------------------
class CGraphEditor
{
public:
enum PasteMode_t
{
PASTE_MERGE, // Keys are merged with other keys within the paste time range
PASTE_INSERT, // Keys after the paste location are offset in time by the paste time range
PASTE_OVERWRITE // Keys within the paste time range are removed
};
enum Operation_t
{
OPERATION_NONE,
OPERATION_MOVE_KEYS,
OPERATION_SCALE_KEYS,
OPERATION_SET_KEYS,
OPERATION_BLEND_KEYS,
OPERATION_COUNT,
};
// Constructor
CGraphEditor();
// Destructor
~CGraphEditor();
// Set the pointer to the current state element
void SetStateElement( CDmeGraphEditorState *pStateElement );
// Set the frame rate to be used by the graph editor when performing sampling operations
void SetFramerate( DmeFramerate_t framerate );
// Set the current clip stack, defining the local time frame in which the graph is operating
void SetClipstack( const DmeClipStack_t &clipStack );
// Get the pointer to the state element in use by the graph editor
CDmeGraphEditorState *GetStateElement();
// Start a new operation
void StartOperation();
// Finish the current operation and finalize the curve modifications
void FinishOperation();
// Cancel the current operation
void AbortOperation();
// Move the currently selected keys by the specified amount and time
void MoveSelectedKeys( DmeTime_t timeDelta, float valueDelta, float flValueScale, float timeScale, DmeTime_t cursorTime, bool bSnapToFrames, bool bUnifiedTangents, bool bEditLayerUndoable );
// Scale the currently selected keys by the specified amount using the provided origin
void ScaleSelectedKeys( float flTimeScaleFctor, float flValueScaleFactor, DmeTime_t originTime, float flOriginValue, bool bEditLayerUndoable );
// Delete the currently selected keys
bool DeleteSelectedKeys();
// Modify the tangents of the currently selected keys using the specified operation
bool ModifyTangents( TangentOperation_t operation, float flUnitsPerSecond, bool bUpdateLog );
// Remove all of the active curves from the graph editor
void RemoveAllCurves();
// Remove all of the curves from the list of active curves ( the ones visible in the graph editor )
void DeactivateAllCurves();
// Update the curves associated with the specified channels from their base log data
void UpdateActiveCurvesFromChannels( const CUtlVector< CDmeChannel * > &channelList );
// Set the active channels which are to be edited
void SetActiveChannels( CUtlVector< CDmeChannel * > &channelList, CUtlVector< LogComponents_t > &componentFlags, bool bFrameSnap );
// Set a key value for all active components of the curves associated with the specified channels
void SetKeysForChannels( const CUtlVector< CDmeChannel * > &channelList, DmeTime_t globalTime, bool bFinal );
// Set a key value for the specified components of the curve associated with the provided channel
void SetKeysForChannels( const CUtlVector< CDmAttribute * > &keyValueAttributes, const CUtlVector< CDmeChannel * > &channelList, const CUtlVector< LogComponents_t > &nComponentFlags, DmeTime_t globalTime, bool bFinal );
// Get the value of all of the components of the curve associated with the specified channel at the given time
int GetValuesForChannel( CDmeChannel *pChannel, DmeTime_t time, float *pValues, int nMaxValues ) const;
// Set the value of all of the components of the curve associated with the specified channel at the given time
bool SetValuesForChannel( CDmeChannel *pChannel, DmeTime_t time, const float *pValues, int nNumValues ) const;
// Blend the selected keys on each of the specified channels to the provided value for each channel
void BlendSelectedKeysForChannels( const CUtlVector< CDmeChannel * > &channelList, const CUtlVector< Vector4D > &valueList, float flBlendFactor, bool bFinal );
// Blend the selected keys on the curves associated with each of the specified channels to the value on the curve at the specified time.
void BlendSelectedKeysForChannels( const CUtlVector< CDmeChannel * > &channelList, DmeTime_t globalTargetTime, float flBlendFactor, bool bFinal );
// Select the specified set of keys according to the provided selection mode
void SelectKeys( CUtlVector< CDmeCurveKey * > &keyList, SelectionMode_t selectionMode );
// Select the specified keys and their tangents according to the specified selection mode
void SelectKeyTangents( CUtlVector< CDmeCurveKey * > &keyList, CUtlVector< bool > &inTangents, CUtlVector< bool > &outTangents, SelectionMode_t selectionMode );
// Select the specified component of the specified curve and all the keys on the component
void SelectCurveComponents( const CUtlVector< CDmeGraphEditorCurve * > &curveList, const CUtlVector < LogComponents_t > &nComponentFlagsList, SelectionMode_t selectionMode );
// Compute the tangent values of any selected keys that currently have invalid tangent values
void ComputeSelectedKeyTangents();
// Copy the currently selected keys to the clipboard
void CopySelectedKeys();
// Cut the currently selected keys and store them in the clipboard
void CutSelectedKeys();
// Paste the keys from the clipboard at the specified time
void PasteKeysFromClipboard( DmeTime_t pasteTime, PasteMode_t pasteMode, bool bConnect );
// Add a bookmark to the current curve set
void AddBookmark( CDmeBookmark *pBookmark );
// Remove a bookmark from the current curve set
void RemoveBookmark( CDmeBookmark *pBookmark );
// Update the time of the associated bookmark proxy if it no longer matches the bookmark.
void UpdateBookmarkTime( const CDmeBookmark *pBookmark, DmeTime_t oldTime );
// Get the composite set of bookmarks for all active curves
CDmaElementArray< CDmeBookmark > *GetBookmarkSet();
// Perform the required update when the time of a bookmark changes
void OnBookmarkTimeChange( DmeTime_t oldTime, DmeTime_t newTime );
// Get the number of selected keys
int GetNumSelectedKeys() const;
// Get the selected keys in arrays grouped by the curve to which the key belongs
int GetSelectedKeysByCurve( CUtlVector< CUtlVector< CDmeCurveKey * > > &curveKeyList, bool bIncludeNeighbors = false ) const;
// Get all of the keys on the active curves
int GetAllKeysByCurve( CUtlVector< CUtlVector< CDmeCurveKey * > > &curveKeyList ) const;
// Get all of the active curves
void GetActiveCurves( CUtlVector< CDmeGraphEditorCurve * > &curveList ) const;
// Get the current number of active curves
int GetNumActiveCurves() const;
// Compute the time selection for the currently selected keys
bool ComputeTimeSelction( DmeTime_t times[ TS_TIME_COUNT ] );
// Enable or disable offset mode
void EnableOffsetMode( bool bEnable );
// Determine if offset mode is enabled
bool IsOffsetModeEnabled() const;
// Enable or disable adding keys in stepped mode
void SetAddKeysStepped( bool bAddKeysStepped );
// Determine if add keys in stepped mode is enabled
bool IsAddingKeysStepped() const;
// Determine if the graph editor is currently performing a drag operation
bool IsDragging() const;
private:
struct OperationEntry_t
{
int mode; // Operation mode identifier
char name[ 32 ]; // Name of the operation (used for undo)
};
// Set the specified operation mode and perform initialization for that mode
void SetOperationMode( Operation_t mode );
// Finalize all of the modifications that have been made to the curves
void FinalizeChanges() const;
// Build the bookmark list from the current curve set
void BuildBookmarksFromCurves();
// Paste the keys from the provided curve data to the corresponding components of the destination curve
void PasteKeysToCurve( KeyValues *pCurveData, CDmeGraphEditorCurve *pDstCurve, DmeTime_t timeOffset, DmeTime_t timeSpan, PasteMode_t pasteMode, bool bConnect );
// Paste the keys from the provided component data to the corresponding destination curve component
void PasteKeysToComponent( KeyValues *pComponentData, CDmeGraphEditorCurve *pDstCurve, int nComponentIndex, DmeTime_t timeOffset, DmeTime_t timeSpan, PasteMode_t pasteMode, bool bConnect );
CDmeGraphEditorState *m_pState; // Pointer to the state element to be modified by the graph editor
DmeFramerate_t m_framerate; // Frame rate of the current document
DmeClipStack_t m_clipstack; // Clip stack from global time to the local time of the graph
bool m_bBuildingBookmarks; // Flag indicating if the building process is in progress
bool m_bStartOperation; // Flag specifying if the next call to set operation mode will start a new operation
bool m_bOffsetMode; // Flag indicating if the graph editor is operating in offset mode
bool m_bAddKeysStepped; // Flag indicating if new keys added should be created in stepped mode
Operation_t m_OperationMode; // The currently active operation mode
static const OperationEntry_t sm_OperationTable[];
static const OperationEntry_t sm_TangentOperationTable[];
};
#endif // GRAPHEDITOR_H