You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
4.6 KiB
150 lines
4.6 KiB
//========= 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
|