23 #include "precompiled.h"
51 2/(r-l), 0, 0, -(r+l)/(r-l),
52 0, 2/(t-b), 0, -(t+b)/(t-b),
53 0, 0, -2/(f-n), -(f+n)/(f-n),
63 const float Cos = cosf (angle);
64 const float Sin = sinf (angle);
74 const float Cos = cosf (angle);
75 const float Sin = sinf (angle);
85 const float Cos = cosf (angle);
86 const float Sin = sinf (angle);
99 const float Cos = cosf (angle);
100 const float Sin = sinf (angle);
101 const float tmp_21 =
_21;
102 const float tmp_22 =
_22;
103 const float tmp_23 =
_23;
104 const float tmp_24 =
_24;
111 _31 = Sin * tmp_21 + Cos *
_31;
112 _32 = Sin * tmp_22 + Cos *
_32;
113 _33 = Sin * tmp_23 + Cos *
_33;
114 _34 = Sin * tmp_24 + Cos *
_34;
119 const float Cos = cosf (angle);
120 const float Sin = sinf (angle);
121 const float tmp_11 =
_11;
122 const float tmp_12 =
_12;
123 const float tmp_13 =
_13;
124 const float tmp_14 =
_14;
131 _31 = -Sin * tmp_11 + Cos *
_31;
132 _32 = -Sin * tmp_12 + Cos *
_32;
133 _33 = -Sin * tmp_13 + Cos *
_33;
134 _34 = -Sin * tmp_14 + Cos *
_34;
139 const float Cos = cosf (angle);
140 const float Sin = sinf (angle);
141 const float tmp_11 =
_11;
142 const float tmp_12 =
_12;
143 const float tmp_13 =
_13;
144 const float tmp_14 =
_14;
151 _21 = Sin * tmp_11 + Cos *
_21;
152 _22 = Sin * tmp_12 + Cos *
_22;
153 _23 = Sin * tmp_13 + Cos *
_23;
154 _24 = Sin * tmp_14 + Cos *
_24;
284 for (
int i = 0; i < 4; ++i) {
286 src[i + 4] =
_data[i*4 + 1];
287 src[i + 8] =
_data[i*4 + 2];
288 src[i + 12] =
_data[i*4 + 3];
292 tmp[0] = src[10] * src[15];
293 tmp[1] = src[11] * src[14];
294 tmp[2] = src[9] * src[15];
295 tmp[3] = src[11] * src[13];
296 tmp[4] = src[9] * src[14];
297 tmp[5] = src[10] * src[13];
298 tmp[6] = src[8] * src[15];
299 tmp[7] = src[11] * src[12];
300 tmp[8] = src[8] * src[14];
301 tmp[9] = src[10] * src[12];
302 tmp[10] = src[8] * src[13];
303 tmp[11] = src[9] * src[12];
306 dst.
_data[0] = (tmp[0]-tmp[1])*src[5] + (tmp[3]-tmp[2])*src[6] + (tmp[4]-tmp[5])*src[7];
307 dst.
_data[1] = (tmp[1]-tmp[0])*src[4] + (tmp[6]-tmp[7])*src[6] + (tmp[9]-tmp[8])*src[7];
308 dst.
_data[2] = (tmp[2]-tmp[3])*src[4] + (tmp[7]-tmp[6])*src[5] + (tmp[10]-tmp[11])*src[7];
309 dst.
_data[3] = (tmp[5]-tmp[4])*src[4] + (tmp[8]-tmp[9])*src[5] + (tmp[11]-tmp[10])*src[6];
310 dst.
_data[4] = (tmp[1]-tmp[0])*src[1] + (tmp[2]-tmp[3])*src[2] + (tmp[5]-tmp[4])*src[3];
311 dst.
_data[5] = (tmp[0]-tmp[1])*src[0] + (tmp[7]-tmp[6])*src[2] + (tmp[8]-tmp[9])*src[3];
312 dst.
_data[6] = (tmp[3]-tmp[2])*src[0] + (tmp[6]-tmp[7])*src[1] + (tmp[11]-tmp[10])*src[3];
313 dst.
_data[7] = (tmp[4]-tmp[5])*src[0] + (tmp[9]-tmp[8])*src[1] + (tmp[10]-tmp[11])*src[2];
316 tmp[0] = src[2]*src[7];
317 tmp[1] = src[3]*src[6];
318 tmp[2] = src[1]*src[7];
319 tmp[3] = src[3]*src[5];
320 tmp[4] = src[1]*src[6];
321 tmp[5] = src[2]*src[5];
322 tmp[6] = src[0]*src[7];
323 tmp[7] = src[3]*src[4];
324 tmp[8] = src[0]*src[6];
325 tmp[9] = src[2]*src[4];
326 tmp[10] = src[0]*src[5];
327 tmp[11] = src[1]*src[4];
330 dst.
_data[8] = (tmp[0]-tmp[1])*src[13] + (tmp[3]-tmp[2])*src[14] + (tmp[4]-tmp[5])*src[15];
331 dst.
_data[9] = (tmp[1]-tmp[0])*src[12] + (tmp[6]-tmp[7])*src[14] + (tmp[9]-tmp[8])*src[15];
332 dst.
_data[10] = (tmp[2]-tmp[3])*src[12] + (tmp[7]-tmp[6])*src[13] + (tmp[10]-tmp[11])*src[15];
333 dst.
_data[11] = (tmp[5]-tmp[4])*src[12] + (tmp[8]-tmp[9])*src[13] + (tmp[11]-tmp[10])*src[14];
334 dst.
_data[12] = (tmp[2]-tmp[3])*src[10] + (tmp[5]-tmp[4])*src[11] + (tmp[1]-tmp[0])*src[9];
335 dst.
_data[13] = (tmp[7]-tmp[6])*src[10] + (tmp[8]-tmp[9])*src[11] + (tmp[0]-tmp[1])*src[8];
336 dst.
_data[14] = (tmp[6]-tmp[7])*src[9] + (tmp[11]-tmp[10])*src[11] + (tmp[3]-tmp[2])*src[8];
337 dst.
_data[15] = (tmp[10]-tmp[11])*src[10] + (tmp[4]-tmp[5])*src[8] + (tmp[9]-tmp[8])*src[9];
342 for (
int j = 0; j < 16; j++) {
364 int next[] = { 1, 2, 0 };
370 float s = sqrtf(tr + 1.f);
373 quat[0] = (_data2d[1][2] - _data2d[2][1]) * s;
374 quat[1] = (_data2d[2][0] - _data2d[0][2]) * s;
375 quat[2] = (_data2d[0][1] - _data2d[1][0]) * s;
380 if (_data2d[1][1] > _data2d[0][0]) i = 1;
381 if (_data2d[2][2] > _data2d[i][i]) i = 2;
385 float s = sqrtf((_data2d[i][i] - (_data2d[j][j] + _data2d[k][k])) + 1.f);
388 if (s != 0.f) s = 0.5f / s;
390 quat[3] = (_data2d[j][k] - _data2d[k][j]) * s;
391 quat[j] = (_data2d[i][j] + _data2d[j][i]) * s;
392 quat[k] = (_data2d[i][k] + _data2d[k][i]) * s;
395 return CQuaternion(quat[0], quat[1], quat[2], quat[3]);
411 float len = axis.
Length();
417 return -atan2(axis.
Z, axis.
X);
void Translate(float x, float y, float z)
void SetZRotation(float angle)
float GetYRotation() const
void SetTranslation(float x, float y, float z)
void SetYRotation(float angle)
CMatrix3D GetTranspose() const
void Rotate(const CQuaternion &quat)
void PostTranslate(float x, float y, float z)
void SetRotation(const CQuaternion &quat)
void RotateY(float angle)
CMatrix3D ToMatrix() const
void Scale(float x_scale, float y_scale, float z_scale)
void RotateTransposed(const CVector3D &vector, CVector3D &result) const
void Concatenate(const CMatrix3D &m)
void SetScaling(float x_scale, float y_scale, float z_scale)
void SetXRotation(float angle)
CVector3D GetLeft() const
void SetOrtho(float l, float r, float b, float t, float n, float f)
CVector3D GetTranslation() const
void RotateZ(float angle)
void RotateX(float angle)
CQuaternion GetRotation() const
CMatrix3D GetInverse() const