148 lines
4.9 KiB
C++
148 lines
4.9 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
|