37 void copy(
const SkelMat4&);
41 void MakeTranslate(
float,
float,
float);
42 void MakeXRotation(
float);
43 void MakeYRotation(
float);
44 void MakeZRotation(
float);
46 SkelMat4(
const float mat[3][3]);
52 SkelVec3 *XAxis()
const;
53 SkelVec3 *YAxis()
const;
54 SkelVec3 *ZAxis()
const;
57 operator float *()
const;
59 bool IsOrthonormal()
const;
62 float *operator[](
int index);
63 float *operator[](
int index)
const;
65 int CompareExact(
const SkelMat4& skel)
const;
67 void Sum(
const SkelMat4 &m1,
const SkelMat4 &m2);
68 void Difference(
const SkelMat4 &m1,
const SkelMat4 &m2);
69 void Multiply(
const SkelMat4 &m1,
const SkelMat4 &m2);
71 void RotateBy(
const SkelMat3 &m);
72 void RotateByInverse(
const SkelMat3 &m);
73 void RotateXAxis(
float x);
74 void RotateYAxis(
float y);
75 void RotateZAxis(
float z);
76 void RotateXAxis(
float,
float);
77 void RotateYAxis(
float,
float);
78 void RotateZAxis(
float,
float);
79 void MoveOnXAxis(
float x);
80 void MoveOnYAxis(
float y);
81 void MoveOnZAxis(
float z);
82 void TransformVector(
float *)
const;
84 void TransposeOf(
const SkelMat4 &m);
85 void TransposeRotOf(
const SkelMat4 &m);
86 void InverseRotOf(
const SkelMat4 &m);
87 float Determinant(
void);
89 void GetRotationMatrix(
float (*)[3])
const;
90 void GetRotationMatrix(
float (*)[4])
const;
91 void ReplacePos(
const float *);
92 void ReplaceRot(
const SkelMat3 &m);
93 void ReplaceRot(
const SkelMat4 &m);
94 void GetPos(
float *pos)
const;
95 void GetScale(
float *scale)
const;
96 void DeltaPos(
const SkelMat4 &m,
float *delta)
const;
97 void RotateYaw(
float,
float);
99 void GetQuat(SkelQuat& quat);
102inline SkelMat4::SkelMat4(
const float mat[3][3])
104 VectorCopy(mat[0], val[0]);
105 VectorCopy(mat[1], val[1]);
106 VectorCopy(mat[2], val[2]);
112inline SkelMat4::SkelMat4()
117inline void SkelMat4::copy(
const SkelMat4& m)
119 MatrixCopy(*m.val, *val);
122inline void SkelMat4::MakeIdentity()
124 memset(val, 0,
sizeof(val));
132 return (SkelVec3 *)&val[0];
137 return (SkelVec3 *)&val[1];
142 return (SkelVec3 *)&val[2];
145inline SkelVec3 *SkelMat4::XAxis()
const
147 return (SkelVec3 *)&val[0];
150inline SkelVec3 *SkelMat4::YAxis()
const
152 return (SkelVec3 *)&val[1];
155inline SkelVec3 *SkelMat4::ZAxis()
const
157 return (SkelVec3 *)&val[2];
160inline SkelMat4::operator
float *()
165inline SkelMat4::operator
float *()
const
167 return (
float *)&val[0][0];
170inline float *SkelMat4::operator[](
int index)
175inline float *SkelMat4::operator[](
int index)
const
177 return (
float *)val[index];
180inline bool SkelMat4::IsOrthonormal()
const
186inline bool SkelMat4::IsValid()
const
194 VectorAdd(m1.val[0], m2.val[0], val[0]);
195 VectorAdd(m1.val[1], m2.val[1], val[1]);
196 VectorAdd(m1.val[2], m2.val[2], val[2]);
201 VectorSubtract(m1.val[0], m2.val[0], val[0]);
202 VectorSubtract(m1.val[1], m2.val[1], val[1]);
203 VectorSubtract(m1.val[2], m2.val[2], val[2]);
208 val[0][0] = m1[0][0] * m2[0][0] + m1[0][1] * m2[1][0] + m1[0][2] * m2[2][0];
209 val[1][0] = m1[1][0] * m2[0][0] + m1[1][1] * m2[1][0] + m1[1][2] * m2[2][0];
210 val[2][0] = m1[2][0] * m2[0][0] + m1[2][1] * m2[1][0] + m1[2][2] * m2[2][0];
211 val[3][0] = m1[3][0] * m2[0][0] + m1[3][1] * m2[1][0] + m1[3][2] * m2[2][0] + m2[3][0];
213 val[0][1] = m1[0][0] * m2[0][1] + m1[0][1] * m2[1][1] + m1[0][2] * m2[2][1];
214 val[1][1] = m1[1][0] * m2[0][1] + m1[1][1] * m2[1][1] + m1[1][2] * m2[2][1];
215 val[2][1] = m1[2][0] * m2[0][1] + m1[2][1] * m2[1][1] + m1[2][2] * m2[2][1];
216 val[3][1] = m1[3][0] * m2[0][1] + m1[3][1] * m2[1][1] + m1[3][2] * m2[2][1] + m2[3][1];
218 val[0][2] = m1[0][0] * m2[0][2] + m1[0][1] * m2[1][2] + m1[0][2] * m2[2][2];
219 val[1][2] = m1[1][0] * m2[0][2] + m1[1][1] * m2[1][2] + m1[1][2] * m2[2][2];
220 val[2][2] = m1[2][0] * m2[0][2] + m1[2][1] * m2[1][2] + m1[2][2] * m2[2][2];
221 val[3][2] = m1[3][0] * m2[0][2] + m1[3][1] * m2[1][2] + m1[3][2] * m2[2][2] + m2[3][2];
224inline void SkelMat4::InvertAxis(
int a)
226 val[a][0] = -val[a][0];
227 val[a][1] = -val[a][1];
228 val[a][2] = -val[a][2];
231inline float SkelMat4::Determinant(
void)
235 mat4x4[0][0] = val[0][0];
236 mat4x4[0][1] = val[0][1];
237 mat4x4[0][2] = val[0][2];
239 mat4x4[1][0] = val[1][0];
240 mat4x4[1][1] = val[1][1];
241 mat4x4[1][2] = val[1][2];
243 mat4x4[2][0] = val[2][0];
244 mat4x4[2][1] = val[2][1];
245 mat4x4[2][2] = val[2][2];
247 mat4x4[3][0] = val[3][0];
248 mat4x4[3][1] = val[3][1];
249 mat4x4[3][2] = val[3][2];
253 * (mat4x4[1][1] * (mat4x4[2][2] * mat4x4[3][3] - mat4x4[2][3] * mat4x4[3][2])
254 - mat4x4[2][1] * (mat4x4[1][2] * mat4x4[3][3] - mat4x4[1][3] * mat4x4[3][2])
255 + mat4x4[3][1] * (mat4x4[1][2] * mat4x4[2][3] - mat4x4[1][3] * mat4x4[2][2]))
257 * (mat4x4[0][1] * (mat4x4[2][2] * mat4x4[3][3] - mat4x4[2][3] * mat4x4[3][2])
258 - mat4x4[2][1] * (mat4x4[0][2] * mat4x4[3][3] - mat4x4[0][3] * mat4x4[3][2])
259 + mat4x4[3][1] * (mat4x4[0][2] * mat4x4[2][3] - mat4x4[0][3] * mat4x4[2][2]))
261 * (mat4x4[0][1] * (mat4x4[1][2] * mat4x4[3][3] - mat4x4[1][3] * mat4x4[3][2])
262 - mat4x4[1][1] * (mat4x4[0][2] * mat4x4[3][3] - mat4x4[0][3] * mat4x4[3][2])
263 + mat4x4[3][1] * (mat4x4[0][2] * mat4x4[1][3] - mat4x4[0][3] * mat4x4[1][2]))
265 * (mat4x4[0][1] * (mat4x4[1][2] * mat4x4[2][3] - mat4x4[1][3] * mat4x4[2][2])
266 - mat4x4[1][1] * (mat4x4[0][2] * mat4x4[2][3] - mat4x4[0][3] * mat4x4[2][2])
267 + mat4x4[2][1] * (mat4x4[0][2] * mat4x4[1][3] - mat4x4[0][3] * mat4x4[1][2]));
270inline void SkelMat4::Inverse(
void)
273 float outmat4x4[4][4];
274 const float Det = Determinant();
276 mat4x4[0][0] = val[0][0];
277 mat4x4[0][1] = val[0][1];
278 mat4x4[0][2] = val[0][2];
280 mat4x4[1][0] = val[1][0];
281 mat4x4[1][1] = val[1][1];
282 mat4x4[1][2] = val[1][2];
284 mat4x4[2][0] = val[2][0];
285 mat4x4[2][1] = val[2][1];
286 mat4x4[2][2] = val[2][2];
288 mat4x4[3][0] = val[3][0];
289 mat4x4[3][1] = val[3][1];
290 mat4x4[3][2] = val[3][2];
296 VectorMatrixInverse(outmat4x4, mat4x4);
298 val[0][0] = outmat4x4[0][0];
299 val[0][1] = outmat4x4[0][1];
300 val[0][2] = outmat4x4[0][2];
301 val[1][0] = outmat4x4[1][0];
302 val[1][1] = outmat4x4[1][1];
303 val[1][2] = outmat4x4[1][2];
304 val[2][0] = outmat4x4[2][0];
305 val[2][1] = outmat4x4[2][1];
306 val[2][2] = outmat4x4[2][2];
307 val[3][0] = outmat4x4[3][0];
308 val[3][1] = outmat4x4[3][1];
309 val[3][2] = outmat4x4[3][2];
313inline void SkelMat4::RotateBy(
const SkelMat3& m)
315 SkelMat4 temp = *
this;
317 val[0][0] = temp[0][0] * m[0][0] + temp[0][1] * m[1][0] + temp[0][2] * m[2][0];
318 val[0][1] = temp[0][0] * m[0][1] + temp[0][1] * m[1][1] + temp[0][2] * m[2][1];
319 val[0][2] = temp[0][0] * m[0][2] + temp[0][1] * m[1][2] + temp[0][2] * m[2][2];
321 val[1][0] = temp[1][0] * m[0][0] + temp[1][1] * m[1][0] + temp[1][2] * m[2][0];
322 val[1][1] = temp[1][0] * m[0][1] + temp[1][1] * m[1][1] + temp[1][2] * m[2][1];
323 val[1][2] = temp[1][0] * m[0][2] + temp[1][1] * m[1][2] + temp[1][2] * m[2][2];
325 val[2][0] = temp[2][0] * m[0][0] + temp[2][1] * m[1][0] + temp[2][2] * m[2][0];
326 val[2][1] = temp[2][0] * m[0][1] + temp[2][1] * m[1][1] + temp[2][2] * m[2][1];
327 val[2][2] = temp[2][0] * m[0][2] + temp[2][1] * m[1][2] + temp[2][2] * m[2][2];
330inline void SkelMat4::RotateByInverse(
const SkelMat3& m)
335inline void SkelMat4::TransposeRotOf(
const SkelMat4& m)
337 val[0][0] = m.val[0][0];
338 val[0][1] = m.val[1][0];
339 val[0][2] = m.val[2][0];
340 val[1][0] = m.val[0][1];
341 val[1][1] = m.val[1][1];
342 val[1][2] = m.val[2][1];
343 val[2][0] = m.val[0][2];
344 val[2][1] = m.val[1][2];
345 val[2][2] = m.val[2][2];
348inline void SkelMat4::GetQuat(
SkelQuat& quat)
350 MatToQuat(val, (
float *)&quat);
Definition SkelMat3.h:192
Definition SkelMat4.h:355
Definition SkelQuat.h:274
Definition SkelVec3.h:197