diff options
Diffstat (limited to 'public/movieobjects/dmeanimationset.h')
| -rw-r--r-- | public/movieobjects/dmeanimationset.h | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/public/movieobjects/dmeanimationset.h b/public/movieobjects/dmeanimationset.h new file mode 100644 index 0000000..ad7678b --- /dev/null +++ b/public/movieobjects/dmeanimationset.h @@ -0,0 +1,237 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#ifndef DMEANIMATIONSET_H +#define DMEANIMATIONSET_H +#ifdef _WIN32 +#pragma once +#endif + +#include "datamodel/dmelement.h" +#include "datamodel/dmattribute.h" +#include "datamodel/dmattributevar.h" +#include "movieobjects/dmephonememapping.h" +#include "movieobjects/timeutils.h" +#include "movieobjects/proceduralpresets.h" + +class CDmeBookmark; + +//----------------------------------------------------------------------------- +// A preset is a list of values to be applied to named controls in the animation set +//----------------------------------------------------------------------------- +class CDmePreset : public CDmElement +{ + DEFINE_ELEMENT( CDmePreset, CDmElement ); + +public: + CDmaElementArray< CDmElement > &GetControlValues(); + const CDmaElementArray< CDmElement > &GetControlValues() const; + + CDmElement *FindControlValue( const char *pControlName ); + CDmElement *FindOrAddControlValue( const char *pControlName ); + void RemoveControlValue( const char *pControlName ); + bool IsReadOnly(); + void CopyControlValuesFrom( CDmePreset *pSource ); + + // See the enumeration above + void SetProceduralPresetType( int nType ); + bool IsProcedural() const; + int GetProceduralPresetType() const; + +private: + int FindControlValueIndex( const char *pControlName ); + + CDmaElementArray< CDmElement > m_ControlValues; + CDmaVar< int > m_nProceduralType; +}; + + +class CDmeProceduralPresetSettings : public CDmElement +{ + DEFINE_ELEMENT( CDmeProceduralPresetSettings, CDmElement ); +public: + + CDmaVar< float > m_flJitterScale; + CDmaVar< float > m_flSmoothScale; + CDmaVar< float > m_flSharpenScale; + CDmaVar< float > m_flSoftenScale; + + CDmaVar< int > m_nJitterIterations; + CDmaVar< int > m_nSmoothIterations; + CDmaVar< int > m_nSharpenIterations; + CDmaVar< int > m_nSoftenIterations; + + CDmaVar< int > m_nStaggerInterval; +}; + +//----------------------------------------------------------------------------- +// A class used to copy preset values from one preset group to another +//----------------------------------------------------------------------------- +class CDmePresetRemap : public CDmElement +{ + DEFINE_ELEMENT( CDmePresetRemap, CDmElement ); + +public: + CDmaString m_SourcePresetGroup; + + const char *FindSourcePreset( const char *pDestPresetName ); + int GetRemapCount(); + const char *GetRemapSource( int i ); + const char *GetRemapDest( int i ); + void AddRemap( const char *pSourcePresetName, const char *pDestPresetName ); + void RemoveAll(); + +private: + CDmaStringArray m_SrcPresets; + CDmaStringArray m_DestPresets; +}; + + +class CDmeAnimationSet; +class CDmeCombinationOperator; + +//----------------------------------------------------------------------------- +// A preset group is a list of presets, with shared visibility + readonly settings +//----------------------------------------------------------------------------- +class CDmePresetGroup : public CDmElement +{ + DEFINE_ELEMENT( CDmePresetGroup, CDmElement ); + +public: + CDmaElementArray< CDmePreset > &GetPresets(); // raw access to the array + const CDmaElementArray< CDmePreset > &GetPresets() const; + CDmePreset *FindPreset( const char *pPresetName ); + CDmePreset *FindOrAddPreset( const char *pPresetName, int nProceduralType = PROCEDURAL_PRESET_NOT ); + bool RemovePreset( CDmePreset *pPreset ); + void MovePresetUp( CDmePreset *pPreset ); + void MovePresetDown( CDmePreset *pPreset ); + void MovePresetInFrontOf( CDmePreset *pPreset, CDmePreset *pInFrontOf ); + CDmePresetRemap *GetPresetRemap(); + CDmePresetRemap *GetOrAddPresetRemap(); + + CDmaVar< bool > m_bIsVisible; + CDmaVar< bool > m_bIsReadOnly; + + // Exports this preset group to a faceposer .txt expression file + bool ExportToTXT( const char *pFilename, CDmeAnimationSet *pAnimationSet = NULL, CDmeCombinationOperator *pComboOp = NULL ) const; + + // Exports this preset group to a faceposer .vfe expression file + bool ExportToVFE( const char *pFilename, CDmeAnimationSet *pAnimationSet = NULL, CDmeCombinationOperator *pComboOp = NULL ) const; + +private: + int FindPresetIndex( CDmePreset *pGroupName ); + + CDmaElementArray< CDmePreset > m_Presets; // "presets" +}; + + +//----------------------------------------------------------------------------- +// The main controlbox for controlling animation +//----------------------------------------------------------------------------- +class CDmeAnimationSet : public CDmElement +{ + DEFINE_ELEMENT( CDmeAnimationSet, CDmElement ); + +public: + CDmaElementArray< CDmElement > &GetControls(); // raw access to the array + CDmaElementArray< CDmElement > &GetSelectionGroups(); // raw access to the array + CDmaElementArray< CDmePresetGroup > &GetPresetGroups(); // raw access to the array + CDmaElementArray< CDmePhonemeMapping > &GetPhonemeMap(); // raw access to the array + CDmaElementArray< CDmeOperator > &GetOperators(); // raw access to the array + + void RestoreDefaultPhonemeMap(); + + CDmePhonemeMapping *FindMapping( const char *pRawPhoneme ); + CDmElement *FindControl( const char *pControlName ); + CDmElement *FindOrAddControl( const char *pControlName ); + + // Methods pertaining to preset groups + CDmePresetGroup *FindPresetGroup( const char *pGroupName ); + CDmePresetGroup *FindOrAddPresetGroup( const char *pGroupName ); + bool RemovePresetGroup( CDmePresetGroup *pPresetGroup ); + void MovePresetGroupUp( CDmePresetGroup *pPresetGroup ); + void MovePresetGroupDown( CDmePresetGroup *pPresetGroup ); + void MovePresetGroupInFrontOf( CDmePresetGroup *pPresetGroup, CDmePresetGroup *pInFrontOf ); + + CDmePreset *FindOrAddPreset( const char *pGroupName, const char *pPresetName, int nProceduralType = PROCEDURAL_PRESET_NOT ); + bool RemovePreset( CDmePreset *pPreset ); + + const CDmaElementArray< CDmeBookmark > &GetBookmarks() const; + CDmaElementArray< CDmeBookmark > &GetBookmarks(); + + CDmElement *FindSelectionGroup( const char *pSelectionGroupName ); + CDmElement *FindOrAddSelectionGroup( const char *pSelectionGroupName ); + + virtual void OnElementUnserialized(); + + void CollectOperators( CUtlVector< DmElementHandle_t > &operators ); + void AddOperator( CDmeOperator *pOperator ); + void RemoveOperator( CDmeOperator *pOperator ); + + void EnsureProceduralPresets(); + +private: + int FindPresetGroupIndex( CDmePresetGroup *pGroup ); + int FindPresetGroupIndex( const char *pGroupName ); + + CDmaElementArray< CDmElement > m_Controls; // "controls" + CDmaElementArray< CDmElement > m_SelectionGroups; // "selectionGroups" + CDmaElementArray< CDmePresetGroup > m_PresetGroups; // "presetGroups" + CDmaElementArray< CDmePhonemeMapping > m_PhonemeMap; // "phonememap" + CDmaElementArray< CDmeOperator > m_Operators; // "operators" + CDmaElementArray< CDmeBookmark > m_Bookmarks; // "bookmarks" + + friend class CModelPresetGroupManager; +}; + + +//----------------------------------------------------------------------------- +// Utility methods to convert between L/R and V/B +//----------------------------------------------------------------------------- +inline void ValueBalanceToLeftRight( float *pLeft, float *pRight, float flValue, float flBalance ) +{ + *pLeft = ( flBalance <= 0.5f ) ? 1.0f : ( ( 1.0f - flBalance ) / 0.5f ); + *pLeft *= flValue; + *pRight = ( flBalance >= 0.5f ) ? 1.0f : ( flBalance / 0.5f ); + *pRight *= flValue; +} + +inline void LeftRightToValueBalance( float *pValue, float *pBalance, float flLeft, float flRight, float flDefaultBalance = 0.5f ) +{ + *pValue = max( flRight, flLeft ); + if ( *pValue <= 1e-6 ) + { + // Leave target balance at input value if target == 0 and on the dest side of blending + *pBalance = flDefaultBalance; + return; + } + + if ( flRight < flLeft ) + { + *pBalance = 0.5f * flRight / flLeft; + } + else + { + *pBalance = 1.0f - ( 0.5f * flLeft / flRight ); + } +} + + +//----------------------------------------------------------------------------- +// A cache of preset groups to be associated with specific models +//----------------------------------------------------------------------------- +abstract_class IModelPresetGroupManager +{ +public: + virtual void AssociatePresetsWithFile( DmFileId_t fileId ) = 0; + virtual void ApplyModelPresets( const char *pModelName, CDmeAnimationSet *pAnimationSet ) = 0; +}; + + +extern IModelPresetGroupManager *g_pModelPresetGroupMgr; + + +#endif // DMEANIMATIONSET_H |