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/sfmobjects/flexcontrolbuilder.h | |
| download | archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip | |
Diffstat (limited to 'public/sfmobjects/flexcontrolbuilder.h')
| -rw-r--r-- | public/sfmobjects/flexcontrolbuilder.h | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/public/sfmobjects/flexcontrolbuilder.h b/public/sfmobjects/flexcontrolbuilder.h new file mode 100644 index 0000000..0ac6446 --- /dev/null +++ b/public/sfmobjects/flexcontrolbuilder.h @@ -0,0 +1,179 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// A class used to build flex animation controls for an animation set +// +//============================================================================= + +#ifndef FLEXCONTROLBUILDER_H +#define FLEXCONTROLBUILDER_H +#ifdef _WIN32 +#pragma once +#endif + + +#include "movieobjects/timeutils.h" +#include "tier1/utlvector.h" +#include "movieobjects/dmelog.h" + + +//----------------------------------------------------------------------------- +// Forward declarations +//----------------------------------------------------------------------------- +class CDmeAnimationSet; +class CDmeGameModel; +class CDmeFilmClip; +class CDmeChannelsClip; +class CDmElement; +class CDmeChannel; +class CDmeBalanceToStereoCalculatorOperator; +class CDmeGlobalFlexControllerOperator; + + +//----------------------------------------------------------------------------- +// +// Utility class for dealing with the complex task of building flex controls +// +//----------------------------------------------------------------------------- +class CFlexControlBuilder +{ +public: + // Main entry point for creating flex animation set controls + void CreateAnimationSetControls( CDmeFilmClip *pMovie, CDmeAnimationSet *pAnimationSet, + CDmeGameModel *pGameModel, CDmeFilmClip *pSourceClip, CDmeChannelsClip *pDestClip, bool bUseExistingLogs ); + +private: + enum ControlField_t + { + CONTROL_VALUE = 0, + CONTROL_BALANCE, + CONTROL_MULTILEVEL, + + CONTROL_FIELD_COUNT, + }; + + enum OutputField_t + { + OUTPUT_MONO = 0, + OUTPUT_RIGHT = 0, + OUTPUT_LEFT, + OUTPUT_MULTILEVEL, + + OUTPUT_FIELD_COUNT, + }; + + struct FlexControllerInfo_t + { + char m_pFlexControlName[256]; + float m_flDefaultValue; + int m_nGlobalIndex; + }; + + struct ExistingLogInfo_t + { + CDmeFloatLog *m_pLog; + DmeTime_t m_GlobalOffset; + double m_flGlobalScale; + }; + + struct ControlInfo_t + { + char m_pControlName[256]; + bool m_bIsStereo : 1; + bool m_bIsMulti : 1; + CDmElement *m_pControl; + + int m_pControllerIndex[OUTPUT_FIELD_COUNT]; + + CDmeChannel *m_ppControlChannel[CONTROL_FIELD_COUNT]; + float m_pDefaultValue[CONTROL_FIELD_COUNT]; + ExistingLogInfo_t m_pExistingLog[CONTROL_FIELD_COUNT]; + }; + + // Removes a channel from the channels clip referring to it. + void RemoveChannelFromClips( CDmeChannel *pChannel ); + + // Removes a stereo operator from the animation set referring to it + void RemoveStereoOpFromSet( CDmeBalanceToStereoCalculatorOperator *pChannel ); + + // Builds the list of flex controls (outputs) in the current game model + void BuildDesiredFlexControlList( CDmeGameModel *pGameModel ); + + // This builds a list of the desired input controls we need to have controls for + // by the time we're all done with this enormous process. + void BuildDesiredControlList( CDmeGameModel *pGameModel ); + + // finds controls whose channels don't point to anything anymore, and deletes both the channels and the control + void RemoveUnusedControlsAndChannels( CDmeAnimationSet *pAnimationSet, CDmeChannelsClip *pChannelsClip ); + + // I'll bet you can guess what this does + void RemoveUnusedExistingFlexControllers( CDmeGameModel *pGameModel ); + + // Fixup list of existing flex controller logs + // - reattach flex controls that were removed from the gamemodel's list + void FixupExistingFlexControlLogList( CDmeFilmClip *pCurrentClip, CDmeGameModel *pGameModel ); + + // Converts existing logs to balance/value if necessary while building the list + // Also deletes existing infrastructure (balance ops, channels, flex controller ops). + void BuildExistingFlexControlLogList( CDmeFilmClip *pCurrentClip, CDmeGameModel *pGameModel ); + + // Finds a desired flex controller index in the m_FlexControllerInfo array + int FindDesiredFlexController( const char *pFlexControllerName ) const; + + // Blows away the various elements trying to control a flex controller op + void CleanupExistingFlexController( CDmeGameModel *pGameModel, CDmeGlobalFlexControllerOperator *pOp ); + + // Finds a channels clip containing a particular channel + CDmeChannelsClip* FindChannelsClipContainingChannel( CDmeFilmClip *pClip, CDmeChannel *pSearch ); + + // Returns an existing mono log + void GetExistingMonoLog( ExistingLogInfo_t *pLog, CDmeFilmClip *pClip, CDmeGlobalFlexControllerOperator *pMonoOp ); + + // Returns an existing stereo log, performing conversion if necessary + void GetExistingStereoLog( ExistingLogInfo_t *pLogs, CDmeFilmClip *pClip, + CDmeGlobalFlexControllerOperator *pRightOp, CDmeGlobalFlexControllerOperator *pLeftOp ); + + // Returns an existing value/balance log + void GetExistingVBLog( ExistingLogInfo_t *pLogs, CDmeFilmClip *pClip, CDmeBalanceToStereoCalculatorOperator *pStereoOp ); + + // Converts an existing left/right log into a value/balance log + void ConvertExistingLRLogs( ExistingLogInfo_t *pLogs, CDmeFilmClip *pClip, CDmeChannel *pLeftChannel, CDmeChannel *pRightChannel ); + + // Computes a global offset and scale to convert from log time to global time + void ComputeChannelTimeTransform( DmeTime_t *pOffset, double *pScale, CDmeChannelsClip *pChannelsClip ); + bool ComputeChannelTimeTransform( DmeTime_t *pOffset, double *pScale, CDmeFilmClip* pClip, CDmeChannel* pChannel ); + + // Initializes the fields of a flex control + void InitializeFlexControl( ControlInfo_t &info ); + + // Creates all controls for flexes + void CreateFlexControls( CDmeAnimationSet *pAnimationSet ); + + // Build the infrastructure of the ops that connect that control to the dmegamemodel + void AttachControlsToGameModel( CDmeAnimationSet *pAnimationSet, CDmeGameModel *pGameModel, CDmeChannelsClip *pChannelsClip ); + + // Connects a mono control to a single flex controller op + void BuildFlexControllerOps( CDmeGameModel *pGameModel, CDmeChannelsClip *pChannelsClip, ControlInfo_t &info, ControlField_t field ); + + // Connects a stereo control to a two flex controller ops + void BuildStereoFlexControllerOps( CDmeAnimationSet *pAnimationSet, CDmeGameModel *pGameModel, CDmeChannelsClip *pChannelsClip, ControlInfo_t &info ); + + // Attaches existing logs and sets default values for logs + void SetupLogs( CDmeChannelsClip *pChannelsClip, bool bUseExistingLogs ); + + // Destination flex controllers + CUtlVector< FlexControllerInfo_t > m_FlexControllerInfo; + + // Destination controls + CUtlVector< ControlInfo_t > m_ControlInfo; + + CDmeFilmClip *m_pMovie; +}; + + +//----------------------------------------------------------------------------- +// Initialize default global flex controller +//----------------------------------------------------------------------------- +void SetupDefaultFlexController(); + + +#endif // FLEXCONTROLBUILDER_H |