mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-08 01:39:36 +00:00
1
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user