summaryrefslogtreecommitdiff
path: root/public/movieobjects/dmetrack.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/movieobjects/dmetrack.h')
-rw-r--r--public/movieobjects/dmetrack.h191
1 files changed, 191 insertions, 0 deletions
diff --git a/public/movieobjects/dmetrack.h b/public/movieobjects/dmetrack.h
new file mode 100644
index 0000000..b7afd96
--- /dev/null
+++ b/public/movieobjects/dmetrack.h
@@ -0,0 +1,191 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================
+
+#ifndef DMETRACK_H
+#define DMETRACK_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "tier1/utlflags.h"
+#include "datamodel/dmelement.h"
+#include "datamodel/dmehandle.h"
+#include "movieobjects/dmeclip.h"
+
+
+//-----------------------------------------------------------------------------
+// Forward declarations
+//-----------------------------------------------------------------------------
+class CDmeClip;
+enum DmeClipType_t;
+
+
+//-----------------------------------------------------------------------------
+// Default track name
+//-----------------------------------------------------------------------------
+#define DMETRACK_DEFAULT_NAME "default"
+
+
+//-----------------------------------------------------------------------------
+// Constructor, destructor
+//-----------------------------------------------------------------------------
+class CDmeTrack : public CDmElement
+{
+ DEFINE_ELEMENT( CDmeTrack, CDmElement );
+
+public:
+ // Methods of IDmElement
+ virtual void OnAttributeChanged( CDmAttribute *pAttribute );
+
+ void SetCollapsed( bool state );
+ bool IsCollapsed() const;
+
+ void SetVolume( float state );
+ float GetVolume() const;
+
+
+ void SetMute( bool state );
+ bool IsMute( bool bCheckSoloing = true ) const;
+
+ // Is this track synched to the film track?
+ void SetSynched( bool bState );
+ bool IsSynched() const;
+
+ int GetClipCount() const;
+ CDmeClip *GetClip( int i ) const;
+ const CUtlVector< DmElementHandle_t > &GetClips( ) const;
+
+ void AddClip( CDmeClip *clip );
+ bool RemoveClip( CDmeClip *clip );
+ void RemoveClip( int i );
+ void RemoveAllClips();
+ int FindClip( CDmeClip *clip );
+ CDmeClip *FindNamedClip( const char *name );
+
+ DmeClipType_t GetClipType() const;
+ void SetClipType( DmeClipType_t type );
+
+ // Find clips at, intersecting or within a particular time interval
+ void FindClipsAtTime( DmeTime_t time, DmeClipSkipFlag_t flags, CUtlVector< CDmeClip * >& clips ) const;
+ void FindClipsIntersectingTime( DmeTime_t startTime, DmeTime_t endTime, DmeClipSkipFlag_t flags, CUtlVector< CDmeClip * >& clips ) const;
+ void FindClipsWithinTime( DmeTime_t startTime, DmeTime_t endTime, DmeClipSkipFlag_t flags, CUtlVector< CDmeClip * >& clips ) const;
+
+ // Methods to shift clips around
+ // These methods shift clips that straddle the start/end time (NOTE: time is measured in local time)
+ // NOTE: bTestStartingTime true means if the starting time is after the start time, then shift
+ // Setting it to false means if the clip intersects the time at all, then shift
+ void ShiftAllClipsAfter ( DmeTime_t startTime, DmeTime_t dt, bool bTestStartingTime = true );
+ void ShiftAllClipsBefore( DmeTime_t endTime, DmeTime_t dt, bool bTestEndingTime = true );
+ void ShiftAllClips( DmeTime_t dt );
+
+ // A version that works only on film clips
+ void ShiftAllFilmClipsAfter ( CDmeClip *pClip, DmeTime_t dt, bool bShiftClip = false );
+ void ShiftAllFilmClipsBefore( CDmeClip *pClip, DmeTime_t dt, bool bShiftClip = false );
+
+ // Sorts all children so they ascend in time
+ void SortClipsByStartTime( );
+
+ // Shifts all clips to be non-overlapping
+ void FixOverlaps();
+
+ // Can this track contain clips that overlap in time?
+ // NOTE: Non-overlapping clips will be
+ bool IsNonoverlapping() const;
+
+ // Is this a film track?
+ bool IsFilmTrack() const;
+
+ // Returns the next/previous clip in a film track
+ CDmeClip* FindPrevFilmClip( CDmeClip *pClip );
+ CDmeClip* FindNextFilmClip( CDmeClip *pClip );
+ void FindAdjacentFilmClips( CDmeClip *pClip, CDmeClip *&pPrevClip, CDmeClip *&pNextClip );
+ void FindAdjacentFilmClips( DmeTime_t localTime, CDmeClip *&pPrevClip, CDmeClip *&pNextClip );
+
+ // Finds a clip at a particular time
+ CDmeClip* FindFilmClipAtTime( DmeTime_t localTime );
+
+ // Find first clip that intersects a specific time range
+ CDmeClip* FindFirstFilmClipIntesectingTime( DmeTime_t localStartTime, DmeTime_t localEndTime );
+
+ // Inserts space in a film track for a film clip
+ void InsertSpaceInFilmTrack( DmeTime_t localStartTime, DmeTime_t localEndTime );
+
+ // Singleton solo track (of the same clip type that this track is)
+ CDmeTrack *GetSoloTrack( ) const;
+ void SetSoloTrack( );
+ bool IsSoloTrack() const;
+ static CDmeTrack *GetSoloTrack( DmeClipType_t clipType );
+ static void SetSoloTrack( DmeClipType_t clipType, CDmeTrack *pTrack );
+
+ // Fills all gaps in a film track with slugs
+ void FillAllGapsWithSlugs( const char *pSlugName, DmeTime_t startTime, DmeTime_t endTime );
+
+private:
+ class CSuppressAutoFixup
+ {
+ public:
+ CSuppressAutoFixup( CDmeTrack *pTrack, int nFlags ) : m_pTrack( pTrack ), m_nFlags( nFlags )
+ {
+ m_pTrack->m_Flags.SetFlag( m_nFlags );
+ }
+
+ ~CSuppressAutoFixup()
+ {
+ m_pTrack->m_Flags.ClearFlag( m_nFlags );
+ }
+
+ private:
+ CDmeTrack *m_pTrack;
+ int m_nFlags;
+ };
+
+ enum
+ {
+ IS_SORTED = 0x1,
+ SUPPRESS_OVERLAP_FIXUP = 0x2,
+ SUPPRESS_DIRTY_ORDERING = 0x4,
+ };
+
+ CDmaElementArray< CDmeClip > m_Clips;
+
+ CDmaVar< float > m_Volume;
+ CDmaVar< bool > m_Collapsed;
+ CDmaVar< bool > m_Mute;
+ CDmaVar< bool > m_Synched;
+ CDmaVar< int > m_ClipType;
+
+ CUtlFlags< unsigned char > m_Flags;
+ DmElementHandle_t m_hOwner;
+
+ static DmElementHandle_t m_hSoloTrack[DMECLIP_TYPE_COUNT];
+
+ friend class CSuppressAutoFixup;
+};
+
+
+//-----------------------------------------------------------------------------
+// Indicates whether tracks contain clips that are non-overlapping in time
+//-----------------------------------------------------------------------------
+inline bool CDmeTrack::IsNonoverlapping() const
+{
+ return m_ClipType == DMECLIP_FILM;
+}
+
+
+//-----------------------------------------------------------------------------
+// Is this a film track?
+//-----------------------------------------------------------------------------
+inline bool CDmeTrack::IsFilmTrack() const
+{
+ return m_ClipType == DMECLIP_FILM;
+}
+
+//-----------------------------------------------------------------------------
+// helper methods
+//-----------------------------------------------------------------------------
+CDmeTrackGroup *GetParentTrackGroup( CDmeTrack *pTrack );
+
+#endif // DMETRACK_H