You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
237 lines
8.1 KiB
237 lines
8.1 KiB
//========= 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
|
|
|