2 * Copyright (C) 2007 David Adam
3 * Copyright (C) 2007 Tony Wasserka
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 #ifndef __D3DX9MATH_INL__
21 #define __D3DX9MATH_INL__
23 /* constructors & operators */
26 inline D3DXVECTOR2::D3DXVECTOR2()
30 inline D3DXVECTOR2::D3DXVECTOR2(CONST FLOAT *pf)
37 inline D3DXVECTOR2::D3DXVECTOR2(FLOAT fx, FLOAT fy)
43 inline D3DXVECTOR2::operator FLOAT* ()
48 inline D3DXVECTOR2::operator CONST FLOAT* () const
50 return (CONST FLOAT*)&x;
53 inline D3DXVECTOR2& D3DXVECTOR2::operator += (CONST D3DXVECTOR2& v)
60 inline D3DXVECTOR2& D3DXVECTOR2::operator -= (CONST D3DXVECTOR2& v)
67 inline D3DXVECTOR2& D3DXVECTOR2::operator *= (FLOAT f)
74 inline D3DXVECTOR2& D3DXVECTOR2::operator /= (FLOAT f)
81 inline D3DXVECTOR2 D3DXVECTOR2::operator + () const
86 inline D3DXVECTOR2 D3DXVECTOR2::operator - () const
88 return D3DXVECTOR2(-x, -y);
91 inline D3DXVECTOR2 D3DXVECTOR2::operator + (CONST D3DXVECTOR2& v) const
93 return D3DXVECTOR2(x + v.x, y + v.y);
96 inline D3DXVECTOR2 D3DXVECTOR2::operator - (CONST D3DXVECTOR2& v) const
98 return D3DXVECTOR2(x - v.x, y - v.y);
101 inline D3DXVECTOR2 D3DXVECTOR2::operator * (FLOAT f) const
103 return D3DXVECTOR2(x * f, y * f);
106 inline D3DXVECTOR2 D3DXVECTOR2::operator / (FLOAT f) const
108 return D3DXVECTOR2(x / f, y / f);
111 inline D3DXVECTOR2 operator * (FLOAT f, CONST D3DXVECTOR2& v)
113 return D3DXVECTOR2(f * v.x, f * v.y);
116 inline BOOL D3DXVECTOR2::operator == (CONST D3DXVECTOR2& v) const
118 return x == v.x && y == v.y;
121 inline BOOL D3DXVECTOR2::operator != (CONST D3DXVECTOR2& v) const
123 return x != v.x || y != v.y;
126 inline D3DXVECTOR3::D3DXVECTOR3()
130 inline D3DXVECTOR3::D3DXVECTOR3(CONST FLOAT *pf)
138 inline D3DXVECTOR3::D3DXVECTOR3(CONST D3DVECTOR& v)
145 inline D3DXVECTOR3::D3DXVECTOR3(FLOAT fx, FLOAT fy, FLOAT fz)
152 inline D3DXVECTOR3::operator FLOAT* ()
157 inline D3DXVECTOR3::operator CONST FLOAT* () const
159 return (CONST FLOAT*)&x;
162 inline D3DXVECTOR3& D3DXVECTOR3::operator += (CONST D3DXVECTOR3& v)
170 inline D3DXVECTOR3& D3DXVECTOR3::operator -= (CONST D3DXVECTOR3& v)
178 inline D3DXVECTOR3& D3DXVECTOR3::operator *= (FLOAT f)
186 inline D3DXVECTOR3& D3DXVECTOR3::operator /= (FLOAT f)
194 inline D3DXVECTOR3 D3DXVECTOR3::operator + () const
199 inline D3DXVECTOR3 D3DXVECTOR3::operator - () const
201 return D3DXVECTOR3(-x, -y, -z);
204 inline D3DXVECTOR3 D3DXVECTOR3::operator + (CONST D3DXVECTOR3& v) const
206 return D3DXVECTOR3(x + v.x, y + v.y, z + v.z);
209 inline D3DXVECTOR3 D3DXVECTOR3::operator - (CONST D3DXVECTOR3& v) const
211 return D3DXVECTOR3(x - v.x, y - v.y, z - v.z);
214 inline D3DXVECTOR3 D3DXVECTOR3::operator * (FLOAT f) const
216 return D3DXVECTOR3(x * f, y * f, z * f);
219 inline D3DXVECTOR3 D3DXVECTOR3::operator / (FLOAT f) const
221 return D3DXVECTOR3(x / f, y / f, z / f);
224 inline D3DXVECTOR3 operator * (FLOAT f, CONST D3DXVECTOR3& v)
226 return D3DXVECTOR3(f * v.x, f * v.y, f * v.z);
229 inline BOOL D3DXVECTOR3::operator == (CONST D3DXVECTOR3& v) const
231 return x == v.x && y == v.y && z == v.z;
234 inline BOOL D3DXVECTOR3::operator != (CONST D3DXVECTOR3& v) const
236 return x != v.x || y != v.y || z != v.z;
239 inline D3DXVECTOR4::D3DXVECTOR4()
243 inline D3DXVECTOR4::D3DXVECTOR4(CONST FLOAT *pf)
252 inline D3DXVECTOR4::D3DXVECTOR4(FLOAT fx, FLOAT fy, FLOAT fz, FLOAT fw)
260 inline D3DXVECTOR4::operator FLOAT* ()
265 inline D3DXVECTOR4::operator CONST FLOAT* () const
267 return (CONST FLOAT*)&x;
270 inline D3DXVECTOR4& D3DXVECTOR4::operator += (CONST D3DXVECTOR4& v)
279 inline D3DXVECTOR4& D3DXVECTOR4::operator -= (CONST D3DXVECTOR4& v)
288 inline D3DXVECTOR4& D3DXVECTOR4::operator *= (FLOAT f)
297 inline D3DXVECTOR4& D3DXVECTOR4::operator /= (FLOAT f)
306 inline D3DXVECTOR4 D3DXVECTOR4::operator + () const
311 inline D3DXVECTOR4 D3DXVECTOR4::operator - () const
313 return D3DXVECTOR4(-x, -y, -z, -w);
316 inline D3DXVECTOR4 D3DXVECTOR4::operator + (CONST D3DXVECTOR4& v) const
318 return D3DXVECTOR4(x + v.x, y + v.y, z + v.z, w + v.w);
321 inline D3DXVECTOR4 D3DXVECTOR4::operator - (CONST D3DXVECTOR4& v) const
323 return D3DXVECTOR4(x - v.x, y - v.y, z - v.z, w - v.w);
326 inline D3DXVECTOR4 D3DXVECTOR4::operator * (FLOAT f) const
328 return D3DXVECTOR4(x * f, y * f, z * f, w * f);
331 inline D3DXVECTOR4 D3DXVECTOR4::operator / (FLOAT f) const
333 return D3DXVECTOR4(x / f, y / f, z / f, w / f);
336 inline D3DXVECTOR4 operator * (FLOAT f, CONST D3DXVECTOR4& v)
338 return D3DXVECTOR4(f * v.x, f * v.y, f * v.z, f * v.w);
341 inline BOOL D3DXVECTOR4::operator == (CONST D3DXVECTOR4& v) const
343 return x == v.x && y == v.y && z == v.z && w == v.w;
346 inline BOOL D3DXVECTOR4::operator != (CONST D3DXVECTOR4& v) const
348 return x != v.x || y != v.y || z != v.z || w != v.w;
351 inline D3DXMATRIX::D3DXMATRIX()
355 inline D3DXMATRIX::D3DXMATRIX(CONST FLOAT *pf)
358 memcpy(&_11, pf, sizeof(D3DXMATRIX));
361 inline D3DXMATRIX::D3DXMATRIX(CONST D3DMATRIX& mat)
363 memcpy(&_11, &mat, sizeof(D3DXMATRIX));
366 inline D3DXMATRIX::D3DXMATRIX(FLOAT f11, FLOAT f12, FLOAT f13, FLOAT f14,
367 FLOAT f21, FLOAT f22, FLOAT f23, FLOAT f24,
368 FLOAT f31, FLOAT f32, FLOAT f33, FLOAT f34,
369 FLOAT f41, FLOAT f42, FLOAT f43, FLOAT f44)
371 _11 = f11; _12 = f12; _13 = f13; _14 = f14;
372 _21 = f21; _22 = f22; _23 = f23; _24 = f24;
373 _31 = f31; _32 = f32; _33 = f33; _34 = f34;
374 _41 = f41; _42 = f42; _43 = f43; _44 = f44;
377 inline FLOAT& D3DXMATRIX::operator () (UINT row, UINT col)
382 inline FLOAT D3DXMATRIX::operator () (UINT row, UINT col) const
387 inline D3DXMATRIX::operator FLOAT* ()
392 inline D3DXMATRIX::operator CONST FLOAT* () const
394 return (CONST FLOAT*)&_11;
397 inline D3DXMATRIX& D3DXMATRIX::operator *= (CONST D3DXMATRIX& mat)
399 D3DXMatrixMultiply(this, this, &mat);
403 inline D3DXMATRIX& D3DXMATRIX::operator += (CONST D3DXMATRIX& mat)
405 _11 += mat._11; _12 += mat._12; _13 += mat._13; _14 += mat._14;
406 _21 += mat._21; _22 += mat._22; _23 += mat._23; _24 += mat._24;
407 _31 += mat._31; _32 += mat._32; _33 += mat._33; _34 += mat._34;
408 _41 += mat._41; _42 += mat._42; _43 += mat._43; _44 += mat._44;
412 inline D3DXMATRIX& D3DXMATRIX::operator -= (CONST D3DXMATRIX& mat)
414 _11 -= mat._11; _12 -= mat._12; _13 -= mat._13; _14 -= mat._14;
415 _21 -= mat._21; _22 -= mat._22; _23 -= mat._23; _24 -= mat._24;
416 _31 -= mat._31; _32 -= mat._32; _33 -= mat._33; _34 -= mat._34;
417 _41 -= mat._41; _42 -= mat._42; _43 -= mat._43; _44 -= mat._44;
421 inline D3DXMATRIX& D3DXMATRIX::operator *= (FLOAT f)
423 _11 *= f; _12 *= f; _13 *= f; _14 *= f;
424 _21 *= f; _22 *= f; _23 *= f; _24 *= f;
425 _31 *= f; _32 *= f; _33 *= f; _34 *= f;
426 _41 *= f; _42 *= f; _43 *= f; _44 *= f;
430 inline D3DXMATRIX& D3DXMATRIX::operator /= (FLOAT f)
432 FLOAT inv = 1.0f / f;
433 _11 *= inv; _12 *= inv; _13 *= inv; _14 *= inv;
434 _21 *= inv; _22 *= inv; _23 *= inv; _24 *= inv;
435 _31 *= inv; _32 *= inv; _33 *= inv; _34 *= inv;
436 _41 *= inv; _42 *= inv; _43 *= inv; _44 *= inv;
440 inline D3DXMATRIX D3DXMATRIX::operator + () const
445 inline D3DXMATRIX D3DXMATRIX::operator - () const
447 return D3DXMATRIX(-_11, -_12, -_13, -_14,
448 -_21, -_22, -_23, -_24,
449 -_31, -_32, -_33, -_34,
450 -_41, -_42, -_43, -_44);
453 inline D3DXMATRIX D3DXMATRIX::operator * (CONST D3DXMATRIX& mat) const
456 D3DXMatrixMultiply(&buf, this, &mat);
460 inline D3DXMATRIX D3DXMATRIX::operator + (CONST D3DXMATRIX& mat) const
462 return D3DXMATRIX(_11 + mat._11, _12 + mat._12, _13 + mat._13, _14 + mat._14,
463 _21 + mat._21, _22 + mat._22, _23 + mat._23, _24 + mat._24,
464 _31 + mat._31, _32 + mat._32, _33 + mat._33, _34 + mat._34,
465 _41 + mat._41, _42 + mat._42, _43 + mat._43, _44 + mat._44);
468 inline D3DXMATRIX D3DXMATRIX::operator - (CONST D3DXMATRIX& mat) const
470 return D3DXMATRIX(_11 - mat._11, _12 - mat._12, _13 - mat._13, _14 - mat._14,
471 _21 - mat._21, _22 - mat._22, _23 - mat._23, _24 - mat._24,
472 _31 - mat._31, _32 - mat._32, _33 - mat._33, _34 - mat._34,
473 _41 - mat._41, _42 - mat._42, _43 - mat._43, _44 - mat._44);
476 inline D3DXMATRIX D3DXMATRIX::operator * (FLOAT f) const
478 return D3DXMATRIX(_11 * f, _12 * f, _13 * f, _14 * f,
479 _21 * f, _22 * f, _23 * f, _24 * f,
480 _31 * f, _32 * f, _33 * f, _34 * f,
481 _41 * f, _42 * f, _43 * f, _44 * f);
484 inline D3DXMATRIX D3DXMATRIX::operator / (FLOAT f) const
486 FLOAT inv = 1.0f / f;
487 return D3DXMATRIX(_11 * inv, _12 * inv, _13 * inv, _14 * inv,
488 _21 * inv, _22 * inv, _23 * inv, _24 * inv,
489 _31 * inv, _32 * inv, _33 * inv, _34 * inv,
490 _41 * inv, _42 * inv, _43 * inv, _44 * inv);
493 inline D3DXMATRIX operator * (FLOAT f, CONST D3DXMATRIX& mat)
495 return D3DXMATRIX(f * mat._11, f * mat._12, f * mat._13, f * mat._14,
496 f * mat._21, f * mat._22, f * mat._23, f * mat._24,
497 f * mat._31, f * mat._32, f * mat._33, f * mat._34,
498 f * mat._41, f * mat._42, f * mat._43, f * mat._44);
501 inline BOOL D3DXMATRIX::operator == (CONST D3DXMATRIX& mat) const
503 return (memcmp(this, &mat, sizeof(D3DXMATRIX)) == 0);
506 inline BOOL D3DXMATRIX::operator != (CONST D3DXMATRIX& mat) const
508 return (memcmp(this, &mat, sizeof(D3DXMATRIX)) != 0);
511 inline D3DXQUATERNION::D3DXQUATERNION()
515 inline D3DXQUATERNION::D3DXQUATERNION(CONST FLOAT *pf)
524 inline D3DXQUATERNION::D3DXQUATERNION(FLOAT fx, FLOAT fy, FLOAT fz, FLOAT fw)
532 inline D3DXQUATERNION::operator FLOAT* ()
537 inline D3DXQUATERNION::operator CONST FLOAT* () const
539 return (CONST FLOAT*)&x;
542 inline D3DXQUATERNION& D3DXQUATERNION::operator += (CONST D3DXQUATERNION& quat)
551 inline D3DXQUATERNION& D3DXQUATERNION::operator -= (CONST D3DXQUATERNION& quat)
560 inline D3DXQUATERNION& D3DXQUATERNION::operator *= (CONST D3DXQUATERNION& quat)
562 D3DXQuaternionMultiply(this, this, &quat);
566 inline D3DXQUATERNION& D3DXQUATERNION::operator *= (FLOAT f)
575 inline D3DXQUATERNION& D3DXQUATERNION::operator /= (FLOAT f)
577 FLOAT inv = 1.0f / f;
585 inline D3DXQUATERNION D3DXQUATERNION::operator + () const
590 inline D3DXQUATERNION D3DXQUATERNION::operator - () const
592 return D3DXQUATERNION(-x, -y, -z, -w);
595 inline D3DXQUATERNION D3DXQUATERNION::operator + (CONST D3DXQUATERNION& quat) const
597 return D3DXQUATERNION(x + quat.x, y + quat.y, z + quat.z, w + quat.w);
600 inline D3DXQUATERNION D3DXQUATERNION::operator - (CONST D3DXQUATERNION& quat) const
602 return D3DXQUATERNION(x - quat.x, y - quat.y, z - quat.z, w - quat.w);
605 inline D3DXQUATERNION D3DXQUATERNION::operator * (CONST D3DXQUATERNION& quat) const
608 D3DXQuaternionMultiply(&buf, this, &quat);
612 inline D3DXQUATERNION D3DXQUATERNION::operator * (FLOAT f) const
614 return D3DXQUATERNION(x * f, y * f, z * f, w * f);
617 inline D3DXQUATERNION D3DXQUATERNION::operator / (FLOAT f) const
619 FLOAT inv = 1.0f / f;
620 return D3DXQUATERNION(x * inv, y * inv, z * inv, w * inv);
623 inline D3DXQUATERNION operator * (FLOAT f, CONST D3DXQUATERNION& quat)
625 return D3DXQUATERNION(f * quat.x, f * quat.y, f * quat.z, f * quat.w);
628 inline BOOL D3DXQUATERNION::operator == (CONST D3DXQUATERNION& quat) const
630 return x == quat.x && y == quat.y && z == quat.z && w == quat.w;
633 inline BOOL D3DXQUATERNION::operator != (CONST D3DXQUATERNION& quat) const
635 return x != quat.x || y != quat.y || z != quat.z || w != quat.w;
638 inline D3DXPLANE::D3DXPLANE()
642 inline D3DXPLANE::D3DXPLANE(CONST FLOAT *pf)
651 inline D3DXPLANE::D3DXPLANE(FLOAT fa, FLOAT fb, FLOAT fc, FLOAT fd)
659 inline D3DXPLANE::operator FLOAT* ()
664 inline D3DXPLANE::operator CONST FLOAT* () const
666 return (CONST FLOAT*)&a;
669 inline D3DXPLANE D3DXPLANE::operator + () const
674 inline D3DXPLANE D3DXPLANE::operator - () const
676 return D3DXPLANE(-a, -b, -c, -d);
679 inline BOOL D3DXPLANE::operator == (CONST D3DXPLANE& pl) const
681 return a == pl.a && b == pl.b && c == pl.c && d == pl.d;
684 inline BOOL D3DXPLANE::operator != (CONST D3DXPLANE& pl) const
686 return a != pl.a || b != pl.b || c != pl.c || d != pl.d;
689 inline D3DXCOLOR::D3DXCOLOR()
693 inline D3DXCOLOR::D3DXCOLOR(DWORD col)
695 CONST FLOAT f = 1.0f / 255.0f;
696 r = f * (FLOAT)(unsigned char)(col >> 16);
697 g = f * (FLOAT)(unsigned char)(col >> 8);
698 b = f * (FLOAT)(unsigned char)col;
699 a = f * (FLOAT)(unsigned char)(col >> 24);
702 inline D3DXCOLOR::D3DXCOLOR(CONST FLOAT *pf)
711 inline D3DXCOLOR::D3DXCOLOR(CONST D3DCOLORVALUE& col)
719 inline D3DXCOLOR::D3DXCOLOR(FLOAT fr, FLOAT fg, FLOAT fb, FLOAT fa)
727 inline D3DXCOLOR::operator DWORD () const
729 DWORD _r = r >= 1.0f ? 0xff : r <= 0.0f ? 0x00 : (DWORD)(r * 255.0f + 0.5f);
730 DWORD _g = g >= 1.0f ? 0xff : g <= 0.0f ? 0x00 : (DWORD)(g * 255.0f + 0.5f);
731 DWORD _b = b >= 1.0f ? 0xff : b <= 0.0f ? 0x00 : (DWORD)(b * 255.0f + 0.5f);
732 DWORD _a = a >= 1.0f ? 0xff : a <= 0.0f ? 0x00 : (DWORD)(a * 255.0f + 0.5f);
734 return (_a << 24) | (_r << 16) | (_g << 8) | _b;
737 inline D3DXCOLOR::operator FLOAT * ()
742 inline D3DXCOLOR::operator CONST FLOAT * () const
744 return (CONST FLOAT*)&r;
747 inline D3DXCOLOR::operator D3DCOLORVALUE * ()
749 return (D3DCOLORVALUE*)&r;
752 inline D3DXCOLOR::operator CONST D3DCOLORVALUE * () const
754 return (CONST D3DCOLORVALUE*)&r;
757 inline D3DXCOLOR::operator D3DCOLORVALUE& ()
759 return *((D3DCOLORVALUE*)&r);
762 inline D3DXCOLOR::operator CONST D3DCOLORVALUE& () const
764 return *((CONST D3DCOLORVALUE*)&r);
767 inline D3DXCOLOR& D3DXCOLOR::operator += (CONST D3DXCOLOR& col)
776 inline D3DXCOLOR& D3DXCOLOR::operator -= (CONST D3DXCOLOR& col)
785 inline D3DXCOLOR& D3DXCOLOR::operator *= (FLOAT f)
794 inline D3DXCOLOR& D3DXCOLOR::operator /= (FLOAT f)
796 FLOAT inv = 1.0f / f;
804 inline D3DXCOLOR D3DXCOLOR::operator + () const
809 inline D3DXCOLOR D3DXCOLOR::operator - () const
811 return D3DXCOLOR(-r, -g, -b, -a);
814 inline D3DXCOLOR D3DXCOLOR::operator + (CONST D3DXCOLOR& col) const
816 return D3DXCOLOR(r + col.r, g + col.g, b + col.b, a + col.a);
819 inline D3DXCOLOR D3DXCOLOR::operator - (CONST D3DXCOLOR& col) const
821 return D3DXCOLOR(r - col.r, g - col.g, b - col.b, a - col.a);
824 inline D3DXCOLOR D3DXCOLOR::operator * (FLOAT f) const
826 return D3DXCOLOR(r * f, g * f, b * f, a * f);
829 inline D3DXCOLOR D3DXCOLOR::operator / (FLOAT f) const
831 FLOAT inv = 1.0f / f;
832 return D3DXCOLOR(r * inv, g * inv, b * inv, a * inv);
835 inline D3DXCOLOR operator * (FLOAT f, CONST D3DXCOLOR& col)
837 return D3DXCOLOR(f * col.r, f * col.g, f * col.b, f * col.a);
840 inline BOOL D3DXCOLOR::operator == (CONST D3DXCOLOR& col) const
842 return r == col.r && g == col.g && b == col.b && a == col.a;
845 inline BOOL D3DXCOLOR::operator != (CONST D3DXCOLOR& col) const
847 return r != col.r || g != col.g || b != col.b || a != col.a;
850 inline D3DXFLOAT16::D3DXFLOAT16()
854 inline D3DXFLOAT16::D3DXFLOAT16(FLOAT f)
856 D3DXFloat32To16Array(this, &f, 1);
859 inline D3DXFLOAT16::D3DXFLOAT16(CONST D3DXFLOAT16 &f)
864 inline D3DXFLOAT16::operator FLOAT ()
867 D3DXFloat16To32Array(&f, this, 1);
871 inline BOOL D3DXFLOAT16::operator == (CONST D3DXFLOAT16 &f) const
873 return value == f.value;
876 inline BOOL D3DXFLOAT16::operator != (CONST D3DXFLOAT16 &f) const
878 return value != f.value;
881 #endif /* __cplusplus */
883 /*_______________D3DXCOLOR_____________________*/
885 static inline D3DXCOLOR* D3DXColorAdd(D3DXCOLOR *pout, CONST D3DXCOLOR *pc1, CONST D3DXCOLOR *pc2)
887 if ( !pout || !pc1 || !pc2 ) return NULL;
888 pout->r = (pc1->r) + (pc2->r);
889 pout->g = (pc1->g) + (pc2->g);
890 pout->b = (pc1->b) + (pc2->b);
891 pout->a = (pc1->a) + (pc2->a);
895 static inline D3DXCOLOR* D3DXColorLerp(D3DXCOLOR *pout, CONST D3DXCOLOR *pc1, CONST D3DXCOLOR *pc2, FLOAT s)
897 if ( !pout || !pc1 || !pc2 ) return NULL;
898 pout->r = (1-s) * (pc1->r) + s *(pc2->r);
899 pout->g = (1-s) * (pc1->g) + s *(pc2->g);
900 pout->b = (1-s) * (pc1->b) + s *(pc2->b);
901 pout->a = (1-s) * (pc1->a) + s *(pc2->a);
905 static inline D3DXCOLOR* D3DXColorModulate(D3DXCOLOR *pout, CONST D3DXCOLOR *pc1, CONST D3DXCOLOR *pc2)
907 if ( !pout || !pc1 || !pc2 ) return NULL;
908 pout->r = (pc1->r) * (pc2->r);
909 pout->g = (pc1->g) * (pc2->g);
910 pout->b = (pc1->b) * (pc2->b);
911 pout->a = (pc1->a) * (pc2->a);
915 static inline D3DXCOLOR* D3DXColorNegative(D3DXCOLOR *pout, CONST D3DXCOLOR *pc)
917 if ( !pout || !pc ) return NULL;
918 pout->r = 1.0f - pc->r;
919 pout->g = 1.0f - pc->g;
920 pout->b = 1.0f - pc->b;
925 static inline D3DXCOLOR* D3DXColorScale(D3DXCOLOR *pout, CONST D3DXCOLOR *pc, FLOAT s)
927 if ( !pout || !pc ) return NULL;
928 pout->r = s* (pc->r);
929 pout->g = s* (pc->g);
930 pout->b = s* (pc->b);
931 pout->a = s* (pc->a);
935 static inline D3DXCOLOR* D3DXColorSubtract(D3DXCOLOR *pout, CONST D3DXCOLOR *pc1, CONST D3DXCOLOR *pc2)
937 if ( !pout || !pc1 || !pc2 ) return NULL;
938 pout->r = (pc1->r) - (pc2->r);
939 pout->g = (pc1->g) - (pc2->g);
940 pout->b = (pc1->b) - (pc2->b);
941 pout->a = (pc1->a) - (pc2->a);
945 /*_______________D3DXVECTOR2________________________*/
947 static inline D3DXVECTOR2* D3DXVec2Add(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2)
949 if ( !pout || !pv1 || !pv2) return NULL;
950 pout->x = pv1->x + pv2->x;
951 pout->y = pv1->y + pv2->y;
955 static inline FLOAT D3DXVec2CCW(CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2)
957 if ( !pv1 || !pv2) return 0.0f;
958 return ( (pv1->x) * (pv2->y) - (pv1->y) * (pv2->x) );
961 static inline FLOAT D3DXVec2Dot(CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2)
963 if ( !pv1 || !pv2) return 0.0f;
964 return ( (pv1->x * pv2->x + pv1->y * pv2->y) );
967 static inline FLOAT D3DXVec2Length(CONST D3DXVECTOR2 *pv)
969 if (!pv) return 0.0f;
970 return sqrtf( pv->x * pv->x + pv->y * pv->y );
973 static inline FLOAT D3DXVec2LengthSq(CONST D3DXVECTOR2 *pv)
975 if (!pv) return 0.0f;
976 return( (pv->x) * (pv->x) + (pv->y) * (pv->y) );
979 static inline D3DXVECTOR2* D3DXVec2Lerp(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2, FLOAT s)
981 if ( !pout || !pv1 || !pv2) return NULL;
982 pout->x = (1-s) * (pv1->x) + s * (pv2->x);
983 pout->y = (1-s) * (pv1->y) + s * (pv2->y);
987 static inline D3DXVECTOR2* D3DXVec2Maximize(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2)
989 if ( !pout || !pv1 || !pv2) return NULL;
990 pout->x = pv1->x > pv2->x ? pv1->x : pv2->x;
991 pout->y = pv1->y > pv2->y ? pv1->y : pv2->y;
995 static inline D3DXVECTOR2* D3DXVec2Minimize(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2)
997 if ( !pout || !pv1 || !pv2) return NULL;
998 pout->x = pv1->x < pv2->x ? pv1->x : pv2->x;
999 pout->y = pv1->y < pv2->y ? pv1->y : pv2->y;
1003 static inline D3DXVECTOR2* D3DXVec2Scale(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv, FLOAT s)
1005 if ( !pout || !pv) return NULL;
1006 pout->x = s * (pv->x);
1007 pout->y = s * (pv->y);
1011 static inline D3DXVECTOR2* D3DXVec2Subtract(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2)
1013 if ( !pout || !pv1 || !pv2) return NULL;
1014 pout->x = pv1->x - pv2->x;
1015 pout->y = pv1->y - pv2->y;
1019 /*__________________D3DXVECTOR3_______________________*/
1021 static inline D3DXVECTOR3* D3DXVec3Add(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
1023 if ( !pout || !pv1 || !pv2) return NULL;
1024 pout->x = pv1->x + pv2->x;
1025 pout->y = pv1->y + pv2->y;
1026 pout->z = pv1->z + pv2->z;
1030 static inline D3DXVECTOR3* D3DXVec3Cross(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
1032 if ( !pout || !pv1 || !pv2) return NULL;
1033 pout->x = (pv1->y) * (pv2->z) - (pv1->z) * (pv2->y);
1034 pout->y = (pv1->z) * (pv2->x) - (pv1->x) * (pv2->z);
1035 pout->z = (pv1->x) * (pv2->y) - (pv1->y) * (pv2->x);
1039 static inline FLOAT D3DXVec3Dot(CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
1041 if ( !pv1 || !pv2 ) return 0.0f;
1042 return (pv1->x) * (pv2->x) + (pv1->y) * (pv2->y) + (pv1->z) * (pv2->z);
1045 static inline FLOAT D3DXVec3Length(CONST D3DXVECTOR3 *pv)
1047 if (!pv) return 0.0f;
1048 return sqrtf( pv->x * pv->x + pv->y * pv->y + pv->z * pv->z );
1051 static inline FLOAT D3DXVec3LengthSq(CONST D3DXVECTOR3 *pv)
1053 if (!pv) return 0.0f;
1054 return (pv->x) * (pv->x) + (pv->y) * (pv->y) + (pv->z) * (pv->z);
1057 static inline D3DXVECTOR3* D3DXVec3Lerp(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2, FLOAT s)
1059 if ( !pout || !pv1 || !pv2) return NULL;
1060 pout->x = (1-s) * (pv1->x) + s * (pv2->x);
1061 pout->y = (1-s) * (pv1->y) + s * (pv2->y);
1062 pout->z = (1-s) * (pv1->z) + s * (pv2->z);
1066 static inline D3DXVECTOR3* D3DXVec3Maximize(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
1068 if ( !pout || !pv1 || !pv2) return NULL;
1069 pout->x = pv1->x > pv2->x ? pv1->x : pv2->x;
1070 pout->y = pv1->y > pv2->y ? pv1->y : pv2->y;
1071 pout->z = pv1->z > pv2->z ? pv1->z : pv2->z;
1075 static inline D3DXVECTOR3* D3DXVec3Minimize(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
1077 if ( !pout || !pv1 || !pv2) return NULL;
1078 pout->x = pv1->x < pv2->x ? pv1->x : pv2->x;
1079 pout->y = pv1->y < pv2->y ? pv1->y : pv2->y;
1080 pout->z = pv1->z < pv2->z ? pv1->z : pv2->z;
1084 static inline D3DXVECTOR3* D3DXVec3Scale(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv, FLOAT s)
1086 if ( !pout || !pv) return NULL;
1087 pout->x = s * (pv->x);
1088 pout->y = s * (pv->y);
1089 pout->z = s * (pv->z);
1093 static inline D3DXVECTOR3* D3DXVec3Subtract(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
1095 if ( !pout || !pv1 || !pv2) return NULL;
1096 pout->x = pv1->x - pv2->x;
1097 pout->y = pv1->y - pv2->y;
1098 pout->z = pv1->z - pv2->z;
1101 /*__________________D3DXVECTOR4_______________________*/
1103 static inline D3DXVECTOR4* D3DXVec4Add(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2)
1105 if ( !pout || !pv1 || !pv2) return NULL;
1106 pout->x = pv1->x + pv2->x;
1107 pout->y = pv1->y + pv2->y;
1108 pout->z = pv1->z + pv2->z;
1109 pout->w = pv1->w + pv2->w;
1113 static inline FLOAT D3DXVec4Dot(CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2)
1115 if (!pv1 || !pv2 ) return 0.0f;
1116 return (pv1->x) * (pv2->x) + (pv1->y) * (pv2->y) + (pv1->z) * (pv2->z) + (pv1->w) * (pv2->w);
1119 static inline FLOAT D3DXVec4Length(CONST D3DXVECTOR4 *pv)
1121 if (!pv) return 0.0f;
1122 return sqrtf( pv->x * pv->x + pv->y * pv->y + pv->z * pv->z + pv->w * pv->w );
1125 static inline FLOAT D3DXVec4LengthSq(CONST D3DXVECTOR4 *pv)
1127 if (!pv) return 0.0f;
1128 return (pv->x) * (pv->x) + (pv->y) * (pv->y) + (pv->z) * (pv->z) + (pv->w) * (pv->w);
1131 static inline D3DXVECTOR4* D3DXVec4Lerp(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2, FLOAT s)
1133 if ( !pout || !pv1 || !pv2) return NULL;
1134 pout->x = (1-s) * (pv1->x) + s * (pv2->x);
1135 pout->y = (1-s) * (pv1->y) + s * (pv2->y);
1136 pout->z = (1-s) * (pv1->z) + s * (pv2->z);
1137 pout->w = (1-s) * (pv1->w) + s * (pv2->w);
1142 static inline D3DXVECTOR4* D3DXVec4Maximize(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2)
1144 if ( !pout || !pv1 || !pv2) return NULL;
1145 pout->x = pv1->x > pv2->x ? pv1->x : pv2->x;
1146 pout->y = pv1->y > pv2->y ? pv1->y : pv2->y;
1147 pout->z = pv1->z > pv2->z ? pv1->z : pv2->z;
1148 pout->w = pv1->w > pv2->w ? pv1->w : pv2->w;
1152 static inline D3DXVECTOR4* D3DXVec4Minimize(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2)
1154 if ( !pout || !pv1 || !pv2) return NULL;
1155 pout->x = pv1->x < pv2->x ? pv1->x : pv2->x;
1156 pout->y = pv1->y < pv2->y ? pv1->y : pv2->y;
1157 pout->z = pv1->z < pv2->z ? pv1->z : pv2->z;
1158 pout->w = pv1->w < pv2->w ? pv1->w : pv2->w;
1162 static inline D3DXVECTOR4* D3DXVec4Scale(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv, FLOAT s)
1164 if ( !pout || !pv) return NULL;
1165 pout->x = s * (pv->x);
1166 pout->y = s * (pv->y);
1167 pout->z = s * (pv->z);
1168 pout->w = s * (pv->w);
1172 static inline D3DXVECTOR4* D3DXVec4Subtract(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2)
1174 if ( !pout || !pv1 || !pv2) return NULL;
1175 pout->x = pv1->x - pv2->x;
1176 pout->y = pv1->y - pv2->y;
1177 pout->z = pv1->z - pv2->z;
1178 pout->w = pv1->w - pv2->w;
1182 /*__________________D3DXMatrix____________________*/
1183 #ifdef NONAMELESSUNION
1184 # define D3DX_U(x) (x).u
1186 # define D3DX_U(x) (x)
1189 static inline D3DXMATRIX* D3DXMatrixIdentity(D3DXMATRIX *pout)
1191 if ( !pout ) return NULL;
1192 D3DX_U(*pout).m[0][1] = 0.0f;
1193 D3DX_U(*pout).m[0][2] = 0.0f;
1194 D3DX_U(*pout).m[0][3] = 0.0f;
1195 D3DX_U(*pout).m[1][0] = 0.0f;
1196 D3DX_U(*pout).m[1][2] = 0.0f;
1197 D3DX_U(*pout).m[1][3] = 0.0f;
1198 D3DX_U(*pout).m[2][0] = 0.0f;
1199 D3DX_U(*pout).m[2][1] = 0.0f;
1200 D3DX_U(*pout).m[2][3] = 0.0f;
1201 D3DX_U(*pout).m[3][0] = 0.0f;
1202 D3DX_U(*pout).m[3][1] = 0.0f;
1203 D3DX_U(*pout).m[3][2] = 0.0f;
1204 D3DX_U(*pout).m[0][0] = 1.0f;
1205 D3DX_U(*pout).m[1][1] = 1.0f;
1206 D3DX_U(*pout).m[2][2] = 1.0f;
1207 D3DX_U(*pout).m[3][3] = 1.0f;
1211 static inline BOOL D3DXMatrixIsIdentity(D3DXMATRIX *pm)
1214 D3DXMATRIX testmatrix;
1216 if ( !pm ) return FALSE;
1217 D3DXMatrixIdentity(&testmatrix);
1222 if ( D3DX_U(*pm).m[i][j] != D3DX_U(testmatrix).m[i][j] ) return FALSE;
1229 /*__________________D3DXPLANE____________________*/
1231 static inline FLOAT D3DXPlaneDot(CONST D3DXPLANE *pp, CONST D3DXVECTOR4 *pv)
1233 if ( !pp || !pv ) return 0.0f;
1234 return ( (pp->a) * (pv->x) + (pp->b) * (pv->y) + (pp->c) * (pv->z) + (pp->d) * (pv->w) );
1237 static inline FLOAT D3DXPlaneDotCoord(CONST D3DXPLANE *pp, CONST D3DXVECTOR4 *pv)
1239 if ( !pp || !pv ) return 0.0f;
1240 return ( (pp->a) * (pv->x) + (pp->b) * (pv->y) + (pp->c) * (pv->z) + (pp->d) );
1243 static inline FLOAT D3DXPlaneDotNormal(CONST D3DXPLANE *pp, CONST D3DXVECTOR4 *pv)
1245 if ( !pp || !pv ) return 0.0f;
1246 return ( (pp->a) * (pv->x) + (pp->b) * (pv->y) + (pp->c) * (pv->z) );
1249 /*__________________D3DXQUATERNION____________________*/
1251 static inline D3DXQUATERNION* D3DXQuaternionConjugate(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq)
1253 if ( !pout || !pq) return NULL;
1261 static inline FLOAT D3DXQuaternionDot(CONST D3DXQUATERNION *pq1, CONST D3DXQUATERNION *pq2)
1263 if ( !pq1 || !pq2 ) return 0.0f;
1264 return (pq1->x) * (pq2->x) + (pq1->y) * (pq2->y) + (pq1->z) * (pq2->z) + (pq1->w) * (pq2->w);
1267 static inline D3DXQUATERNION* D3DXQuaternionIdentity(D3DXQUATERNION *pout)
1269 if ( !pout) return NULL;
1277 static inline BOOL D3DXQuaternionIsIdentity(D3DXQUATERNION *pq)
1279 if ( !pq) return FALSE;
1280 return ( (pq->x == 0.0f) && (pq->y == 0.0f) && (pq->z == 0.0f) && (pq->w == 1.0f) );
1283 static inline FLOAT D3DXQuaternionLength(CONST D3DXQUATERNION *pq)
1285 if (!pq) return 0.0f;
1286 return sqrtf( pq->x * pq->x + pq->y * pq->y + pq->z * pq->z + pq->w * pq->w );
1289 static inline FLOAT D3DXQuaternionLengthSq(CONST D3DXQUATERNION *pq)
1291 if (!pq) return 0.0f;
1292 return (pq->x) * (pq->x) + (pq->y) * (pq->y) + (pq->z) * (pq->z) + (pq->w) * (pq->w);