7 #ifndef __pyfe_fe_math_h__ 8 #define __pyfe_fe_math_h__ 10 template<
class rawtype>
14 MathType(
void) { m_pRaw = &m_raw; }
15 virtual ~MathType(
void) { }
16 MathType(
const MathType<rawtype> &other)
19 *m_pRaw = *(other.m_pRaw);
22 MathType<rawtype> &operator=(
const MathType<rawtype> &other)
24 *m_pRaw = *(other.m_pRaw);
27 void assign(rawtype &raw) { m_pRaw = &raw; }
28 rawtype *rawptr(
void) {
return m_pRaw; }
29 rawtype *rawptr(
void)
const {
return m_pRaw; }
38 template<
class rawtype,
int N>
39 class MathArrayType :
public MathType<rawtype>
42 virtual ~MathArrayType(
void) { }
43 float getitem(
unsigned long index)
47 feX(fe::e_invalidRange,
49 "array index out of range");
51 return (*m_pRaw)[index];
53 void setitem(
unsigned long index,
float value)
57 feX(fe::e_invalidRange,
59 "array index out of range");
62 fe::setAt(*m_pRaw,index,value);
66 class Vector2f :
public MathArrayType<fe::Vector2f, 2>
71 Vector2f operator*(
const float &lhs,
const Vector2f &rhs)
74 *(r.rawptr()) = *(rhs.rawptr()) * lhs;
78 Vector2f operator*(
const Vector2f &lhs,
const float &rhs)
81 *(r.rawptr()) = *(lhs.rawptr()) * rhs;
85 Vector2f operator+(
const Vector2f &lhs,
const Vector2f &rhs)
88 *(r.rawptr()) = *(lhs.rawptr()) + *(rhs.rawptr());
92 Vector2f operator-(
const Vector2f &lhs,
const Vector2f &rhs)
95 *(r.rawptr()) = *(lhs.rawptr()) - *(rhs.rawptr());
99 class Vector3f :
public MathArrayType<fe::Vector3f, 3>
102 Vector3f cross(Vector3f &rhs)
105 fe::cross3(*(r.m_pRaw),*m_pRaw,*(rhs.m_pRaw));
108 float magnitude(
void)
110 return fe::magnitude(*m_pRaw);
112 Vector3f normalize(
void)
114 fe::normalize(*m_pRaw);
120 Vector3f operator*(
const float &lhs,
const Vector3f &rhs)
123 *(r.rawptr()) = *(rhs.rawptr()) * lhs;
127 Vector3f operator*(
const Vector3f &lhs,
const float &rhs)
130 *(r.rawptr()) = *(lhs.rawptr()) * rhs;
134 Vector3f operator+(
const Vector3f &lhs,
const Vector3f &rhs)
137 *(r.rawptr()) = *(lhs.rawptr()) + *(rhs.rawptr());
141 Vector3f operator-(
const Vector3f &lhs,
const Vector3f &rhs)
144 *(r.rawptr()) = *(lhs.rawptr()) - *(rhs.rawptr());
148 class Vector4f :
public MathArrayType<fe::Vector4f, 4>
151 Vector4f cross(Vector4f &rhs)
154 fe::cross3(*(r.m_pRaw),*m_pRaw,*(rhs.m_pRaw));
159 Vector4f operator*(
const float &lhs,
const Vector4f &rhs)
162 *(r.rawptr()) = *(rhs.rawptr()) * lhs;
166 Vector4f operator*(
const Vector4f &lhs,
const float &rhs)
169 *(r.rawptr()) = *(lhs.rawptr()) * rhs;
173 Vector4f operator+(
const Vector4f &lhs,
const Vector4f &rhs)
176 *(r.rawptr()) = *(lhs.rawptr()) + *(rhs.rawptr());
180 Vector4f operator-(
const Vector4f &lhs,
const Vector4f &rhs)
183 *(r.rawptr()) = *(lhs.rawptr()) - *(rhs.rawptr());