//========= 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