Counter Strike : Global Offensive Source Code
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.

339 lines
12 KiB

  1. //====== Copyright � 1996-2005, Valve Corporation, All rights reserved. =======
  2. //
  3. // Purpose:
  4. //
  5. //=============================================================================
  6. #ifndef DMEANIMATIONSET_H
  7. #define DMEANIMATIONSET_H
  8. #ifdef _WIN32
  9. #pragma once
  10. #endif
  11. #include "datamodel/dmelement.h"
  12. #include "datamodel/dmattribute.h"
  13. #include "datamodel/dmattributevar.h"
  14. #include "movieobjects/dmephonememapping.h"
  15. #include "movieobjects/proceduralpresets.h"
  16. #include "movieobjects/dmecontrolgroup.h"
  17. #include "movieobjects/dmetransformcontrol.h"
  18. #include "tier1/utldict.h"
  19. class CDmeDag;
  20. class CDmeFilmClip;
  21. class CDmeTransform;
  22. class CDmeRig;
  23. // names of control value attributes and single-valued (non-animated) preset value attributes
  24. #define AS_VALUE_ATTR "value"
  25. #define AS_VALUE_LEFT_ATTR "leftValue"
  26. #define AS_VALUE_RIGHT_ATTR "rightValue"
  27. #define AS_VALUE_POSITION_ATTR "valuePosition"
  28. #define AS_VALUE_ORIENTATION_ATTR "valueOrientation"
  29. // names of animated preset value attributes
  30. #define AS_VALUES_ATTR "values"
  31. #define AS_VALUES_LEFT_ATTR "leftValues"
  32. #define AS_VALUES_RIGHT_ATTR "rightValues"
  33. #define AS_VALUES_POSITION_ATTR "valuePositions"
  34. #define AS_VALUES_ORIENTATION_ATTR "valueOrientations"
  35. // names of animated preset time attributes
  36. #define AS_TIMES_ATTR "times"
  37. #define AS_TIMES_LEFT_ATTR "leftTimes"
  38. #define AS_TIMES_RIGHT_ATTR "rightTimes"
  39. #define AS_TIMES_POSITION_ATTR "timePositions"
  40. #define AS_TIMES_ORIENTATION_ATTR "timeOrientations"
  41. //-----------------------------------------------------------------------------
  42. // A preset is a list of values to be applied to named controls in the animation set
  43. //-----------------------------------------------------------------------------
  44. class CDmePreset : public CDmElement
  45. {
  46. DEFINE_ELEMENT( CDmePreset, CDmElement );
  47. public:
  48. CDmaElementArray< CDmElement > &GetControlValues();
  49. const CDmaElementArray< CDmElement > &GetControlValues() const;
  50. CDmElement *FindControlValue( const char *pControlName );
  51. CDmElement *FindOrAddControlValue( const char *pControlName );
  52. void RemoveControlValue( const char *pControlName );
  53. bool IsReadOnly();
  54. void CopyControlValuesFrom( CDmePreset *pSource );
  55. bool IsAnimated();
  56. private:
  57. int FindControlValueIndex( const char *pControlName );
  58. CDmaElementArray< CDmElement > m_ControlValues;
  59. };
  60. class CDmeProceduralPresetSettings : public CDmElement
  61. {
  62. DEFINE_ELEMENT( CDmeProceduralPresetSettings, CDmElement );
  63. public:
  64. float GetJitterScale( DmAttributeType_t attType ) const;
  65. float GetSmoothScale( DmAttributeType_t attType ) const;
  66. float GetSharpenScale( DmAttributeType_t attType ) const;
  67. float GetSoftenScale( DmAttributeType_t attType ) const;
  68. CDmaVar< float > m_flJitterScale;
  69. CDmaVar< float > m_flSmoothScale;
  70. CDmaVar< float > m_flSharpenScale;
  71. CDmaVar< float > m_flSoftenScale;
  72. CDmaVar< float > m_flJitterScaleVector;
  73. CDmaVar< float > m_flSmoothScaleVector;
  74. CDmaVar< float > m_flSharpenScaleVector;
  75. CDmaVar< float > m_flSoftenScaleVector;
  76. CDmaVar< int > m_nJitterIterations;
  77. CDmaVar< int > m_nSmoothIterations;
  78. CDmaVar< int > m_nSharpenIterations;
  79. CDmaVar< int > m_nSoftenIterations;
  80. CDmaTime m_staggerInterval;
  81. };
  82. class CDmeAnimationSet;
  83. class CDmeCombinationOperator;
  84. //-----------------------------------------------------------------------------
  85. // A preset group is a list of presets, with shared visibility + readonly settings
  86. //-----------------------------------------------------------------------------
  87. class CDmePresetGroup : public CDmElement
  88. {
  89. DEFINE_ELEMENT( CDmePresetGroup, CDmElement );
  90. public:
  91. CDmaElementArray< CDmePreset > &GetPresets(); // raw access to the array
  92. const CDmaElementArray< CDmePreset > &GetPresets() const;
  93. CDmePreset *FindPreset( const char *pPresetName );
  94. CDmePreset *FindOrAddPreset( const char *pPresetName );
  95. bool RemovePreset( CDmePreset *pPreset );
  96. bool RemovePreset( const char *pPresetName );
  97. void MovePresetInFrontOf( CDmePreset *pPreset, CDmePreset *pInFrontOf );
  98. CDmaVar< bool > m_bIsVisible;
  99. CDmaVar< bool > m_bIsReadOnly;
  100. // Exports this preset group to a faceposer .txt expression file
  101. bool ExportToTXT( const char *pFilename, CDmeAnimationSet *pAnimationSet = NULL, CDmeCombinationOperator *pComboOp = NULL ) const;
  102. // Exports this preset group to a faceposer .vfe expression file
  103. bool ExportToVFE( const char *pFilename, CDmeAnimationSet *pAnimationSet = NULL, CDmeCombinationOperator *pComboOp = NULL ) const;
  104. private:
  105. int FindPresetIndex( CDmePreset *pPreset );
  106. int FindPresetIndex( const char *pPresetName );
  107. CDmaElementArray< CDmePreset > m_Presets; // "presets"
  108. };
  109. //-----------------------------------------------------------------------------
  110. // The main controlbox for controlling animation for a single model
  111. //-----------------------------------------------------------------------------
  112. class CDmeAnimationSet : public CDmElement
  113. {
  114. DEFINE_ELEMENT( CDmeAnimationSet, CDmElement );
  115. public:
  116. virtual void OnAttributeArrayElementAdded ( CDmAttribute *pAttribute, int nFirstElem, int nLastElem );
  117. virtual void OnAttributeArrayElementRemoved( CDmAttribute *pAttribute, int nFirstElem, int nLastElem );
  118. CDmaElementArray< CDmElement > &GetControls(); // raw access to the array
  119. CDmaElementArray< CDmePresetGroup > &GetPresetGroups(); // raw access to the array
  120. CDmaElementArray< CDmePhonemeMapping > &GetPhonemeMap(); // raw access to the array
  121. CDmaElementArray< CDmeOperator > &GetOperators(); // raw access to the array
  122. void RestoreDefaultPhonemeMap();
  123. CDmePhonemeMapping *FindMapping( const char *pRawPhoneme );
  124. // Control methods
  125. void AddControl( CDmElement *pControl );
  126. void RemoveControl( CDmElement *pControl );
  127. CDmElement *FindControl( const char *pControlName ) const;
  128. CDmElement *FindOrAddControl( const char *pControlName, bool bTransformControl, bool bMustBeNew = false );
  129. CDmElement *CreateNewControl( const char *pControlName, bool bTransformControl );
  130. // Methods pertaining to preset groups
  131. CDmePresetGroup *FindPresetGroup( const char *pGroupName );
  132. CDmePresetGroup *FindOrAddPresetGroup( const char *pGroupName );
  133. void AddPresetGroup( CDmePresetGroup *pPresetGroup );
  134. bool RemovePresetGroup( CDmePresetGroup *pPresetGroup );
  135. bool RemovePresetGroup( const char *pGroupName );
  136. void MovePresetGroupInFrontOf( CDmePresetGroup *pPresetGroup, CDmePresetGroup *pInFrontOf );
  137. CDmePreset *FindOrAddPreset( const char *pGroupName, const char *pPresetName );
  138. bool RemovePreset( CDmePreset *pPreset );
  139. bool RemovePreset( const char *pPresetName );
  140. // Get the root selection group
  141. CDmeControlGroup *GetRootControlGroup() const;
  142. // Find the control group with the specified name.
  143. CDmeControlGroup *FindControlGroup( const char *pControlGroupName ) const;
  144. // Find the control group with the specified name or add it if does not exist
  145. CDmeControlGroup *FindOrAddControlGroup( CDmeControlGroup *pParentGroup, const char *pControlGroupName );
  146. // Find the control with the specified name, remove it from the group it belongs to and destroy it
  147. void RemoveControlFromGroups( char const *pchControlName, bool removeEmpty = false );
  148. // Build a list of the root dag nodes of the animation set
  149. void FindRootDagNodes( CUtlVector< CDmeDag* > &dagNodeList ) const;
  150. virtual void OnElementUnserialized();
  151. void CollectDagNodes( CUtlVector< CDmeDag* > &dagNodeList ) const;
  152. void CollectOperators( CUtlVector< DmElementHandle_t > &operators );
  153. void AddOperator( CDmeOperator *pOperator );
  154. void RemoveOperator( CDmeOperator *pOperator );
  155. void UpdateTransformDefaults() const;
  156. private:
  157. int FindPresetGroupIndex( CDmePresetGroup *pGroup );
  158. int FindPresetGroupIndex( const char *pGroupName );
  159. CDmaElementArray< CDmElement > m_Controls; // "controls"
  160. CDmaElementArray< CDmePresetGroup > m_PresetGroups; // "presetGroups"
  161. CDmaElementArray< CDmePhonemeMapping > m_PhonemeMap; // "phonememap"
  162. CDmaElementArray< CDmeOperator > m_Operators; // "operators"
  163. CDmaElement< CDmeControlGroup > m_RootControlGroup; // "rootControlGroup"
  164. // Helper for searching for controls by name
  165. CUtlDict< DmElementHandle_t, int > m_ControlNameMap;
  166. };
  167. CDmeAnimationSet *FindAnimationSetForDag( CDmeDag *pDagNode );
  168. //-----------------------------------------------------------------------------
  169. // Utility class to migrate from traversing all animationsets within an animationsetgroup to a filmclip
  170. //-----------------------------------------------------------------------------
  171. class CAnimSetGroupAnimSetTraversal
  172. {
  173. public:
  174. CAnimSetGroupAnimSetTraversal( CDmeFilmClip *pFilmClip ) : m_pFilmClip( pFilmClip ), m_nIndex( 0 ) {}
  175. void Reset( CDmeFilmClip *pFilmClip ) { m_pFilmClip = pFilmClip; m_nIndex = 0; }
  176. bool IsValid();
  177. CDmeAnimationSet *Next();
  178. private:
  179. CDmeFilmClip *m_pFilmClip;
  180. int m_nIndex;
  181. };
  182. //-----------------------------------------------------------------------------
  183. // Utility class for finding the dependencies of a control with in the
  184. // animation set.
  185. //-----------------------------------------------------------------------------
  186. class CAnimSetControlDependencyMap
  187. {
  188. public:
  189. // Add the controls of the specified animation set to the dependency map
  190. void AddAnimationSet( const CDmeAnimationSet* pAnimSet );
  191. // Get the list of controls which the specified control is dependent on.
  192. const CUtlVector< const CDmElement * > *GetControlDepndencies( const CDmElement *pControl ) const;
  193. private:
  194. struct DependencyList_t
  195. {
  196. const CDmElement *m_pElement;
  197. CUtlVector< const CDmElement * > m_Dependencies;
  198. };
  199. DependencyList_t *FindDependencyList( const CDmElement* pElement );
  200. CUtlVector< DependencyList_t > m_DependencyData;
  201. };
  202. static const char DEFAULT_POSITION_ATTR[] = "defaultPosition";
  203. static const char DEFAULT_ORIENTATION_ATTR[] = "defaultOrientation";
  204. static const char DEFAULT_FLOAT_ATTR[] = "defaultValue";
  205. #define MULTI_CONTROL_FORMAT_STRING "multi_%s"
  206. typedef int ControlIndex_t;
  207. ControlIndex_t FindComboOpControlIndexForAnimSetControl( CDmeCombinationOperator *pComboOp, const char *pControlName, bool *pIsMulti = NULL );
  208. inline bool IsMonoControl( const CDmElement *pControl )
  209. {
  210. // static CUtlSymbolLarge sym = g_pDataModel->GetSymbol( "value" );
  211. return pControl->HasAttribute( "value" );
  212. }
  213. inline bool IsStereoControl( const CDmElement *pControl )
  214. {
  215. // static CUtlSymbolLarge sym = g_pDataModel->GetSymbol( "rightValue" );
  216. return pControl->HasAttribute( "rightValue" );
  217. }
  218. inline bool IsTransformControl( const CDmElement *pControl )
  219. {
  220. return pControl->IsA( CDmeTransformControl::GetStaticTypeSymbol() );
  221. }
  222. //-----------------------------------------------------------------------------
  223. // Utility methods to convert between L/R and V/B
  224. //-----------------------------------------------------------------------------
  225. inline void ValueBalanceToLeftRight( float *pLeft, float *pRight, float flValue, float flBalance, float flDefaultValue )
  226. {
  227. *pLeft = ( flBalance <= 0.5f ) ? flValue : ( ( 1.0f - flBalance ) / 0.5f ) * ( flValue - flDefaultValue ) + flDefaultValue;
  228. *pRight = ( flBalance >= 0.5f ) ? flValue : ( flBalance / 0.5f ) * ( flValue - flDefaultValue ) + flDefaultValue;
  229. }
  230. //-----------------------------------------------------------------------------
  231. // CDmePresetGroupInfo - container for shared preset groups
  232. //-----------------------------------------------------------------------------
  233. class CDmePresetGroupInfo : public CDmElement
  234. {
  235. DEFINE_ELEMENT( CDmePresetGroupInfo, CDmElement );
  236. public:
  237. void LoadPresetGroups();
  238. const char *GetFilenameBase() const { return m_filenameBase.Get(); }
  239. void SetFilenameBase( const char *pFilenameBase ) { m_filenameBase = pFilenameBase; }
  240. int GetPresetGroupCount() const { return m_presetGroups.Count(); }
  241. CDmePresetGroup *GetPresetGroup( int i ) { return m_presetGroups[ i ]; }
  242. int AddPresetGroup( CDmePresetGroup *pPresetGroup ) { return m_presetGroups.AddToTail( pPresetGroup ); }
  243. static void FilenameBaseForModelName( const char *pModelName, char *pFileNameBase, int nFileNameBaseLen );
  244. static CDmePresetGroupInfo *FindPresetGroupInfo( const char *pFilenameBase, CDmrElementArray< CDmePresetGroupInfo > &presetGroupInfos );
  245. static CDmePresetGroupInfo *FindOrCreatePresetGroupInfo( const char *pFilenameBase, CDmrElementArray< CDmePresetGroupInfo > &presetGroupInfos );
  246. static CDmePresetGroupInfo *CreatePresetGroupInfo( const char *pFilenameBase, DmFileId_t fileid );
  247. static void LoadPresetGroups( const char *pFilenameBase, CDmaElementArray< CDmePresetGroup > &presetGroups );
  248. protected:
  249. CDmaString m_filenameBase; // "filenameBase"
  250. CDmaElementArray< CDmePresetGroup > m_presetGroups; // "presetGroups"
  251. };
  252. #endif // DMEANIMATIONSET_H