//========= 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