summaryrefslogtreecommitdiff
path: root/public/movieobjects/dmetimeframe.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/movieobjects/dmetimeframe.h')
-rw-r--r--public/movieobjects/dmetimeframe.h153
1 files changed, 153 insertions, 0 deletions
diff --git a/public/movieobjects/dmetimeframe.h b/public/movieobjects/dmetimeframe.h
new file mode 100644
index 0000000..b385c0e
--- /dev/null
+++ b/public/movieobjects/dmetimeframe.h
@@ -0,0 +1,153 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================
+
+#ifndef DMETIMEFRAME_H
+#define DMETIMEFRAME_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "datamodel/dmelement.h"
+#include "movieobjects/timeutils.h"
+
+
+//-----------------------------------------------------------------------------
+// Time classes used to help disambiguate between local + parent time
+//-----------------------------------------------------------------------------
+typedef int LocalTime_t;
+typedef int ParentTime_t;
+
+class CDmeTimeFrame : public CDmElement
+{
+ DEFINE_ELEMENT( CDmeTimeFrame, CDmElement );
+
+public:
+ // Methods of IDmElement
+ virtual void OnAttributeChanged( CDmAttribute *pAttribute );
+
+ DmeTime_t ToChildMediaTime( DmeTime_t t, bool bClamp = true ) const;
+ DmeTime_t FromChildMediaTime( DmeTime_t t, bool bClamp = true ) const;
+ DmeTime_t ToChildMediaDuration( DmeTime_t dt ) const;
+ DmeTime_t FromChildMediaDuration( DmeTime_t dt ) const;
+
+ DmeTime_t GetStartTime() const;
+ DmeTime_t GetDuration() const;
+ DmeTime_t GetTimeOffset() const;
+ float GetTimeScale() const;
+
+ DmeTime_t GetStartInChildMediaTime() const;
+ DmeTime_t GetEndInChildMediaTime() const;
+
+ void SetStartTime( DmeTime_t startTime );
+ void SetDuration( DmeTime_t duration );
+ void SetTimeOffset( DmeTime_t offset );
+ void SetTimeScale( float flScale );
+
+ void SetEndTime( DmeTime_t endTime, bool bChangeDuration );
+ void SetTimeScale( float flScale, DmeTime_t scaleCenter, bool bChangeDuration );
+
+private:
+ CDmaVar< int > m_Start;
+ CDmaVar< int > m_Duration;
+ CDmaVar< int > m_Offset;
+ CDmaVar< float > m_Scale;
+};
+
+
+//-----------------------------------------------------------------------------
+// inline methods
+//-----------------------------------------------------------------------------
+inline DmeTime_t CDmeTimeFrame::GetStartTime() const
+{
+ return DmeTime_t( m_Start );
+}
+
+inline DmeTime_t CDmeTimeFrame::GetDuration() const
+{
+ return DmeTime_t( m_Duration );
+}
+
+inline DmeTime_t CDmeTimeFrame::GetTimeOffset() const
+{
+ return DmeTime_t( m_Offset );
+}
+
+inline float CDmeTimeFrame::GetTimeScale() const
+{
+ return m_Scale;
+}
+
+inline void CDmeTimeFrame::SetStartTime( DmeTime_t flStartTime )
+{
+ m_Start = flStartTime.GetTenthsOfMS();
+}
+
+inline void CDmeTimeFrame::SetDuration( DmeTime_t flDuration )
+{
+ Assert( m_Duration >= 0 ); // if you want a reversed clip, set the timescale negative
+ m_Duration = flDuration.GetTenthsOfMS();
+}
+
+inline void CDmeTimeFrame::SetTimeOffset( DmeTime_t flOffset )
+{
+ m_Offset = flOffset.GetTenthsOfMS();
+}
+
+inline void CDmeTimeFrame::SetTimeScale( float flScale )
+{
+ m_Scale = flScale;
+}
+
+
+//-----------------------------------------------------------------------------
+// Convert back + forth between my media time and child media time
+//-----------------------------------------------------------------------------
+inline DmeTime_t CDmeTimeFrame::ToChildMediaTime( DmeTime_t t, bool bClamp ) const
+{
+ t -= DmeTime_t( m_Start );
+ if ( bClamp )
+ {
+ t.Clamp( DMETIME_ZERO, DmeTime_t( m_Duration ) );
+ }
+ return ( t + DmeTime_t( m_Offset ) ) * m_Scale;
+}
+
+inline DmeTime_t CDmeTimeFrame::FromChildMediaTime( DmeTime_t t, bool bClamp ) const
+{
+ t = DmeTime_t( t ) / m_Scale - DmeTime_t( m_Offset );
+ if ( bClamp )
+ {
+ t.Clamp( DMETIME_ZERO, DmeTime_t( m_Duration ) );
+ }
+ return t + DmeTime_t( m_Start );
+}
+
+inline DmeTime_t CDmeTimeFrame::ToChildMediaDuration( DmeTime_t dt ) const
+{
+ return dt * m_Scale;
+}
+
+inline DmeTime_t CDmeTimeFrame::FromChildMediaDuration( DmeTime_t dt ) const
+{
+ return dt / m_Scale;
+}
+
+inline DmeTime_t CDmeTimeFrame::GetStartInChildMediaTime() const
+{
+ DmeTime_t time = DmeTime_t( m_Offset ) * m_Scale;
+ Assert( time == ToChildMediaTime( GetStartTime() ) );
+ return time;
+}
+
+inline DmeTime_t CDmeTimeFrame::GetEndInChildMediaTime() const
+{
+ DmeTime_t time = DmeTime_t( m_Offset + m_Duration ) * m_Scale;
+ Assert( time == ToChildMediaTime( GetStartTime() + GetDuration() ) );
+ return time;
+}
+
+
+#endif // DMETIMEFRAME_H