125 lines
3.6 KiB
C++
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
|