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)
1034 if ( !pout || !pv1 || !pv2) return NULL;
1035 temp.x = (pv1->y) * (pv2->z) - (pv1->z) * (pv2->y);
1036 temp.y = (pv1->z) * (pv2->x) - (pv1->x) * (pv2->z);
1037 temp.z = (pv1->x) * (pv2->y) - (pv1->y) * (pv2->x);
1042 static inline FLOAT D3DXVec3Dot(CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
1044 if ( !pv1 || !pv2 ) return 0.0f;
1045 return (pv1->x) * (pv2->x) + (pv1->y) * (pv2->y) + (pv1->z) * (pv2->z);
1048 static inline FLOAT D3DXVec3Length(CONST D3DXVECTOR3 *pv)
1050 if (!pv) return 0.0f;
1051 return sqrtf( pv->x * pv->x + pv->y * pv->y + pv->z * pv->z );
1054 static inline FLOAT D3DXVec3LengthSq(CONST D3DXVECTOR3 *pv)
1056 if (!pv) return 0.0f;
1057 return (pv->x) * (pv->x) + (pv->y) * (pv->y) + (pv->z) * (pv->z);
1060 static inline D3DXVECTOR3* D3DXVec3Lerp(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2, FLOAT s)
1062 if ( !pout || !pv1 || !pv2) return NULL;
1063 pout->x = (1-s) * (pv1->x) + s * (pv2->x);
1064 pout->y = (1-s) * (pv1->y) + s * (pv2->y);
1065 pout->z = (1-s) * (pv1->z) + s * (pv2->z);
1069 static inline D3DXVECTOR3* D3DXVec3Maximize(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
1071 if ( !pout || !pv1 || !pv2) return NULL;
1072 pout->x = pv1->x > pv2->x ? pv1->x : pv2->x;
1073 pout->y = pv1->y > pv2->y ? pv1->y : pv2->y;
1074 pout->z = pv1->z > pv2->z ? pv1->z : pv2->z;
1078 static inline D3DXVECTOR3* D3DXVec3Minimize(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
1080 if ( !pout || !pv1 || !pv2) return NULL;
1081 pout->x = pv1->x < pv2->x ? pv1->x : pv2->x;
1082 pout->y = pv1->y < pv2->y ? pv1->y : pv2->y;
1083 pout->z = pv1->z < pv2->z ? pv1->z : pv2->z;
1087 static inline D3DXVECTOR3* D3DXVec3Scale(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv, FLOAT s)
1089 if ( !pout || !pv) return NULL;
1090 pout->x = s * (pv->x);
1091 pout->y = s * (pv->y);
1092 pout->z = s * (pv->z);
1096 static inline D3DXVECTOR3* D3DXVec3Subtract(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
1098 if ( !pout || !pv1 || !pv2) return NULL;
1099 pout->x = pv1->x - pv2->x;
1100 pout->y = pv1->y - pv2->y;
1101 pout->z = pv1->z - pv2->z;
1104 /*__________________D3DXVECTOR4_______________________*/
1106 static inline D3DXVECTOR4* D3DXVec4Add(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2)
1108 if ( !pout || !pv1 || !pv2) return NULL;
1109 pout->x = pv1->x + pv2->x;
1110 pout->y = pv1->y + pv2->y;
1111 pout->z = pv1->z + pv2->z;
1112 pout->w = pv1->w + pv2->w;
1116 static inline FLOAT D3DXVec4Dot(CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2)
1118 if (!pv1 || !pv2 ) return 0.0f;
1119 return (pv1->x) * (pv2->x) + (pv1->y) * (pv2->y) + (pv1->z) * (pv2->z) + (pv1->w) * (pv2->w);
1122 static inline FLOAT D3DXVec4Length(CONST D3DXVECTOR4 *pv)
1124 if (!pv) return 0.0f;
1125 return sqrtf( pv->x * pv->x + pv->y * pv->y + pv->z * pv->z + pv->w * pv->w );
1128 static inline FLOAT D3DXVec4LengthSq(CONST D3DXVECTOR4 *pv)
1130 if (!pv) return 0.0f;
1131 return (pv->x) * (pv->x) + (pv->y) * (pv->y) + (pv->z) * (pv->z) + (pv->w) * (pv->w);
1134 static inline D3DXVECTOR4* D3DXVec4Lerp(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2, FLOAT s)
1136 if ( !pout || !pv1 || !pv2) return NULL;
1137 pout->x = (1-s) * (pv1->x) + s * (pv2->x);
1138 pout->y = (1-s) * (pv1->y) + s * (pv2->y);
1139 pout->z = (1-s) * (pv1->z) + s * (pv2->z);
1140 pout->w = (1-s) * (pv1->w) + s * (pv2->w);
1145 static inline D3DXVECTOR4* D3DXVec4Maximize(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2)
1147 if ( !pout || !pv1 || !pv2) return NULL;
1148 pout->x = pv1->x > pv2->x ? pv1->x : pv2->x;
1149 pout->y = pv1->y > pv2->y ? pv1->y : pv2->y;
1150 pout->z = pv1->z > pv2->z ? pv1->z : pv2->z;
1151 pout->w = pv1->w > pv2->w ? pv1->w : pv2->w;
1155 static inline D3DXVECTOR4* D3DXVec4Minimize(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2)
1157 if ( !pout || !pv1 || !pv2) return NULL;
1158 pout->x = pv1->x < pv2->x ? pv1->x : pv2->x;
1159 pout->y = pv1->y < pv2->y ? pv1->y : pv2->y;
1160 pout->z = pv1->z < pv2->z ? pv1->z : pv2->z;
1161 pout->w = pv1->w < pv2->w ? pv1->w : pv2->w;
1165 static inline D3DXVECTOR4* D3DXVec4Scale(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv, FLOAT s)
1167 if ( !pout || !pv) return NULL;
1168 pout->x = s * (pv->x);
1169 pout->y = s * (pv->y);
1170 pout->z = s * (pv->z);
1171 pout->w = s * (pv->w);
1175 static inline D3DXVECTOR4* D3DXVec4Subtract(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2)
1177 if ( !pout || !pv1 || !pv2) return NULL;
1178 pout->x = pv1->x - pv2->x;
1179 pout->y = pv1->y - pv2->y;
1180 pout->z = pv1->z - pv2->z;
1181 pout->w = pv1->w - pv2->w;
1185 /*__________________D3DXMatrix____________________*/
1186 #ifdef NONAMELESSUNION
1187 # define D3DX_U(x) (x).u
1189 # define D3DX_U(x) (x)
1192 static inline D3DXMATRIX* D3DXMatrixIdentity(D3DXMATRIX *pout)
1194 if ( !pout ) return NULL;
1195 D3DX_U(*pout).m[0][1] = 0.0f;
1196 D3DX_U(*pout).m[0][2] = 0.0f;
1197 D3DX_U(*pout).m[0][3] = 0.0f;
1198 D3DX_U(*pout).m[1][0] = 0.0f;
1199 D3DX_U(*pout).m[1][2] = 0.0f;
1200 D3DX_U(*pout).m[1][3] = 0.0f;
1201 D3DX_U(*pout).m[2][0] = 0.0f;
1202 D3DX_U(*pout).m[2][1] = 0.0f;
1203 D3DX_U(*pout).m[2][3] = 0.0f;
1204 D3DX_U(*pout).m[3][0] = 0.0f;
1205 D3DX_U(*pout).m[3][1] = 0.0f;
1206 D3DX_U(*pout).m[3][2] = 0.0f;
1207 D3DX_U(*pout).m[0][0] = 1.0f;
1208 D3DX_U(*pout).m[1][1] = 1.0f;
1209 D3DX_U(*pout).m[2][2] = 1.0f;
1210 D3DX_U(*pout).m[3][3] = 1.0f;
1214 static inline BOOL D3DXMatrixIsIdentity(D3DXMATRIX *pm)
1217 D3DXMATRIX testmatrix;
1219 if ( !pm ) return FALSE;
1220 D3DXMatrixIdentity(&testmatrix);
1225 if ( D3DX_U(*pm).m[i][j] != D3DX_U(testmatrix).m[i][j] ) return FALSE;
1232 /*__________________D3DXPLANE____________________*/
1234 static inline FLOAT D3DXPlaneDot(CONST D3DXPLANE *pp, CONST D3DXVECTOR4 *pv)
1236 if ( !pp || !pv ) return 0.0f;
1237 return ( (pp->a) * (pv->x) + (pp->b) * (pv->y) + (pp->c) * (pv->z) + (pp->d) * (pv->w) );
1240 static inline FLOAT D3DXPlaneDotCoord(CONST D3DXPLANE *pp, CONST D3DXVECTOR4 *pv)
1242 if ( !pp || !pv ) return 0.0f;
1243 return ( (pp->a) * (pv->x) + (pp->b) * (pv->y) + (pp->c) * (pv->z) + (pp->d) );
1246 static inline FLOAT D3DXPlaneDotNormal(CONST D3DXPLANE *pp, CONST D3DXVECTOR4 *pv)
1248 if ( !pp || !pv ) return 0.0f;
1249 return ( (pp->a) * (pv->x) + (pp->b) * (pv->y) + (pp->c) * (pv->z) );
1252 /*__________________D3DXQUATERNION____________________*/
1254 static inline D3DXQUATERNION* D3DXQuaternionConjugate(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq)
1256 if ( !pout || !pq) return NULL;
1264 static inline FLOAT D3DXQuaternionDot(CONST D3DXQUATERNION *pq1, CONST D3DXQUATERNION *pq2)
1266 if ( !pq1 || !pq2 ) return 0.0f;
1267 return (pq1->x) * (pq2->x) + (pq1->y) * (pq2->y) + (pq1->z) * (pq2->z) + (pq1->w) * (pq2->w);
1270 static inline D3DXQUATERNION* D3DXQuaternionIdentity(D3DXQUATERNION *pout)
1272 if ( !pout) return NULL;
1280 static inline BOOL D3DXQuaternionIsIdentity(D3DXQUATERNION *pq)
1282 if ( !pq) return FALSE;
1283 return ( (pq->x == 0.0f) && (pq->y == 0.0f) && (pq->z == 0.0f) && (pq->w == 1.0f) );
1286 static inline FLOAT D3DXQuaternionLength(CONST D3DXQUATERNION *pq)
1288 if (!pq) return 0.0f;
1289 return sqrtf( pq->x * pq->x + pq->y * pq->y + pq->z * pq->z + pq->w * pq->w );
1292 static inline FLOAT D3DXQuaternionLengthSq(CONST D3DXQUATERNION *pq)
1294 if (!pq) return 0.0f;
1295 return (pq->x) * (pq->x) + (pq->y) * (pq->y) + (pq->z) * (pq->z) + (pq->w) * (pq->w);