summaryrefslogtreecommitdiff
path: root/public/sfmobjects/flexcontrolbuilder.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /public/sfmobjects/flexcontrolbuilder.h
downloadarchived-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.h179
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