1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
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
|