summaryrefslogtreecommitdiff
path: root/public/dme_controls/dmelogeditpanel.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/dme_controls/dmelogeditpanel.h')
-rw-r--r--public/dme_controls/dmelogeditpanel.h170
1 files changed, 170 insertions, 0 deletions
diff --git a/public/dme_controls/dmelogeditpanel.h b/public/dme_controls/dmelogeditpanel.h
new file mode 100644
index 0000000..3dcfeea
--- /dev/null
+++ b/public/dme_controls/dmelogeditpanel.h
@@ -0,0 +1,170 @@
+//========= 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 \ No newline at end of file