//====== Copyright © 1996-2004, Valve Corporation, All rights reserved. ======= // // Dme version of a game model (MDL) // //============================================================================= #ifndef DMEGAMEMODEL_H #define DMEGAMEMODEL_H #ifdef _WIN32 #pragma once #endif #include "movieobjects/dmedag.h" #include "movieobjects/dmeoperator.h" #include "datacache/imdlcache.h" #include "tier1/UtlDict.h" #include "toolframework/itoolframework.h" struct studiohdr_t; // Fixme, this might not be the best spot for this class IGlobalFlexController { public: virtual int FindGlobalFlexController( char const *name ) = 0; virtual char const *GetGlobalFlexControllerName( int idx ) = 0; }; class CDmeGameModel; // Mapping from name to dest index class CDmeGlobalFlexControllerOperator : public CDmeOperator { DEFINE_ELEMENT( CDmeGlobalFlexControllerOperator, CDmeOperator ); public: void SetGameModel( CDmeGameModel *gameModel ); virtual void Resolve(); virtual void Operate(); virtual void GetInputAttributes ( CUtlVector< CDmAttribute * > &attrs ); virtual void GetOutputAttributes( CUtlVector< CDmAttribute * > &attrs ); void SetWeight( float flWeight ); void SetMapping( int globalIndex ); void SetupToAttribute(); int GetGlobalIndex() const; virtual void OnAttributeChanged( CDmAttribute *pAttribute ); CDmaVar< float > m_flexWeight; CDmaElement< CDmeGameModel > m_gameModel; DmAttributeHandle_t m_ToAttributeHandle; private: int FindGlobalFlexControllerIndex() const; int m_nFlexControllerIndex; }; //----------------------------------------------------------------------------- // A class representing a game model //----------------------------------------------------------------------------- class CDmeGameModel : public CDmeDag { DEFINE_ELEMENT( CDmeGameModel, CDmeDag ); public: virtual void OnAttributeChanged( CDmAttribute *pAttribute ); void AddBone( CDmeTransform* pTransform ); void AddBones( studiohdr_t *pStudioHdr, int nFirstBone, int nCount ); void SetBone( uint index, const Vector& pos, const Quaternion& rot ); uint NumBones() const; CDmeTransform *GetBone( uint index ) const; int FindBone( CDmeTransform *pTransform ) const; void RemoveAllBones(); // A src bone transform transforms pre-compiled data (.dmx or .smd files, for example) // into post-compiled data (.mdl or .ani files) // Returns false if there is no transform (or if the transforms are identity) bool GetSrcBoneTransforms( matrix3x4_t *pPreTransform, matrix3x4_t *pPostTransform, int nBoneIndex ) const; bool GetBoneDefaultPosition( int nBoneIndex, Vector &position ) const; bool GetBoneDefaultOrientation( int nBoneIndex, Quaternion &orientation ) const; bool IsRootTransform( int nBoneIndex ) const; uint NumFlexWeights() const; const CUtlVector< float >& GetFlexWeights() const; // We drive these through the operators instead // void SetFlexWeights( uint nFlexWeights, const float* flexWeights ); void SetNumFlexWeights( uint nFlexWeights ); void SetFlexWeights( uint nFlexWeights, const float* flexWeights ); void SetSkin( int nSkin ); void SetBody( int nBody ); void SetSequence( int nSequence ); void SetFlags( int nFlags ); int GetSkin() const; int GetBody() const; int GetSequence() const; int GetFlags() const; const char *GetModelName() const; MDLHandle_t GetModelHandle(); CDmeGlobalFlexControllerOperator *AddGlobalFlexController( char const *controllerName, int globalIndex ); CDmeGlobalFlexControllerOperator *FindGlobalFlexController( int nGlobalIndex ); void RemoveGlobalFlexController( CDmeGlobalFlexControllerOperator *controller ); int NumGlobalFlexControllers() const; CDmeGlobalFlexControllerOperator *GetGlobalFlexController( int localIndex ); // localIndex is in order of calls to AddGlobalFlexController void AppendGlobalFlexControllerOperators( CUtlVector< IDmeOperator * >& list ); studiohdr_t* GetStudioHdr() const; void FindFlexControllerDependencies( CUtlVector< CUtlVector< int > > &dependencyList ) const; int FindAttachment( const char *pchAttachmentName ) const; Vector ComputeAttachmentPosition( const char *pchAttachmentName ) const; CDmeDag *CreateDagForAttachment( const char *pchAttachmentName ) const; void SetComputeBounds( bool bEnable ) { m_bComputeBounds = bEnable; } void SetEvaluateProceduralBones( bool bEnable ) { m_bEvaluateProceduralBones = bEnable; } bool ShouldComputeBounds() const { return m_bComputeBounds; } bool ShouldEvaluateProceduralBones() const { return m_bEvaluateProceduralBones; } public: protected: void PopulateExistingDagList( CDmeDag** pDags, int nCount ); void UpdateHMDL(); // This holds the operators which map to the m_flexWeights below CDmaElementArray< CDmeGlobalFlexControllerOperator > m_globalFlexControllers; CDmaArray< float > m_flexWeights; // These are global flex weights (so there can be gaps, unused indices) CDmaString m_modelName; CDmaVar< int > m_skin; CDmaVar< int > m_body; CDmaVar< int > m_sequence; CDmaVar< int > m_flags; CDmaVar< bool > m_bComputeBounds; CDmaVar< bool > m_bEvaluateProceduralBones; // this is different than m_Children - this is ALL transforms in the tree that are used by the model // m_Children holds the roots of that tree CDmaElementArray< CDmeTransform > m_bones; MDLHandle_t m_hMDL; bool m_bHMDLDirty; }; //----------------------------------------------------------------------------- // A class representing a game sprite //----------------------------------------------------------------------------- class CDmeGameSprite : public CDmeDag { DEFINE_ELEMENT( CDmeGameSprite, CDmeDag ); public: const char *GetModelName() const; float GetScale() const; float GetFrame() const; int GetRenderMode() const; int GetRenderFX() const; const Color &GetColor() const; float GetProxyRadius() const; void SetState( bool bVisible, float nFrame, int nRenderMode, int nRenderFX, float flRenderScale, float flProxyRadius, const Vector &pos, const Quaternion &rot, const Color &color ); protected: CDmaString m_modelName; CDmaVar< float > m_frame; CDmaVar< int > m_rendermode; CDmaVar< int > m_renderfx; CDmaVar< float > m_renderscale; CDmaVar< Color > m_color; CDmaVar< float > m_proxyRadius; }; //----------------------------------------------------------------------------- // A class representing a game portal //----------------------------------------------------------------------------- class CDmeGamePortal : public CDmeDag { DEFINE_ELEMENT( CDmeGamePortal, CDmeDag ); public: CDmaVar< int > m_nPortalId; CDmaVar< int > m_nLinkedPortalId; CDmaVar< float > m_flStaticAmount; CDmaVar< float > m_flSecondaryStaticAmount; CDmaVar< float > m_flOpenAmount; CDmaVar< float > m_flHalfWidth; CDmaVar< float > m_flHalfHeight; CDmaVar< bool > m_bIsPortal2; CDmaString m_PortalType; }; #endif // DMEGAMEMODEL_H