//====== Copyright © 1996-2008, Valve Corporation, All rights reserved. ======= // // Purpose: // //============================================================================= #ifndef SFMRIGBUILDCONTEXT_H #define SFMRIGBUILDCONTEXT_H #ifdef _WIN32 #pragma once #endif #include "movieobjects/dmerigconstraintoperators.h" #include "movieobjects/dmelog.h" #include "studio.h" #include "tier1/utldict.h" class CDmeAnimationSet; class CDmeFilmClip; class CDmeClip; class CDmeRigHandle; class CDmeChannelsClip; class CDmeGameModel; class CRigBuildContext { public: enum { DESC_SKELETON = (1<<0), DESC_RIG = (1<<1), DESC_CONSTRAINTS = (1<<2), DESC_ALL = DESC_SKELETON | DESC_RIG | DESC_CONSTRAINTS, }; enum eRigBuildContextType { RBC_ATTACH = 0, RBC_DETACH, }; explicit CRigBuildContext( eRigBuildContextType type, CDmeAnimationSet *pAnimSet, CDmeFilmClip *pShot, CDmeClip *pMovie ); ~CRigBuildContext(); bool IsValid(); CDmeRigHandle *FindRigHandle( char const *pchHandleName ); CDmeRigHandle *CreateRigHandle( char const *pchHandleName, char const *pchRigSubGroup, const Vector &p, const Quaternion &q ); CDmeRigBaseConstraintOperator *FindOrAddConstraintTypeForObject( bool *pbUpdatingHandles, EConstraintType eType, char const *pchObjectName, char const *pchConstraintName, const DmFileId_t &fileId ); void CreateWeightChannels( CDmeRigBaseConstraintOperator *pConstraint, int nCount, CDmeDag *const pRigHandles[] ); Vector GetBonePosition( char const *pchBoneName ) const; CDmeDag *FindBone( const char *pchBoneName ) const; void SetRigName( char const *pchRigName ); void Describe( int flags ); void DisconnectBoneChannel( CUtlVector< CDmeChannel * > &list, int boneIndex, CDmeDag *pBone, EConstraintType eType ); void AttachHandleToBone( CDmeRigHandle *pRigHandle, CDmeDag *pBone ) const; // Creates a new set of bone channels for the "detached" bone void PerformDetach(); void FinishAttach(); protected: CDmeRigBaseConstraintOperator *InstanceConstraint( EConstraintType eType, char const *pchName, const DmFileId_t &fileId ); void CreateRigHandleChannels( CDmeChannel *list[ 2 ], CDmeChannelsClip *pChannelsClip, CDmeRigHandle *pHandle ); CDmElement *CreateRigAnimationSetControl( CDmeAnimationSet *pAnimSet, CDmeDag *pDag, CDmeChannel *pDagChannel, int controlType ); void AddControlToAnimationSetRig( CDmeAnimationSet *pAnimSet, char const *pchGroupName, char const *pchControlGroupName, char const *pchControlName ); CDmeChannelsClip* CreateChannelsClip(); void CreateTransformChannels( CDmeDag *pDag, const char* baseName, CDmeChannelsClip *pChannelsClip ); void DescribeSkeleton(); void DescribeRig(); void DescribeConstraints(); void DescribeSkeleton_R( int depth, CDmeDag *bone ); void DescribeOperatorsForDag( int depth, CDmeDag *pDag ); CDmeChannel *DisconnectBoneChannel( CDmeDag *pBone, char const *pchTargetAttribute ); void DetachAddBoneChannelsToChannelsClip( CUtlVector< CDmeChannel * > &boneChannels ); void DetachCreateBoneChannels( CStudioHdr &hdr, CUtlVector< CDmeChannel * > &boneChannels ); void DetachGatherAllOperators( CUtlRBTree< CDmeOperator * > &operators ); void AttachInit(); void DetachInit(); CDmeDag *FindSceneRoot(); void InsertSubHandles_R( CDmeRigHandle *pRoot ); void FindChannelsForDag( CDmeDag* pDagNode, CUtlRBTree< CDmeOperator * > &operators ); void FindBoneChannels_R( CDmeDag *bone, CUtlRBTree< CDmeOperator * > &operators ); void FindBoneChannels( CUtlRBTree< CDmeOperator * > &operators ); void FindRigHandleChannels( CUtlRBTree< CDmeOperator * > &operators ); public: bool m_bValid; int m_nRigNumber; DmeLog_TimeSelection_t m_timeSelection; CDmeHandle< CDmeAnimationSet > m_hAnimationSet; CDmeHandle< CDmeFilmClip > m_hShot; CDmeHandle< CDmeClip > m_hMovie; CDmeHandle< CDmeGameModel > m_hGameModel; CDmeHandle< CDmeDag > m_hRigSceneRoot; CDmeHandle< CDmeChannelsClip > m_hDstChannelsClip; const CStudioHdr *m_pStudioHdr; matrix3x4_t m_ReferencePoseBoneToWorld[ MAXSTUDIOBONES ]; CUtlVector< CDmeChannel * > m_DetachChannels; CUtlDict< CDmeHandle< CDmeRigHandle >, short > m_RigHandles; CUtlVector< CDmeHandle< CDmeRigBaseConstraintOperator > > m_Constraints; }; #endif // SFMRIGBUILDCONTEXT_H