|
|
//========= 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<CDmeLog> 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<T> >( m_hLog )->GetValue( time ); for ( int i = 0; i < nComps; ++i ) { if ( m_LogFieldMask & (1 << i) ) { vec[i] = flValue; } } return CastElement< CDmeTypedLog<T> >( 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<T> >( m_hLog )->GetValue( initialTime ); for ( int i = 0; i < nComps; ++i ) { if ( m_LogFieldMask & (1 << i) ) { vec[i] = flValue; } } RemoveControlPoint( nPoint ); return CastElement< CDmeTypedLog<T> >( 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
|