diff options
Diffstat (limited to 'game/shared/point_posecontroller.h')
| -rw-r--r-- | game/shared/point_posecontroller.h | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/game/shared/point_posecontroller.h b/game/shared/point_posecontroller.h new file mode 100644 index 0000000..2e11bc5 --- /dev/null +++ b/game/shared/point_posecontroller.h @@ -0,0 +1,150 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Controls the pose parameters of a model +// +//===========================================================================// + + +#define MAX_POSE_CONTROLLED_PROPS 4 // Number of entities by the same name that can be controlled + + +// Type of frequency modulations +enum PoseController_FModType_t +{ + POSECONTROLLER_FMODTYPE_NONE = 0, + POSECONTROLLER_FMODTYPE_SINE, + POSECONTROLLER_FMODTYPE_SQUARE, + POSECONTROLLER_FMODTYPE_TRIANGLE, + POSECONTROLLER_FMODTYPE_SAWTOOTH, + POSECONTROLLER_FMODTYPE_NOISE, + + POSECONTROLLER_FMODTYPE_TOTAL, +}; + + +#ifndef CLIENT_DLL +//----------------------------------------------------------------------------- +// SERVER CLASS +//----------------------------------------------------------------------------- + +#include "baseentity.h" + + +class CPoseController : public CBaseEntity +{ +public: + DECLARE_CLASS( CPoseController, CBaseEntity ); + DECLARE_SERVERCLASS(); + DECLARE_DATADESC(); + + virtual void Spawn( void ); + + void Think( void ); + + void BuildPropList( void ); + void BuildPoseIndexList( void ); + void SetPoseIndex( int i, int iValue ); + void SetCurrentPose( float fCurrentPoseValue ); + + float GetPoseValue( void ); + + void SetProp( CBaseAnimating *pProp ); + void SetPropName( const char *pName ); + void SetPoseParameterName( const char *pName ); + void SetPoseValue( float fValue ); + void SetInterpolationTime( float fValue ); + void SetInterpolationWrap( bool bWrap ); + void SetCycleFrequency( float fValue ); + void SetFModType( int nType ); + void SetFModTimeOffset( float fValue ); + void SetFModRate( float fValue ); + void SetFModAmplitude( float fValue ); + void RandomizeFMod( float fExtremeness ); + + // Input handlers + void InputSetPoseParameterName( inputdata_t &inputdata ); + void InputSetPoseValue( inputdata_t &inputdata ); + void InputSetInterpolationTime( inputdata_t &inputdata ); + void InputSetCycleFrequency( inputdata_t &inputdata ); + void InputSetFModType( inputdata_t &inputdata ); + void InputSetFModTimeOffset( inputdata_t &inputdata ); + void InputSetFModRate( inputdata_t &inputdata ); + void InputSetFModAmplitude( inputdata_t &inputdata ); + void InputRandomizeFMod( inputdata_t &inputdata ); + void InputGetFMod( inputdata_t &inputdata ); + +private: + + CNetworkArray( EHANDLE, m_hProps, MAX_POSE_CONTROLLED_PROPS ); // Handles to controlled models + CNetworkArray( unsigned char, m_chPoseIndex, MAX_POSE_CONTROLLED_PROPS ); // Pose parameter indices for each model + + bool m_bDisablePropLookup; + + CNetworkVar( bool, m_bPoseValueParity ); + + string_t m_iszPropName; // Targetname of the models to control + string_t m_iszPoseParameterName; // Pose parameter name to control + + CNetworkVar( float, m_fPoseValue ); // Normalized pose parameter value (maps to each pose parameter's min and max range) + CNetworkVar( float, m_fInterpolationTime ); // Interpolation speed for client matching absolute pose values + CNetworkVar( bool, m_bInterpolationWrap ); // Interpolation for the client wraps 0 to 1. + + CNetworkVar( float, m_fCycleFrequency ); // Cycles per second + + // Frequency modulation variables + CNetworkVar( PoseController_FModType_t, m_nFModType ); + CNetworkVar( float, m_fFModTimeOffset ); + CNetworkVar( float, m_fFModRate ); + CNetworkVar( float, m_fFModAmplitude ); +}; + + +#else //#ifndef CLIENT_DLL +//----------------------------------------------------------------------------- +// CLIENT CLASS +//----------------------------------------------------------------------------- + +#include "c_baseentity.h" +#include "fx_interpvalue.h" + + +class C_PoseController : public C_BaseEntity +{ +public: + DECLARE_CLASS( C_PoseController, C_BaseEntity ); + DECLARE_CLIENTCLASS(); + + virtual void Spawn( void ); + virtual void OnDataChanged( DataUpdateType_t updateType ); + + virtual void ClientThink( void ); + +private: + + void UpdateModulation( void ); + void UpdatePoseCycle( float fCycleAmount ); + void SetCurrentPose( float fCurrentPoseValue ); + + + // Networked variables + EHANDLE m_hProps[MAX_POSE_CONTROLLED_PROPS]; + unsigned char m_chPoseIndex[MAX_POSE_CONTROLLED_PROPS]; + bool m_bPoseValueParity; + float m_fPoseValue; + float m_fInterpolationTime; + bool m_bInterpolationWrap; + float m_fCycleFrequency; + PoseController_FModType_t m_nFModType; + float m_fFModTimeOffset; + float m_fFModRate; + float m_fFModAmplitude; + bool m_bOldPoseValueParity; + + float m_fCurrentPoseValue; // Actual pose value cycled by the frequency and modulation + float m_fCurrentFMod; // The current fequency modulation amount (stored for noise walk) + + CInterpolatedValue m_PoseTransitionValue; +}; + + +#endif //#ifndef CLIENT_DLL
\ No newline at end of file |