This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
nekohook/modules/source2013/sdk/game/shared/expressionsample.h
2020-08-04 13:13:01 -04:00

125 lines
3.6 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef EXPRESSIONSAMPLE_H
#define EXPRESSIONSAMPLE_H
#ifdef _WIN32
#pragma once
#endif
#include "interpolatortypes.h"
class CUtlBuffer;
class ISceneTokenProcessor;
class IChoreoStringPool;
#pragma pack(1)
struct EdgeInfo_t {
EdgeInfo_t()
: m_bActive(false), m_CurveType(CURVE_DEFAULT), m_flZeroPos(0.0f) {}
bool m_bActive;
unsigned short m_CurveType;
float m_flZeroPos;
};
struct CExpressionSample {
CExpressionSample() : value(0.0f), time(0.0f) {
selected = 0;
m_curvetype = CURVE_DEFAULT;
}
void SetCurveType(int curveType) { m_curvetype = curveType; }
int GetCurveType() const { return m_curvetype; }
// Height
float value;
// time from start of event
float time;
unsigned short selected : 1;
private:
unsigned short m_curvetype : 15;
};
#pragma pack()
//-----------------------------------------------------------------------------
// Purpose: Provides generic access to scene or event ramp data
//-----------------------------------------------------------------------------
class ICurveDataAccessor {
public:
virtual ~ICurveDataAccessor() {}
virtual float GetDuration() = 0;
virtual bool CurveHasEndTime() = 0; // only matters for events
virtual int GetDefaultCurveType() = 0;
};
//-----------------------------------------------------------------------------
// Purpose: The generic curve data
//-----------------------------------------------------------------------------
class CCurveData {
public:
int GetCount(void);
CExpressionSample *Get(int index);
CExpressionSample *Add(float time, float value, bool selected);
void Delete(int index);
void Clear(void);
void Resort(ICurveDataAccessor *data);
EdgeInfo_t *GetEdgeInfo(int idx);
void SetEdgeInfo(bool leftEdge, int curveType, float zero);
void GetEdgeInfo(bool leftEdge, int &curveType, float &zero) const;
void SetEdgeActive(bool leftEdge, bool state);
bool IsEdgeActive(bool leftEdge) const;
int GetEdgeCurveType(bool leftEdge) const;
float GetEdgeZeroValue(bool leftEdge) const;
void RemoveOutOfRangeSamples(ICurveDataAccessor *data);
void SaveToBuffer(CUtlBuffer &buf, IChoreoStringPool *pStringPool);
bool RestoreFromBuffer(CUtlBuffer &buf, IChoreoStringPool *pStringPool);
void Parse(ISceneTokenProcessor *tokenizer, ICurveDataAccessor *data);
void FileSave(CUtlBuffer &buf, int level, const char *name);
float GetIntensity(ICurveDataAccessor *data, float time);
CExpressionSample *GetBoundedSample(ICurveDataAccessor *data, int number,
bool &bClamped);
CCurveData &operator=(const CCurveData &src) {
// Copy ramp over
m_Ramp.RemoveAll();
int i;
for (i = 0; i < src.m_Ramp.Count(); i++) {
CExpressionSample sample = src.m_Ramp[i];
CExpressionSample *newSample =
Add(sample.time, sample.value, sample.selected);
newSample->SetCurveType(sample.GetCurveType());
}
m_RampEdgeInfo[0] = src.m_RampEdgeInfo[0];
m_RampEdgeInfo[1] = src.m_RampEdgeInfo[1];
return *this;
};
private:
CUtlVector<CExpressionSample> m_Ramp;
EdgeInfo_t m_RampEdgeInfo[2];
public:
float GetIntensityArea(ICurveDataAccessor *data, float time);
private:
void UpdateIntensityArea(ICurveDataAccessor *data);
CUtlVector<float> m_RampAccumulator;
};
#endif // EXPRESSIONSAMPLE_H