summaryrefslogtreecommitdiff
path: root/public/movieobjects/dmeselection.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/movieobjects/dmeselection.h')
-rw-r--r--public/movieobjects/dmeselection.h200
1 files changed, 200 insertions, 0 deletions
diff --git a/public/movieobjects/dmeselection.h b/public/movieobjects/dmeselection.h
new file mode 100644
index 0000000..02f2625
--- /dev/null
+++ b/public/movieobjects/dmeselection.h
@@ -0,0 +1,200 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// A class representing a subselection of something like a mesh
+//
+//=============================================================================
+
+#ifndef DMECOMPONENT_H
+#define DMECOMPONENT_H
+
+#ifdef _WIN32
+#pragma once
+#endif
+
+
+#include "datamodel/dmelement.h"
+
+
+//-----------------------------------------------------------------------------
+//
+//
+//
+//-----------------------------------------------------------------------------
+class CDmeComponent : public CDmElement
+{
+ DEFINE_ELEMENT( CDmeComponent, CDmElement );
+
+public:
+ enum Component_t
+ {
+ COMP_INVALID = -1,
+
+ COMP_VTX,
+ COMP_FACE,
+
+ STANDARD_COMP_COUNT
+ };
+
+ // resolve internal data from changed attributes
+ virtual void Resolve();
+
+ // What type of component is this
+ Component_t Type() const;
+
+ // How many pieces are in this component
+ virtual int Count() const;
+
+ // Are there no pieces in this component
+ bool IsEmpty() const;
+
+ // Are all possible pieces in this component
+ bool IsComplete() const;
+
+ // Is this an equivalent component to another component
+ virtual bool IsEqual( const CDmeComponent *pRhs ) const;
+
+ // Reset to an empty selection
+ virtual void Clear();
+
+protected:
+
+ CDmaVar< int > m_Type;
+ CDmaVar< bool > m_bComplete;
+};
+
+
+//-----------------------------------------------------------------------------
+// The default type is invalid
+//-----------------------------------------------------------------------------
+inline CDmeComponent::Component_t CDmeComponent::Type() const
+{
+ const int type( m_Type.Get() );
+ if ( type < 0 || type >= STANDARD_COMP_COUNT )
+ return COMP_INVALID;
+
+ return static_cast< Component_t >( type );
+}
+
+
+//-----------------------------------------------------------------------------
+// Are there no pieces in this component
+//-----------------------------------------------------------------------------
+inline int CDmeComponent::Count() const
+{
+ Assert( 0 );
+ return 0;
+}
+
+
+//-----------------------------------------------------------------------------
+// Are there no pieces in this component
+//-----------------------------------------------------------------------------
+inline bool CDmeComponent::IsEmpty() const
+{
+ return Count() == 0;
+}
+
+
+//-----------------------------------------------------------------------------
+// Are all possible pieces in this component
+//-----------------------------------------------------------------------------
+inline bool CDmeComponent::IsEqual( const CDmeComponent *pRhs ) const
+{
+ return Type() == pRhs->Type() && Count() == pRhs->Count() && IsComplete() == pRhs->IsComplete();
+}
+
+
+//-----------------------------------------------------------------------------
+// Are all possible pieces in this component
+//-----------------------------------------------------------------------------
+inline bool CDmeComponent::IsComplete() const
+{
+ return m_bComplete.Get();
+}
+
+
+//-----------------------------------------------------------------------------
+// Reset to an empty selection
+//-----------------------------------------------------------------------------
+inline void CDmeComponent::Clear()
+{
+ m_bComplete.Set( false );
+}
+
+
+//-----------------------------------------------------------------------------
+//
+//
+//
+//-----------------------------------------------------------------------------
+class CDmeSingleIndexedComponent : public CDmeComponent
+{
+ DEFINE_ELEMENT( CDmeSingleIndexedComponent, CDmeComponent );
+
+public:
+ // resolve internal data from changed attributes
+ virtual void Resolve();
+
+ // From CDmeComponent
+ virtual int Count() const;
+
+ bool SetType( Component_t type );
+
+ void AddComponent( int component, float weight = 1.0f );
+
+ void AddComponents( const CUtlVector< int > &components );
+
+ void AddComponents( const CUtlVector< int > &components, const CUtlVector< float > &weights );
+
+ void RemoveComponent( int component );
+
+ bool GetComponent( int index, int &component, float &weight ) const;
+
+ bool GetWeight( int component, float &weight ) const;
+
+ void GetComponents( CUtlVector< int > &components ) const;
+
+ void GetComponents( CUtlVector< int > &components, CUtlVector< float > &weights ) const;
+
+ void SetComplete( int nComplete );
+
+ int GetComplete() const;
+
+ bool HasComponent( int component ) const;
+
+ virtual void Clear();
+
+ void Add( const CDmeSingleIndexedComponent &rhs );
+
+ void Add( const CDmeSingleIndexedComponent *pRhs ) { Assert( pRhs ); Add( *pRhs ); }
+
+ void Union( const CDmeSingleIndexedComponent &rhs ) { Add( rhs ); }
+
+ void Union( const CDmeSingleIndexedComponent *pRhs ) { Assert( pRhs ); Add( *pRhs ); }
+
+ CDmeSingleIndexedComponent &operator+=( const CDmeSingleIndexedComponent &rhs ) { Add( rhs ); return *this; }
+
+ void Subtract( const CDmeSingleIndexedComponent &rhs );
+
+ void Subtract( const CDmeSingleIndexedComponent *pRhs ) { Assert( pRhs ); Subtract( *pRhs ); }
+
+ void Complement( const CDmeSingleIndexedComponent &rhs ) { Subtract( rhs ); }
+
+ void Complement( const CDmeSingleIndexedComponent *pRhs ) { Assert( pRhs ); Subtract( *pRhs ); }
+
+ CDmeSingleIndexedComponent &operator-=( const CDmeSingleIndexedComponent &rhs ) { Subtract( rhs ); return *this; }
+
+ void Intersection( const CDmeSingleIndexedComponent &rhs );
+
+ void Intersection( const CDmeSingleIndexedComponent *pRhs ) { Assert( pRhs ); Intersection( *pRhs ); }
+
+protected:
+ int BinarySearch( int component ) const;
+
+ CDmaVar< int > m_CompleteCount;
+ CDmaArray< int > m_Components;
+ CDmaArray< float > m_Weights;
+};
+
+
+#endif // DMECOMPONENT_H \ No newline at end of file