//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //============================================================================= #ifndef DMELOGEDITPANEL_H #define DMELOGEDITPANEL_H #ifdef _WIN32 #pragma once #endif #include "vgui_controls/Frame.h" #include "matsys_controls/curveeditorpanel.h" #include "datamodel/dmehandle.h" #include "movieobjects/timeutils.h" //----------------------------------------------------------------------------- // Forward declarations //----------------------------------------------------------------------------- class CDmeLog; namespace vgui { class ComboBox; } //----------------------------------------------------------------------------- // // Curve editor for float DmeLogs // //----------------------------------------------------------------------------- class CDmeLogEditPanel : public CCurveEditorPanel { DECLARE_CLASS_SIMPLE( CDmeLogEditPanel, CCurveEditorPanel ); public: enum LogField_t { FIELD_X = 0x1, FIELD_Y = 0x2, FIELD_Z = 0x4, FIELD_W = 0x8, FIELD_R = 0x1, FIELD_G = 0x2, FIELD_B = 0x4, FIELD_A = 0x8, FIELD_ALL = 0xF, }; // constructor CDmeLogEditPanel( vgui::Panel *pParent, const char *pName ); ~CDmeLogEditPanel(); // Sets the log to edit void SetDmeLog( CDmeLog *pLog ); void SetMask( int nMask ); // Sets the time range on the view in ms void SetTimeRange( DmeTime_t startTime, DmeTime_t endTime ); // Sets the vertical range on the view void SetVerticalRange( float flMin, float flMax ); protected: // Control points + values... virtual int FindOrAddControlPoint( float flIn, float flTolerance, float flOut ); virtual int FindControlPoint( float flIn, float flTolerance ); virtual int ModifyControlPoint( int nPoint, float flIn, float flOut ); virtual void RemoveControlPoint( int nPoint ); virtual float GetValue( float flIn ); virtual int ControlPointCount(); virtual void GetControlPoint( int nPoint, float *pIn, float *pOut ); private: // Converts normalized values to int time DmeTime_t NormalizedToTime( float flIn ); DmeTime_t NormalizedToDuration( float flDuration ); float TimeToNormalized( DmeTime_t time ); float NormalizedToValue( float flValue ); float ValueToNormalized( float flNormalized ); template< class T > int FindOrAddKey( DmeTime_t time, DmeTime_t tolerance, int nComps, float flValue ); template< class T > int ModifyKey( int nPoint, DmeTime_t initialTime, DmeTime_t time, int nComps, float flValue ); CDmeHandle m_hLog; int m_LogFieldMask; int m_nFieldIndex; DmeTime_t m_minTime; DmeTime_t m_maxTime; float m_flMinVertical; float m_flMaxVertical; }; //----------------------------------------------------------------------------- // Finds or adds a key //----------------------------------------------------------------------------- template< class T > int CDmeLogEditPanel::FindOrAddKey( DmeTime_t time, DmeTime_t tolerance, int nComps, float flValue ) { T vec = CastElement< CDmeTypedLog >( m_hLog )->GetValue( time ); for ( int i = 0; i < nComps; ++i ) { if ( m_LogFieldMask & (1 << i) ) { vec[i] = flValue; } } return CastElement< CDmeTypedLog >( m_hLog )->FindOrAddKey( time, tolerance, vec ); } //----------------------------------------------------------------------------- // Modifies an existing key //----------------------------------------------------------------------------- template< class T > int CDmeLogEditPanel::ModifyKey( int nPoint, DmeTime_t initialTime, DmeTime_t time, int nComps, float flValue ) { T vec = CastElement< CDmeTypedLog >( m_hLog )->GetValue( initialTime ); for ( int i = 0; i < nComps; ++i ) { if ( m_LogFieldMask & (1 << i) ) { vec[i] = flValue; } } RemoveControlPoint( nPoint ); return CastElement< CDmeTypedLog >( m_hLog )->FindOrAddKey( time, DmeTime_t( 0 ), vec ); } //----------------------------------------------------------------------------- // Purpose: Main app window //----------------------------------------------------------------------------- class CDmeLogEditFrame : public vgui::Frame { DECLARE_CLASS_SIMPLE( CDmeLogEditFrame, vgui::Frame ); public: CDmeLogEditFrame( vgui::Panel *pParent, const char *pTitle ); ~CDmeLogEditFrame(); // Inherited from Frame virtual void OnCommand( const char *pCommand ); // Purpose: Activate the dialog // the message "LogEdited" will be sent if ok was hit // Pass in a message to add as a subkey to the DmeSelected message void DoModal( CDmeLog *pLog, DmeTime_t startTime, DmeTime_t endTime, KeyValues *pContextKeyValues = NULL ); private: MESSAGE_FUNC( OnTextChanged, "TextChanged" ); void CleanUpMessage(); CDmeLogEditPanel *m_pCurveEditor; vgui::Button *m_pOkButton; vgui::Button *m_pCancelButton; vgui::ComboBox *m_pFilter; KeyValues *m_pContextKeyValues; }; #endif // DMELOGEDITPANEL_H