source-engine/game/shared/point_posecontroller.h
FluorescentCIAAfricanAmerican 3bf9df6b27 1
2020-04-22 12:56:21 -04:00

150 lines
4.6 KiB
C++

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