summaryrefslogtreecommitdiff
path: root/public/movieobjects/dmechannel.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/movieobjects/dmechannel.h')
-rw-r--r--public/movieobjects/dmechannel.h283
1 files changed, 283 insertions, 0 deletions
diff --git a/public/movieobjects/dmechannel.h b/public/movieobjects/dmechannel.h
new file mode 100644
index 0000000..2873bd7
--- /dev/null
+++ b/public/movieobjects/dmechannel.h
@@ -0,0 +1,283 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// The channel class - connects elements together, and allows for logging of data
+//
+//=============================================================================
+
+#ifndef DMECHANNEL_H
+#define DMECHANNEL_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "movieobjects/dmeoperator.h"
+#include "movieobjects/dmelog.h"
+#include "movieobjects/dmeclip.h"
+#include "movieobjects/proceduralpresets.h"
+#include "datamodel/idatamodel.h"
+#include "datamodel/dmehandle.h"
+
+//-----------------------------------------------------------------------------
+// Forward declarations
+//-----------------------------------------------------------------------------
+class CDmeClip;
+class CDmeChannel;
+
+
+//-----------------------------------------------------------------------------
+// different channel modes of operation
+//-----------------------------------------------------------------------------
+enum ChannelMode_t
+{
+ CM_OFF,
+ CM_PASS,
+ CM_RECORD,
+ CM_PLAY,
+};
+
+enum PlayMode_t
+{
+ PM_HOLD,
+ PM_LOOP,
+};
+
+
+//-----------------------------------------------------------------------------
+// A class managing channel recording
+//-----------------------------------------------------------------------------
+class CDmeChannelRecordingMgr
+{
+public:
+ // constructor
+ CDmeChannelRecordingMgr();
+
+ // Activates, deactivates layer recording.
+ void StartLayerRecording( const char *pUndoRedoDesc, const DmeLog_TimeSelection_t *pTimeSelection = NULL );
+ void FinishLayerRecording( float flThreshold, bool bFlattenLayers = true );
+
+ // Adds a channel to the recording layer
+ void AddChannelToRecordingLayer( CDmeChannel *pChannel, CDmeClip *pRoot = NULL, CDmeClip *pShot = NULL );
+
+ // Used to iterate over all channels currently being recorded
+ // NOTE: Use CDmeChannel::AddToRecordingLayer to add a channel to the recording layer
+ int GetLayerRecordingChannelCount();
+ CDmeChannel* GetLayerRecordingChannel( int nIndex );
+
+ // Computes time selection info in log time for a particular recorded channel
+ // NOTE: Only valid if IsUsingTimeSelection() returns true
+ void GetLocalTimeSelection( DmeLog_TimeSelection_t& selection, int nIndex );
+
+ // Methods which control various aspects of recording
+ void UpdateTimeAdvancing( bool bPaused, DmeTime_t tCurTime );
+ void UpdateRecordingTimeSelectionTimes( const DmeLog_TimeSelection_t& timeSelection );
+ void SetIntensityOnAllLayers( float flIntensity );
+ void SetRecordingMode( RecordingMode_t mode );
+ void SetPresetValue( CDmeChannel* pChannel, CDmAttribute *pPresetValue );
+
+ void SetProceduralTarget( int nProceduralMode, const CDmAttribute *pTarget );
+ void SetProceduralTarget( int nProceduralMode, const CUtlVector< KeyValues * >& list );
+ int GetProceduralType() const;
+ const CDmAttribute *GetProceduralTarget() const;
+ const CUtlVector< KeyValues * > &GetPasteTarget() const;
+
+ // Methods to query aspects of recording
+ bool IsTimeAdvancing() const;
+ bool IsUsingDetachedTimeSelection() const;
+ bool IsUsingTimeSelection() const;
+
+private:
+ struct LayerChannelInfo_t
+ {
+ LayerChannelInfo_t() : m_pPresetValue( 0 ) {}
+
+ CDmeHandle< CDmeChannel > m_Channel;
+ DmeClipStack_t m_ClipStack;
+ CDmAttribute* m_pPresetValue;
+ };
+
+ // Methods available for CDmeChannel
+ bool ShouldRecordUsingTimeSelection() const;
+
+ // Internal methods
+ void FlattenLayers( float flThreshhold );
+ void RemoveAllChannelsFromRecordingLayer( );
+
+ bool m_bActive : 1;
+ bool m_bSavedUndoState : 1;
+ bool m_bUseTimeSelection : 1;
+ CUtlVector< LayerChannelInfo_t > m_LayerChannels;
+ DmeLog_TimeSelection_t m_TimeSelection;
+ int m_nRevealType;
+ const CDmAttribute *m_pRevealTarget;
+ CUtlVector< KeyValues * > m_PasteTarget;
+
+ friend CDmeChannel;
+};
+
+// Singleton
+extern CDmeChannelRecordingMgr *g_pChannelRecordingMgr;
+
+
+//-----------------------------------------------------------------------------
+// A class representing a channel
+//-----------------------------------------------------------------------------
+class CDmeChannel : public CDmeOperator
+{
+ DEFINE_ELEMENT( CDmeChannel, CDmeOperator );
+
+public:
+ virtual bool IsDirty(); // ie needs to operate
+ virtual void Operate();
+
+ virtual void GetInputAttributes ( CUtlVector< CDmAttribute * > &attrs );
+ virtual void GetOutputAttributes( CUtlVector< CDmAttribute * > &attrs );
+
+ void SetInput ( CDmElement* pElement, const char* pAttribute, int index = 0 );
+ void SetOutput( CDmElement* pElement, const char* pAttribute, int index = 0 );
+
+ void SetInput( CDmAttribute *pAttribute, int index = 0 );
+ void SetOutput( CDmAttribute *pAttribute, int index = 0 );
+
+ CDmElement *GetFromElement() const;
+ CDmElement *GetToElement() const;
+
+ CDmAttribute *GetFromAttribute();
+ CDmAttribute *GetToAttribute();
+
+ int GetFromArrayIndex() const;
+ int GetToArrayIndex() const;
+
+ ChannelMode_t GetMode();
+ void SetMode( ChannelMode_t mode );
+
+ void ClearLog();
+ CDmeLog *GetLog();
+ void SetLog( CDmeLog *pLog );
+ CDmeLog *CreateLog( DmAttributeType_t type );
+ template < class T > CDmeTypedLog<T> *CreateLog();
+
+ void ClearTimeMetric();
+ void SetCurrentTime( DmeTime_t time, DmeTime_t start, DmeTime_t end );
+ void SetCurrentTime( DmeTime_t time ); // Simple version. Only works if multiple active channels clips do not reference the same channels
+ DmeTime_t GetCurrentTime() const;
+
+ void SetChannelToPlayToSelf( const char *outputAttributeName, float defaultValue, bool force = false );
+
+ // need this until we have the EditApply message queue
+ void OnAttributeChanged( CDmAttribute *pAttribute );
+
+ template< class T >
+ bool GetCurrentPlaybackValue( T& value );
+ template< class T >
+ bool GetPlaybackValueAtTime( DmeTime_t time, T& value );
+
+ void Play();
+
+ void SetNextKeyCurveType( int nCurveType );
+
+ // Builds a clip stack for the channel
+ CDmeClip* FindOwnerClipForChannel( CDmeClip *pRoot );
+ bool BuildClipStack( DmeClipStack_t *pClipStack, CDmeClip *pRoot, CDmeClip *pShot );
+
+protected:
+ // Used to cache off handles to attributes
+ CDmAttribute* SetupFromAttribute();
+ CDmAttribute* SetupToAttribute();
+
+ void Record();
+ void Pass();
+
+ CDmaElement< CDmElement > m_fromElement;
+ CDmaString m_fromAttribute;
+ CDmaVar< int > m_fromIndex;
+ CDmaElement< CDmElement > m_toElement;
+ CDmaString m_toAttribute;
+ CDmaVar< int > m_toIndex;
+ CDmaVar< int > m_mode;
+ CDmaElement< CDmeLog > m_log;
+
+ DmAttributeHandle_t m_FromAttributeHandle;
+ DmAttributeHandle_t m_ToAttributeHandle;
+
+ DmeTime_t m_timeOutsideTimeframe;
+ DmeTime_t m_tCurrentTime;
+ DmeTime_t m_tPreviousTime;
+
+ int m_nRecordLayerIndex;
+ int m_nNextCurveType;
+
+ friend class CDmeChannelRecordingMgr;
+};
+
+
+//-----------------------------------------------------------------------------
+// Inline methods
+//-----------------------------------------------------------------------------
+template < class T >
+inline CDmeTypedLog<T> *CDmeChannel::CreateLog()
+{
+ return CastElement< CDmeTypedLog<T> >( CreateLog( CDmAttributeInfo<T>::AttributeType() ) );
+}
+
+inline CDmAttribute *CDmeChannel::GetFromAttribute()
+{
+ CDmAttribute *pAttribute = g_pDataModel->GetAttribute( m_FromAttributeHandle );
+ if ( !pAttribute )
+ {
+ pAttribute = SetupFromAttribute();
+ }
+ return pAttribute;
+}
+
+inline CDmAttribute *CDmeChannel::GetToAttribute()
+{
+ CDmAttribute *pAttribute = g_pDataModel->GetAttribute( m_ToAttributeHandle );
+ if ( !pAttribute )
+ {
+ pAttribute = SetupToAttribute();
+ }
+ return pAttribute;
+}
+
+template< class T >
+inline bool CDmeChannel::GetPlaybackValueAtTime( DmeTime_t time, T& value )
+{
+ CDmeTypedLog< T > *pLog = CastElement< CDmeTypedLog< T > >( GetLog() );
+ if ( !pLog || pLog->IsEmpty() )
+ return false;
+
+ DmeTime_t t0 = pLog->GetBeginTime();
+ DmeTime_t tn = pLog->GetEndTime();
+
+ PlayMode_t pmode = PM_HOLD;
+ switch ( pmode )
+ {
+ case PM_HOLD:
+ time = clamp( time, t0, tn );
+ break;
+
+ case PM_LOOP:
+ if ( tn == t0 )
+ {
+ time = t0;
+ }
+ else
+ {
+ time -= t0;
+ time = time % ( tn - t0 );
+ time += t0;
+ }
+ break;
+ }
+
+ value = pLog->GetValue( time );
+ return true;
+}
+
+template< class T >
+inline bool CDmeChannel::GetCurrentPlaybackValue( T& value )
+{
+ return GetPlaybackValueAtTime( GetCurrentTime(), value );
+}
+
+#endif // DMECHANNEL_H