diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /public/movieobjects/dmeselection.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'public/movieobjects/dmeselection.h')
| -rw-r--r-- | public/movieobjects/dmeselection.h | 200 |
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 |