#ifndef _Transform_h_
#define _Transform_h_
ZString GetString(int indent, const Matrix& mat);
ZString GetString(int indent, const Matrix2& mat);
ZString GetFunctionName(const Matrix& value);
void Write(IMDLBinaryFile* pmdlFile, const Matrix& value);
class Transform : public TStaticValue<Matrix> {
protected:
Transform(Value* pvalue0) :
TStaticValue<Matrix>(pvalue0)
{
}
Transform(Value* pvalue0, Value* pvalue1) :
TStaticValue<Matrix>(pvalue0, pvalue1)
{
}
TRef<Value> Fold();
public:
Transform() :
TStaticValue<Matrix>(Matrix::GetIdentity())
{
}
Transform(const Matrix& mat) :
TStaticValue<Matrix>(mat)
{
}
bool IsIdentity();
DefineCastMember(Transform);
};
class MatrixTransform : public Transform {
public:
MatrixTransform(const Matrix& mat) :
Transform(mat)
{
}
void SetValue(const Matrix& mat)
{
GetValueInternal() = mat;
}
ZString GetString(int indent)
{
return "MatrixTransform(" + ::GetString(indent, GetValue()) +")";
}
};
class Transform2 : public TStaticValue<Matrix2> {
protected:
Transform2(const Matrix2& mat) :
TStaticValue<Matrix2>(mat)
{
}
Transform2() :
TStaticValue<Matrix2>(Matrix2::GetIdentity())
{
}
Transform2(Value* pvalue0) :
TStaticValue<Matrix2>(pvalue0)
{
}
Transform2(Value* pvalue0, Value* pvalue1) :
TStaticValue<Matrix2>(pvalue0, pvalue1)
{
}
public:
DefineCastMember(Transform2);
};
class MatrixTransform2 : public Transform2 {
public:
MatrixTransform2(const Matrix2& mat) :
Transform2(mat)
{
}
void SetValue(const Matrix2& mat)
{
GetValueInternal() = mat;
}
ZString GetString(int indent)
{
return "MatrixTransform2(" + ::GetString(indent, GetValue()) +")";
}
};
Transform* GetIdentityTransform();
Transform2* GetIdentityTransform2();
class TranslateTransform : public Transform {
private:
Vector m_vec;
void Evaluate();
public:
TranslateTransform(const Vector& vec);
void SetVector(const Vector& vec);
const Vector& GetVector() { return m_vec; }
};
class TranslateTransform2 : public Transform2 {
private:
void Evaluate();
public:
TranslateTransform2(PointValue* ppoint);
PointValue* GetTranslate() { return PointValue::Cast(GetChild(0)); }
void SetTranslate(PointValue* ppoint);
void SetTranslate(const Point& vec);
ZString GetFunctionName() { return "TranslateTransform2"; }
};
class ScaleTransform2 : public Transform2 {
private:
void Evaluate();
public:
ScaleTransform2(PointValue* ppoint);
PointValue* GetScale() { return PointValue::Cast(GetChild(0)); }
void SetScale(PointValue* ppoint);
void SetScale(const Point& vec);
ZString GetFunctionName() { return "ScaleTransform2"; }
};
class RotateTransform2 : public Transform2 {
private:
void Evaluate();
public:
RotateTransform2(Number* pangle);
Number* GetAngle() { return Number::Cast(GetChild(0)); }
void SetAngle(Number* pangle);
void SetAngle(float angle);
ZString GetFunctionName() { return "RotateTransform2"; }
};
class RotateTransform : public Transform {
private:
Vector m_axis;
float m_angle;
void Evaluate();
public:
RotateTransform(const Vector& axis, float angle);
void SetAngle(float angle);
void SetAxis(const Vector& axis);
float GetAngle() { return m_angle; }
const Vector& GetAxis() { return m_axis; }
ZString GetFunctionName() { return "RotateTransform"; }
};
class ScaleTransform : public Transform {
private:
Vector m_vec;
void Evaluate();
public:
ScaleTransform(float scale);
ScaleTransform(const Vector& vec);
void SetScale(float scale);
float GetScale() { return m_vec.X(); }
ZString GetFunctionName() { return "ScaleTransform"; }
};
class ComponentTransform : public Transform {
private:
float m_scale;
Vector m_vecPos;
Vector m_vecForward;
Vector m_vecUp;
void Evaluate();
public:
ComponentTransform();
ComponentTransform(
const Vector& vecPos,
const Vector& vecForward,
const Vector& vecUp,
float scale
);
virtual void SetOrientation(const Orientation& o);
virtual void SetScale(float scale);
virtual void SetPosition(const Vector& position);
Vector GetPosition() { return m_vecPos; }
Vector GetForward() { return m_vecForward; }
Vector GetUp() { return m_vecUp; }
float GetScale() { return m_scale; }
ZString GetFunctionName() { return "ComponentTransform"; }
};
class AnimateRotateTransform : public Transform {
private:
void Evaluate();
public:
AnimateRotateTransform(VectorValue* paxis, Number* pangle) :
Transform(paxis, pangle)
{
}
void SetAxis(VectorValue* pvalue) { SetChild(0, pvalue); }
void SetAngle( Number* pvalue) { SetChild(1, pvalue); }
VectorValue* GetAxis() { return VectorValue::Cast(GetChild(0)); }
Number* GetAngle() { return Number::Cast(GetChild(1)); }
ZString GetFunctionName() { return "AnimateRotateTransform"; }
};
#endif