summaryrefslogtreecommitdiff
path: root/public/movieobjects/dmeanimationset.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/movieobjects/dmeanimationset.h')
-rw-r--r--public/movieobjects/dmeanimationset.h237
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