1 #ifndef IDLINEARMATHINTERFACE_HPP_
2 #define IDLINEARMATHINTERFACE_HPP_
6 #include "../IDConfig.hpp"
8 #include "../../LinearMath/btMatrix3x3.h"
9 #include "../../LinearMath/btVector3.h"
10 #include "../../LinearMath/btMatrixX.h"
11 #define BT_ID_HAVE_MAT3X
13 namespace btInverseDynamics
18 typedef btMatrixX<idScalar> matxx;
20 class vec3 : public btVector3
23 vec3() : btVector3() {}
24 vec3(const btVector3& btv) { *this = btv; }
25 idScalar& operator()(int i) { return (*this)[i]; }
26 const idScalar& operator()(int i) const { return (*this)[i]; }
27 int size() const { return 3; }
28 const vec3& operator=(const btVector3& rhs)
30 *static_cast<btVector3*>(this) = rhs;
35 class mat33 : public btMatrix3x3
38 mat33() : btMatrix3x3() {}
39 mat33(const btMatrix3x3& btm) { *this = btm; }
40 idScalar& operator()(int i, int j) { return (*this)[i][j]; }
41 const idScalar& operator()(int i, int j) const { return (*this)[i][j]; }
42 const mat33& operator=(const btMatrix3x3& rhs)
44 *static_cast<btMatrix3x3*>(this) = rhs;
47 friend mat33 operator*(const idScalar& s, const mat33& a);
48 friend mat33 operator/(const mat33& a, const idScalar& s);
51 inline mat33 operator/(const mat33& a, const idScalar& s) { return a * (1.0 / s); }
53 inline mat33 operator*(const idScalar& s, const mat33& a) { return a * s; }
55 class vecx : public btVectorX<idScalar>
58 vecx(int size) : btVectorX<idScalar>(size) {}
59 const vecx& operator=(const btVectorX<idScalar>& rhs)
61 *static_cast<btVectorX<idScalar>*>(this) = rhs;
65 idScalar& operator()(int i) { return (*this)[i]; }
66 const idScalar& operator()(int i) const { return (*this)[i]; }
68 friend vecx operator*(const vecx& a, const idScalar& s);
69 friend vecx operator*(const idScalar& s, const vecx& a);
71 friend vecx operator+(const vecx& a, const vecx& b);
72 friend vecx operator-(const vecx& a, const vecx& b);
73 friend vecx operator/(const vecx& a, const idScalar& s);
76 inline vecx operator*(const vecx& a, const idScalar& s)
78 vecx result(a.size());
79 for (int i = 0; i < result.size(); i++)
85 inline vecx operator*(const idScalar& s, const vecx& a) { return a * s; }
86 inline vecx operator+(const vecx& a, const vecx& b)
88 vecx result(a.size());
89 // TODO: error handling for a.size() != b.size()??
90 if (a.size() != b.size())
92 bt_id_error_message("size missmatch. a.size()= %d, b.size()= %d\n", a.size(), b.size());
95 for (int i = 0; i < a.size(); i++)
97 result(i) = a(i) + b(i);
103 inline vecx operator-(const vecx& a, const vecx& b)
105 vecx result(a.size());
106 // TODO: error handling for a.size() != b.size()??
107 if (a.size() != b.size())
109 bt_id_error_message("size missmatch. a.size()= %d, b.size()= %d\n", a.size(), b.size());
112 for (int i = 0; i < a.size(); i++)
114 result(i) = a(i) - b(i);
118 inline vecx operator/(const vecx& a, const idScalar& s)
120 vecx result(a.size());
121 for (int i = 0; i < result.size(); i++)
123 result(i) = a(i) / s;
129 // use btMatrixX to implement 3xX matrix
130 class mat3x : public matxx
134 mat3x(const mat3x& rhs)
136 matxx::resize(rhs.rows(), rhs.cols());
139 mat3x(int rows, int cols) : matxx(3, cols)
142 void operator=(const mat3x& rhs)
144 if (m_cols != rhs.m_cols)
146 bt_id_error_message("size missmatch, cols= %d but rhs.cols= %d\n", cols(), rhs.cols());
149 for (int i = 0; i < rows(); i++)
151 for (int k = 0; k < cols(); k++)
153 setElem(i, k, rhs(i, k));
163 inline vec3 operator*(const mat3x& a, const vecx& b)
166 if (a.cols() != b.size())
168 bt_id_error_message("size missmatch. a.cols()= %d, b.size()= %d\n", a.cols(), b.size());
174 for (int i = 0; i < b.size(); i++)
176 for (int k = 0; k < 3; k++)
178 result(k) += a(k, i) * b(i);
184 inline void resize(mat3x& m, idArrayIdx size)
190 inline void setMatxxElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, matxx* m)
192 m->setElem(row, col, val);
195 inline void setMat3xElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, mat3x* m)
197 m->setElem(row, col, val);
200 } // namespace btInverseDynamics
202 #endif // IDLINEARMATHINTERFACE_HPP_