You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
232 lines
9.8 KiB
232 lines
9.8 KiB
//====== 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
|