143 lines
4.2 KiB
C++
143 lines
4.2 KiB
C++
#ifndef N_VECTOR3_ENVELOPE_CURVE_H
|
|
#define N_VECTOR3_ENVELOPE_CURVE_H
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
simple modulation function for float3's.
|
|
@author
|
|
- RadonLabs GmbH
|
|
@since
|
|
- 2005.7.06
|
|
@remarks
|
|
- Áö¿Ï Ãß°¡
|
|
*/
|
|
|
|
#include "nmath.h"
|
|
#include "vector.h"
|
|
|
|
class nVector3EnvelopeCurve
|
|
{
|
|
public:
|
|
/// constructor 1
|
|
nVector3EnvelopeCurve();
|
|
/// constructor 2
|
|
nVector3EnvelopeCurve(const vector3& keyFrameValue0, const vector3& keyFrameValue1,
|
|
const vector3& keyFrameValue2, const vector3& keyFrameValue3,
|
|
const float keyFramePos1, const float keyFramePos2);
|
|
// set all parameters
|
|
void SetParameters(const vector3& keyFrameValue0, const vector3& keyFrameValue1,
|
|
const vector3& keyFrameValue2, const vector3& keyFrameValue3,
|
|
const float keyFramePos1, const float keyFramePos2);
|
|
// assign to other color envelope curve
|
|
void SetParameters(const nVector3EnvelopeCurve& src);
|
|
/// get the function value; pos must be between 0 and 1
|
|
const vector3& GetValue(float pos) const;
|
|
|
|
enum
|
|
{
|
|
NumValues = 4,
|
|
};
|
|
|
|
vector3 keyFrameValues[NumValues];
|
|
float keyFramePos1, keyFramePos2; // 0 through 1
|
|
float frequency, amplitude; // parameters of the sinus function
|
|
};
|
|
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
inline
|
|
nVector3EnvelopeCurve::nVector3EnvelopeCurve() :
|
|
keyFramePos1(.2f),
|
|
keyFramePos2(.8f)
|
|
{
|
|
keyFrameValues[0] = vector3(1.0f, 1.0f, 1.0f);
|
|
keyFrameValues[1] = vector3(1.0f, 1.0f, 1.0f);
|
|
keyFrameValues[2] = vector3(1.0f, 1.0f, 1.0f);
|
|
keyFrameValues[3] = vector3(1.0f, 1.0f, 1.0f);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
inline
|
|
nVector3EnvelopeCurve::nVector3EnvelopeCurve(const vector3& keyFrameValue0,
|
|
const vector3& keyFrameValue1, const vector3& keyFrameValue2,
|
|
const vector3& keyFrameValue3, const float keyFramePos1,
|
|
const float keyFramePos2) :
|
|
keyFramePos1(keyFramePos1),
|
|
keyFramePos2(keyFramePos2)
|
|
{
|
|
this->keyFrameValues[0] = keyFrameValue0;
|
|
this->keyFrameValues[1] = keyFrameValue1;
|
|
this->keyFrameValues[2] = keyFrameValue2;
|
|
this->keyFrameValues[3] = keyFrameValue3;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
inline
|
|
void
|
|
nVector3EnvelopeCurve::SetParameters(const vector3& keyFrameValue0, const vector3& keyFrameValue1,
|
|
const vector3& keyFrameValue2, const vector3& keyFrameValue3,
|
|
const float keyFramePos1, const float keyFramePos2)
|
|
{
|
|
this->keyFrameValues[0] = keyFrameValue0;
|
|
this->keyFrameValues[1] = keyFrameValue1;
|
|
this->keyFrameValues[2] = keyFrameValue2;
|
|
this->keyFrameValues[3] = keyFrameValue3;
|
|
this->keyFramePos1 = keyFramePos1;
|
|
this->keyFramePos2 = keyFramePos2;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
inline
|
|
void
|
|
nVector3EnvelopeCurve::SetParameters(const nVector3EnvelopeCurve& src)
|
|
{
|
|
this->keyFrameValues[0] = src.keyFrameValues[0];
|
|
this->keyFrameValues[1] = src.keyFrameValues[1];
|
|
this->keyFrameValues[2] = src.keyFrameValues[2];
|
|
this->keyFrameValues[3] = src.keyFrameValues[3];
|
|
this->keyFramePos1 = src.keyFramePos1;
|
|
this->keyFramePos2 = src.keyFramePos2;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
/**
|
|
*/
|
|
inline
|
|
const vector3&
|
|
nVector3EnvelopeCurve::GetValue(float pos) const
|
|
{
|
|
ASSERT(pos >= 0.0);
|
|
ASSERT(pos <= 1.0);
|
|
|
|
static vector3 linearValue;
|
|
|
|
if (pos < this->keyFramePos1)
|
|
{
|
|
linearValue = this->keyFrameValues[1];
|
|
linearValue.lerp(this->keyFrameValues[0],
|
|
(pos / this->keyFramePos1));
|
|
}
|
|
else if (pos < this->keyFramePos2)
|
|
{
|
|
linearValue = this->keyFrameValues[2];
|
|
linearValue.lerp(this->keyFrameValues[1],
|
|
(pos-this->keyFramePos1) / (this->keyFramePos2-this->keyFramePos1));
|
|
}
|
|
else
|
|
{
|
|
linearValue = this->keyFrameValues[3];
|
|
linearValue.lerp(this->keyFrameValues[2],
|
|
(pos-this->keyFramePos2) / (1.0f-this->keyFramePos2));
|
|
}
|
|
|
|
return linearValue;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
#endif
|