mshtml: gcc 2.95 does not allow an array of undefined dimension in a struct. So fix...
[wine/hacks.git] / include / d3dx8math.inl
blob01e7af355422eda7f2b7150fba583fe3928aabeb
1 /*
2  * Copyright (C) 2007 David Adam
3  * Copyright (C) 2007 Tony Wasserka
4  *
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.
9  *
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.
14  *
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
18  */
20 #ifndef __D3DX8MATH_INL__
21 #define __D3DX8MATH_INL__
23 /* constructors & operators */
24 #ifdef __cplusplus
26 inline D3DXVECTOR2::D3DXVECTOR2()
30 inline D3DXVECTOR2::D3DXVECTOR2(CONST FLOAT *pf)
32     if(!pf) return;
33     x = pf[0];
34     y = pf[1];
37 inline D3DXVECTOR2::D3DXVECTOR2(FLOAT fx, FLOAT fy)
39     x = fx;
40     y = fy;
43 inline D3DXVECTOR2::operator FLOAT* ()
45     return (FLOAT*)&x;
48 inline D3DXVECTOR2::operator CONST FLOAT* () const
50     return (CONST FLOAT*)&x;
53 inline D3DXVECTOR2& D3DXVECTOR2::operator += (CONST D3DXVECTOR2& v)
55     x += v.x;
56     y += v.y;
57     return *this;
60 inline D3DXVECTOR2& D3DXVECTOR2::operator -= (CONST D3DXVECTOR2& v)
62     x -= v.x;
63     y -= v.y;
64     return *this;
67 inline D3DXVECTOR2& D3DXVECTOR2::operator *= (FLOAT f)
69     x *= f;
70     y *= f;
71     return *this;
74 inline D3DXVECTOR2& D3DXVECTOR2::operator /= (FLOAT f)
76     x /= f;
77     y /= f;
78     return *this;
81 inline D3DXVECTOR2 D3DXVECTOR2::operator + () const
83     return *this;
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)
132     if(!pf) return;
133     x = pf[0];
134     y = pf[1];
135     z = pf[2];
138 inline D3DXVECTOR3::D3DXVECTOR3(CONST D3DVECTOR& v)
140     x = v.x;
141     y = v.y;
142     z = v.z;
145 inline D3DXVECTOR3::D3DXVECTOR3(FLOAT fx, FLOAT fy, FLOAT fz)
147     x = fx;
148     y = fy;
149     z = fz;
152 inline D3DXVECTOR3::operator FLOAT* ()
154     return (FLOAT*)&x;
157 inline D3DXVECTOR3::operator CONST FLOAT* () const
159     return (CONST FLOAT*)&x;
162 inline D3DXVECTOR3& D3DXVECTOR3::operator += (CONST D3DXVECTOR3& v)
164     x += v.x;
165     y += v.y;
166     z += v.z;
167     return *this;
170 inline D3DXVECTOR3& D3DXVECTOR3::operator -= (CONST D3DXVECTOR3& v)
172     x -= v.x;
173     y -= v.y;
174     z -= v.z;
175     return *this;
178 inline D3DXVECTOR3& D3DXVECTOR3::operator *= (FLOAT f)
180     x *= f;
181     y *= f;
182     z *= f;
183     return *this;
186 inline D3DXVECTOR3& D3DXVECTOR3::operator /= (FLOAT f)
188     x /= f;
189     y /= f;
190     z /= f;
191     return *this;
194 inline D3DXVECTOR3 D3DXVECTOR3::operator + () const
196     return *this;
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)
245     if(!pf) return;
246     x = pf[0];
247     y = pf[1];
248     z = pf[2];
249     w = pf[3];
252 inline D3DXVECTOR4::D3DXVECTOR4(FLOAT fx, FLOAT fy, FLOAT fz, FLOAT fw)
254     x = fx;
255     y = fy;
256     z = fz;
257     w = fw;
260 inline D3DXVECTOR4::operator FLOAT* ()
262     return (FLOAT*)&x;
265 inline D3DXVECTOR4::operator CONST FLOAT* () const
267     return (CONST FLOAT*)&x;
270 inline D3DXVECTOR4& D3DXVECTOR4::operator += (CONST D3DXVECTOR4& v)
272     x += v.x;
273     y += v.y;
274     z += v.z;
275     w += v.w;
276     return *this;
279 inline D3DXVECTOR4& D3DXVECTOR4::operator -= (CONST D3DXVECTOR4& v)
281     x -= v.x;
282     y -= v.y;
283     z -= v.z;
284     w -= v.w;
285     return *this;
288 inline D3DXVECTOR4& D3DXVECTOR4::operator *= (FLOAT f)
290     x *= f;
291     y *= f;
292     z *= f;
293     w *= f;
294     return *this;
297 inline D3DXVECTOR4& D3DXVECTOR4::operator /= (FLOAT f)
299     x /= f;
300     y /= f;
301     z /= f;
302     w /= f;
303     return *this;
306 inline D3DXVECTOR4 D3DXVECTOR4::operator + () const
308     return *this;
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)
357     if(!pf) return;
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)
379     return m[row][col];
382 inline FLOAT D3DXMATRIX::operator () (UINT row, UINT col) const
384     return m[row][col];
387 inline D3DXMATRIX::operator FLOAT* ()
389     return (FLOAT*)&_11;
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);
400     return *this;
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;
409     return *this;
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;
418     return *this;
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;
427     return *this;
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;
437     return *this;
440 inline D3DXMATRIX D3DXMATRIX::operator + () const
442     return *this;
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
455     D3DXMATRIX buf;
456     D3DXMatrixMultiply(&buf, this, &mat);
457     return buf;
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)
517     if(!pf) return;
518     x = pf[0];
519     y = pf[1];
520     z = pf[2];
521     w = pf[3];
524 inline D3DXQUATERNION::D3DXQUATERNION(FLOAT fx, FLOAT fy, FLOAT fz, FLOAT fw)
526     x = fx;
527     y = fy;
528     z = fz;
529     w = fw;
532 inline D3DXQUATERNION::operator FLOAT* ()
534     return (FLOAT*)&x;
537 inline D3DXQUATERNION::operator CONST FLOAT* () const
539     return (CONST FLOAT*)&x;
542 inline D3DXQUATERNION& D3DXQUATERNION::operator += (CONST D3DXQUATERNION& quat)
544     x += quat.x;
545     y += quat.y;
546     z += quat.z;
547     w += quat.w;
548     return *this;
551 inline D3DXQUATERNION& D3DXQUATERNION::operator -= (CONST D3DXQUATERNION& quat)
553     x -= quat.x;
554     y -= quat.y;
555     z -= quat.z;
556     w -= quat.w;
557     return *this;
560 /* TODO: uncomment this when D3DXQuaternionMultiply has been implemented
561 inline D3DXQUATERNION& D3DXQUATERNION::operator *= (CONST D3DXQUATERNION& quat)
563     D3DXQuaternionMultiply(this, this, &quat);
564     return *this;
568 inline D3DXQUATERNION& D3DXQUATERNION::operator *= (FLOAT f)
570     x *= f;
571     y *= f;
572     z *= f;
573     w *= f;
574     return *this;
577 inline D3DXQUATERNION& D3DXQUATERNION::operator /= (FLOAT f)
579     FLOAT inv = 1.0f / f;
580     x *= inv;
581     y *= inv;
582     z *= inv;
583     w *= inv;
584     return *this;
587 inline D3DXQUATERNION D3DXQUATERNION::operator + () const
589     return *this;
592 inline D3DXQUATERNION D3DXQUATERNION::operator - () const
594     return D3DXQUATERNION(-x, -y, -z, -w);
597 inline D3DXQUATERNION D3DXQUATERNION::operator + (CONST D3DXQUATERNION& quat) const
599     return D3DXQUATERNION(x + quat.x, y + quat.y, z + quat.z, w + quat.w);
602 inline D3DXQUATERNION D3DXQUATERNION::operator - (CONST D3DXQUATERNION& quat) const
604     return D3DXQUATERNION(x - quat.x, y - quat.y, z - quat.z, w - quat.w);
607 /* TODO: uncomment this when D3DXQuaternionMultiply has been implemented
608 inline D3DXQUATERNION D3DXQUATERNION::operator * (CONST D3DXQUATERNION& quat) const
610     D3DXQUATERNION buf;
611     D3DXQuaternionMultiply(&buf, this, &quat);
612     return buf;
616 inline D3DXQUATERNION D3DXQUATERNION::operator * (FLOAT f) const
618     return D3DXQUATERNION(x * f, y * f, z * f, w * f);
621 inline D3DXQUATERNION D3DXQUATERNION::operator / (FLOAT f) const
623     FLOAT inv = 1.0f / f;
624     return D3DXQUATERNION(x * inv, y * inv, z * inv, w * inv);
627 inline D3DXQUATERNION operator * (FLOAT f, CONST D3DXQUATERNION& quat)
629     return D3DXQUATERNION(f * quat.x, f * quat.y, f * quat.z, f * quat.w);
632 inline BOOL D3DXQUATERNION::operator == (CONST D3DXQUATERNION& quat) const
634     return x == quat.x && y == quat.y && z == quat.z && w == quat.w;
637 inline BOOL D3DXQUATERNION::operator != (CONST D3DXQUATERNION& quat) const
639     return x != quat.x || y != quat.y || z != quat.z || w != quat.w;
642 inline D3DXPLANE::D3DXPLANE()
646 inline D3DXPLANE::D3DXPLANE(CONST FLOAT *pf)
648     if(!pf) return;
649     a = pf[0];
650     b = pf[1];
651     c = pf[2];
652     d = pf[3];
655 inline D3DXPLANE::D3DXPLANE(FLOAT fa, FLOAT fb, FLOAT fc, FLOAT fd)
657     a = fa;
658     b = fb;
659     c = fc;
660     d = fd;
663 inline D3DXPLANE::operator FLOAT* ()
665     return (FLOAT*)&a;
668 inline D3DXPLANE::operator CONST FLOAT* () const
670     return (CONST FLOAT*)&a;
673 inline D3DXPLANE D3DXPLANE::operator + () const
675     return *this;
678 inline D3DXPLANE D3DXPLANE::operator - () const
680     return D3DXPLANE(-a, -b, -c, -d);
683 inline BOOL D3DXPLANE::operator == (CONST D3DXPLANE& pl) const
685     return a == pl.a && b == pl.b && c == pl.c && d == pl.d;
688 inline BOOL D3DXPLANE::operator != (CONST D3DXPLANE& pl) const
690     return a != pl.a || b != pl.b || c != pl.c || d != pl.d;
693 inline D3DXCOLOR::D3DXCOLOR()
697 inline D3DXCOLOR::D3DXCOLOR(DWORD col)
699     CONST FLOAT f = 1.0f / 255.0f;
700     r = f * (FLOAT)(unsigned char)(col >> 16);
701     g = f * (FLOAT)(unsigned char)(col >>  8);
702     b = f * (FLOAT)(unsigned char)col;
703     a = f * (FLOAT)(unsigned char)(col >> 24);
706 inline D3DXCOLOR::D3DXCOLOR(CONST FLOAT *pf)
708     if(!pf) return;
709     r = pf[0];
710     g = pf[1];
711     b = pf[2];
712     a = pf[3];
715 inline D3DXCOLOR::D3DXCOLOR(CONST D3DCOLORVALUE& col)
717     r = col.r;
718     g = col.g;
719     b = col.b;
720     a = col.a;
723 inline D3DXCOLOR::D3DXCOLOR(FLOAT fr, FLOAT fg, FLOAT fb, FLOAT fa)
725     r = fr;
726     g = fg;
727     b = fb;
728     a = fa;
731 inline D3DXCOLOR::operator DWORD () const
733     DWORD _r = r >= 1.0f ? 0xff : r <= 0.0f ? 0x00 : (DWORD)(r * 255.0f + 0.5f);
734     DWORD _g = g >= 1.0f ? 0xff : g <= 0.0f ? 0x00 : (DWORD)(g * 255.0f + 0.5f);
735     DWORD _b = b >= 1.0f ? 0xff : b <= 0.0f ? 0x00 : (DWORD)(b * 255.0f + 0.5f);
736     DWORD _a = a >= 1.0f ? 0xff : a <= 0.0f ? 0x00 : (DWORD)(a * 255.0f + 0.5f);
738     return (_a << 24) | (_r << 16) | (_g << 8) | _b;
741 inline D3DXCOLOR::operator FLOAT * ()
743     return (FLOAT*)&r;
746 inline D3DXCOLOR::operator CONST FLOAT * () const
748     return (CONST FLOAT*)&r;
751 inline D3DXCOLOR::operator D3DCOLORVALUE * ()
753     return (D3DCOLORVALUE*)&r;
756 inline D3DXCOLOR::operator CONST D3DCOLORVALUE * () const
758     return (CONST D3DCOLORVALUE*)&r;
761 inline D3DXCOLOR::operator D3DCOLORVALUE& ()
763     return *((D3DCOLORVALUE*)&r);
766 inline D3DXCOLOR::operator CONST D3DCOLORVALUE& () const
768     return *((CONST D3DCOLORVALUE*)&r);
771 inline D3DXCOLOR& D3DXCOLOR::operator += (CONST D3DXCOLOR& col)
773     r += col.r;
774     g += col.g;
775     b += col.b;
776     a += col.a;
777     return *this;
780 inline D3DXCOLOR& D3DXCOLOR::operator -= (CONST D3DXCOLOR& col)
782     r -= col.r;
783     g -= col.g;
784     b -= col.b;
785     a -= col.a;
786     return *this;
789 inline D3DXCOLOR& D3DXCOLOR::operator *= (FLOAT f)
791     r *= f;
792     g *= f;
793     b *= f;
794     a *= f;
795     return *this;
798 inline D3DXCOLOR& D3DXCOLOR::operator /= (FLOAT f)
800     FLOAT inv = 1.0f / f;
801     r *= inv;
802     g *= inv;
803     b *= inv;
804     a *= inv;
805     return *this;
808 inline D3DXCOLOR D3DXCOLOR::operator + () const
810     return *this;
813 inline D3DXCOLOR D3DXCOLOR::operator - () const
815     return D3DXCOLOR(-r, -g, -b, -a);
818 inline D3DXCOLOR D3DXCOLOR::operator + (CONST D3DXCOLOR& col) const
820     return D3DXCOLOR(r + col.r, g + col.g, b + col.b, a + col.a);
823 inline D3DXCOLOR D3DXCOLOR::operator - (CONST D3DXCOLOR& col) const
825     return D3DXCOLOR(r - col.r, g - col.g, b - col.b, a - col.a);
828 inline D3DXCOLOR D3DXCOLOR::operator * (FLOAT f) const
830     return D3DXCOLOR(r * f, g * f, b * f, a * f);
833 inline D3DXCOLOR D3DXCOLOR::operator / (FLOAT f) const
835     FLOAT inv = 1.0f / f;
836     return D3DXCOLOR(r * inv, g * inv, b * inv, a * inv);
839 inline D3DXCOLOR operator * (FLOAT f, CONST D3DXCOLOR& col)
841     return D3DXCOLOR(f * col.r, f * col.g, f * col.b, f * col.a);
844 inline BOOL D3DXCOLOR::operator == (CONST D3DXCOLOR& col) const
846     return r == col.r && g == col.g && b == col.b && a == col.a;
849 inline BOOL D3DXCOLOR::operator != (CONST D3DXCOLOR& col) const
851     return r != col.r || g != col.g || b != col.b || a != col.a;
854 #endif /* __cplusplus */
856 /*_______________D3DXCOLOR_____________________*/
858 static inline D3DXCOLOR* D3DXColorAdd(D3DXCOLOR *pout, CONST D3DXCOLOR *pc1, CONST D3DXCOLOR *pc2)
860     if ( !pout || !pc1 || !pc2 ) return NULL;
861     pout->r = (pc1->r) + (pc2->r);
862     pout->g = (pc1->g) + (pc2->g);
863     pout->b = (pc1->b) + (pc2->b);
864     pout->a = (pc1->a) + (pc2->a);
865     return pout;
868 static inline D3DXCOLOR* D3DXColorLerp(D3DXCOLOR *pout, CONST D3DXCOLOR *pc1, CONST D3DXCOLOR *pc2, FLOAT s)
870     if ( !pout || !pc1 || !pc2 ) return NULL;
871     pout->r = (1-s) * (pc1->r) + s *(pc2->r);
872     pout->g = (1-s) * (pc1->g) + s *(pc2->g);
873     pout->b = (1-s) * (pc1->b) + s *(pc2->b);
874     pout->a = (1-s) * (pc1->a) + s *(pc2->a);
875     return pout;
878 static inline D3DXCOLOR* D3DXColorModulate(D3DXCOLOR *pout, CONST D3DXCOLOR *pc1, CONST D3DXCOLOR *pc2)
880     if ( !pout || !pc1 || !pc2 ) return NULL;
881     pout->r = (pc1->r) * (pc2->r);
882     pout->g = (pc1->g) * (pc2->g);
883     pout->b = (pc1->b) * (pc2->b);
884     pout->a = (pc1->a) * (pc2->a);
885     return pout;
888 static inline D3DXCOLOR* D3DXColorNegative(D3DXCOLOR *pout, CONST D3DXCOLOR *pc)
890     if ( !pout || !pc ) return NULL;
891     pout->r = 1.0f - pc->r;
892     pout->g = 1.0f - pc->g;
893     pout->b = 1.0f - pc->b;
894     pout->a = pc->a;
895     return pout;
898 static inline D3DXCOLOR* D3DXColorScale(D3DXCOLOR *pout, CONST D3DXCOLOR *pc, FLOAT s)
900     if ( !pout || !pc ) return NULL;
901     pout->r = s* (pc->r);
902     pout->g = s* (pc->g);
903     pout->b = s* (pc->b);
904     pout->a = s* (pc->a);
905     return pout;
908 static inline D3DXCOLOR* D3DXColorSubtract(D3DXCOLOR *pout, CONST D3DXCOLOR *pc1, CONST D3DXCOLOR *pc2)
910     if ( !pout || !pc1 || !pc2 ) return NULL;
911     pout->r = (pc1->r) - (pc2->r);
912     pout->g = (pc1->g) - (pc2->g);
913     pout->b = (pc1->b) - (pc2->b);
914     pout->a = (pc1->a) - (pc2->a);
915     return pout;
918 /*_______________D3DXVECTOR2________________________*/
920 static inline D3DXVECTOR2* D3DXVec2Add(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2)
922     if ( !pout || !pv1 || !pv2) return NULL;
923     pout->x = pv1->x + pv2->x;
924     pout->y = pv1->y + pv2->y;
925     return pout;
928 static inline FLOAT D3DXVec2CCW(CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2)
930     if ( !pv1 || !pv2) return 0.0f;
931     return ( (pv1->x) * (pv2->y) - (pv1->y) * (pv2->x) );
934 static inline FLOAT D3DXVec2Dot(CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2)
936     if ( !pv1 || !pv2) return 0.0f;
937     return ( (pv1->x * pv2->x + pv1->y * pv2->y) );
940 static inline FLOAT D3DXVec2Length(CONST D3DXVECTOR2 *pv)
942     if (!pv) return 0.0f;
943     return sqrt( (pv->x) * (pv->x) + (pv->y) * (pv->y) );
946 static inline FLOAT D3DXVec2LengthSq(CONST D3DXVECTOR2 *pv)
948     if (!pv) return 0.0f;
949     return( (pv->x) * (pv->x) + (pv->y) * (pv->y) );
952 static inline D3DXVECTOR2* D3DXVec2Lerp(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2, FLOAT s)
954     if ( !pout || !pv1 || !pv2) return NULL;
955     pout->x = (1-s) * (pv1->x) + s * (pv2->x);
956     pout->y = (1-s) * (pv1->y) + s * (pv2->y);
957     return pout;
960 static inline D3DXVECTOR2* D3DXVec2Maximize(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2)
962     if ( !pout || !pv1 || !pv2) return NULL;
963     pout->x = max(pv1->x , pv2->x);
964     pout->y = max(pv1->y , pv2->y);
965     return pout;
968 static inline D3DXVECTOR2* D3DXVec2Minimize(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2)
970     if ( !pout || !pv1 || !pv2) return NULL;
971     pout->x = min(pv1->x , pv2->x);
972     pout->y = min(pv1->y , pv2->y);
973     return pout;
976 static inline D3DXVECTOR2* D3DXVec2Scale(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv, FLOAT s)
978     if ( !pout || !pv) return NULL;
979     pout->x = s * (pv->x);
980     pout->y = s * (pv->y);
981     return pout;
984 static inline D3DXVECTOR2* D3DXVec2Subtract(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2)
986     if ( !pout || !pv1 || !pv2) return NULL;
987     pout->x = pv1->x - pv2->x;
988     pout->y = pv1->y - pv2->y;
989     return pout;
992 /*__________________D3DXVECTOR3_______________________*/
994 static inline D3DXVECTOR3* D3DXVec3Add(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
996     if ( !pout || !pv1 || !pv2) return NULL;
997     pout->x = pv1->x + pv2->x;
998     pout->y = pv1->y + pv2->y;
999     pout->z = pv1->z + pv2->z;
1000     return pout;
1003 static inline D3DXVECTOR3* D3DXVec3Cross(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
1005     if ( !pout || !pv1 || !pv2) return NULL;
1006     pout->x = (pv1->y) * (pv2->z) - (pv1->z) * (pv2->y);
1007     pout->y = (pv1->z) * (pv2->x) - (pv1->x) * (pv2->z);
1008     pout->z = (pv1->x) * (pv2->y) - (pv1->y) * (pv2->x);
1009     return pout;
1012 static inline FLOAT D3DXVec3Dot(CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
1014     if ( !pv1 || !pv2 ) return 0.0f;
1015     return (pv1->x) * (pv2->x) + (pv1->y) * (pv2->y) + (pv1->z) * (pv2->z);
1018 static inline FLOAT D3DXVec3Length(CONST D3DXVECTOR3 *pv)
1020     if (!pv) return 0.0f;
1021     return sqrt( (pv->x) * (pv->x) + (pv->y) * (pv->y) + (pv->z) * (pv->z) );
1024 static inline FLOAT D3DXVec3LengthSq(CONST D3DXVECTOR3 *pv)
1026     if (!pv) return 0.0f;
1027     return (pv->x) * (pv->x) + (pv->y) * (pv->y) + (pv->z) * (pv->z);
1030 static inline D3DXVECTOR3* D3DXVec3Lerp(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2, FLOAT s)
1032     if ( !pout || !pv1 || !pv2) return NULL;
1033     pout->x = (1-s) * (pv1->x) + s * (pv2->x);
1034     pout->y = (1-s) * (pv1->y) + s * (pv2->y);
1035     pout->z = (1-s) * (pv1->z) + s * (pv2->z);
1036     return pout;
1039 static inline D3DXVECTOR3* D3DXVec3Maximize(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
1041     if ( !pout || !pv1 || !pv2) return NULL;
1042     pout->x = max(pv1->x , pv2->x);
1043     pout->y = max(pv1->y , pv2->y);
1044     pout->z = max(pv1->z , pv2->z);
1045     return pout;
1048 static inline D3DXVECTOR3* D3DXVec3Minimize(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
1050     if ( !pout || !pv1 || !pv2) return NULL;
1051     pout->x = min(pv1->x , pv2->x);
1052     pout->y = min(pv1->y , pv2->y);
1053     pout->z = min(pv1->z , pv2->z);
1054     return pout;
1057 static inline D3DXVECTOR3* D3DXVec3Scale(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv, FLOAT s)
1059     if ( !pout || !pv) return NULL;
1060     pout->x = s * (pv->x);
1061     pout->y = s * (pv->y);
1062     pout->z = s * (pv->z);
1063     return pout;
1066 static inline D3DXVECTOR3* D3DXVec3Subtract(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
1068     if ( !pout || !pv1 || !pv2) return NULL;
1069     pout->x = pv1->x - pv2->x;
1070     pout->y = pv1->y - pv2->y;
1071     pout->z = pv1->z - pv2->z;
1072     return pout;
1074 /*__________________D3DXVECTOR4_______________________*/
1076 static inline D3DXVECTOR4* D3DXVec4Add(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2)
1078     if ( !pout || !pv1 || !pv2) return NULL;
1079     pout->x = pv1->x + pv2->x;
1080     pout->y = pv1->y + pv2->y;
1081     pout->z = pv1->z + pv2->z;
1082     pout->w = pv1->w + pv2->w;
1083     return pout;
1086 static inline FLOAT D3DXVec4Dot(CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2)
1088     if (!pv1 || !pv2 ) return 0.0f;
1089     return (pv1->x) * (pv2->x) + (pv1->y) * (pv2->y) + (pv1->z) * (pv2->z) + (pv1->w) * (pv2->w);
1092 static inline FLOAT D3DXVec4Length(CONST D3DXVECTOR4 *pv)
1094     if (!pv) return 0.0f;
1095     return sqrt( (pv->x) * (pv->x) + (pv->y) * (pv->y) + (pv->z) * (pv->z) + (pv->w) * (pv->w) );
1098 static inline FLOAT D3DXVec4LengthSq(CONST D3DXVECTOR4 *pv)
1100     if (!pv) return 0.0f;
1101     return (pv->x) * (pv->x) + (pv->y) * (pv->y) + (pv->z) * (pv->z) + (pv->w) * (pv->w);
1104 static inline D3DXVECTOR4* D3DXVec4Lerp(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2, FLOAT s)
1106     if ( !pout || !pv1 || !pv2) return NULL;
1107     pout->x = (1-s) * (pv1->x) + s * (pv2->x);
1108     pout->y = (1-s) * (pv1->y) + s * (pv2->y);
1109     pout->z = (1-s) * (pv1->z) + s * (pv2->z);
1110     pout->w = (1-s) * (pv1->w) + s * (pv2->w);
1111     return pout;
1115 static inline D3DXVECTOR4* D3DXVec4Maximize(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2)
1117     if ( !pout || !pv1 || !pv2) return NULL;
1118     pout->x = max(pv1->x , pv2->x);
1119     pout->y = max(pv1->y , pv2->y);
1120     pout->z = max(pv1->z , pv2->z);
1121     pout->w = max(pv1->w , pv2->w);
1122     return pout;
1125 static inline D3DXVECTOR4* D3DXVec4Minimize(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2)
1127     if ( !pout || !pv1 || !pv2) return NULL;
1128     pout->x = min(pv1->x , pv2->x);
1129     pout->y = min(pv1->y , pv2->y);
1130     pout->z = min(pv1->z , pv2->z);
1131     pout->w = min(pv1->w , pv2->w);
1132     return pout;
1135 static inline D3DXVECTOR4* D3DXVec4Scale(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv, FLOAT s)
1137     if ( !pout || !pv) return NULL;
1138     pout->x = s * (pv->x);
1139     pout->y = s * (pv->y);
1140     pout->z = s * (pv->z);
1141     pout->w = s * (pv->w);
1142     return pout;
1145 static inline D3DXVECTOR4* D3DXVec4Subtract(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2)
1147     if ( !pout || !pv1 || !pv2) return NULL;
1148     pout->x = pv1->x - pv2->x;
1149     pout->y = pv1->y - pv2->y;
1150     pout->z = pv1->z - pv2->z;
1151     pout->w = pv1->w - pv2->w;
1152     return pout;
1155 /*__________________D3DXMatrix____________________*/
1156 #ifdef NONAMELESSUNION
1157 # define D3DX_U(x)  (x).u
1158 #else
1159 # define D3DX_U(x)  (x)
1160 #endif
1162 static inline D3DXMATRIX* D3DXMatrixIdentity(D3DXMATRIX *pout)
1164     if ( !pout ) return NULL;
1165     D3DX_U(*pout).m[0][1] = 0.0f;
1166     D3DX_U(*pout).m[0][2] = 0.0f;
1167     D3DX_U(*pout).m[0][3] = 0.0f;
1168     D3DX_U(*pout).m[1][0] = 0.0f;
1169     D3DX_U(*pout).m[1][2] = 0.0f;
1170     D3DX_U(*pout).m[1][3] = 0.0f;
1171     D3DX_U(*pout).m[2][0] = 0.0f;
1172     D3DX_U(*pout).m[2][1] = 0.0f;
1173     D3DX_U(*pout).m[2][3] = 0.0f;
1174     D3DX_U(*pout).m[3][0] = 0.0f;
1175     D3DX_U(*pout).m[3][1] = 0.0f;
1176     D3DX_U(*pout).m[3][2] = 0.0f;
1177     D3DX_U(*pout).m[0][0] = 1.0f;
1178     D3DX_U(*pout).m[1][1] = 1.0f;
1179     D3DX_U(*pout).m[2][2] = 1.0f;
1180     D3DX_U(*pout).m[3][3] = 1.0f;
1181     return pout;
1184 static inline BOOL D3DXMatrixIsIdentity(D3DXMATRIX *pm)
1186     int i,j;
1187     D3DXMATRIX testmatrix;
1189     if ( !pm ) return FALSE;
1190     D3DXMatrixIdentity(&testmatrix);
1191     for (i=0; i<4; i++)
1192     {
1193      for (j=0; j<4; j++)
1194      {
1195       if ( D3DX_U(*pm).m[i][j] != D3DX_U(testmatrix).m[i][j] ) return FALSE;
1196      }
1197     }
1198     return TRUE;
1200 #undef D3DX_U
1202 /*__________________D3DXPLANE____________________*/
1204 static inline FLOAT D3DXPlaneDot(CONST D3DXPLANE *pp, CONST D3DXVECTOR4 *pv)
1206     if ( !pp || !pv ) return 0.0f;
1207     return ( (pp->a) * (pv->x) + (pp->b) * (pv->y) + (pp->c) * (pv->z) + (pp->d) * (pv->w) );
1210 static inline FLOAT D3DXPlaneDotCoord(CONST D3DXPLANE *pp, CONST D3DXVECTOR4 *pv)
1212     if ( !pp || !pv ) return 0.0f;
1213     return ( (pp->a) * (pv->x) + (pp->b) * (pv->y) + (pp->c) * (pv->z) + (pp->d) );
1216 static inline FLOAT D3DXPlaneDotNormal(CONST D3DXPLANE *pp, CONST D3DXVECTOR4 *pv)
1218     if ( !pp || !pv ) return 0.0f;
1219     return ( (pp->a) * (pv->x) + (pp->b) * (pv->y) + (pp->c) * (pv->z) );
1222 /*__________________D3DXQUATERNION____________________*/
1224 static inline D3DXQUATERNION* D3DXQuaternionConjugate(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq)
1226     if ( !pout || !pq) return NULL;
1227     pout->x = -pq->x;
1228     pout->y = -pq->y;
1229     pout->z = -pq->z;
1230     pout->w = pq->w;
1231     return pout;
1234 static inline FLOAT D3DXQuaternionDot(CONST D3DXQUATERNION *pq1, CONST D3DXQUATERNION *pq2)
1236     if ( !pq1 || !pq2 ) return 0.0f;
1237     return (pq1->x) * (pq2->x) + (pq1->y) * (pq2->y) + (pq1->z) * (pq2->z) + (pq1->w) * (pq2->w);
1240 static inline D3DXQUATERNION* D3DXQuaternionIdentity(D3DXQUATERNION *pout)
1242     if ( !pout) return NULL;
1243     pout->x = 0.0f;
1244     pout->y = 0.0f;
1245     pout->z = 0.0f;
1246     pout->w = 1.0f;
1247     return pout;
1250 static inline BOOL D3DXQuaternionIsIdentity(D3DXQUATERNION *pq)
1252     if ( !pq) return FALSE;
1253     return ( (pq->x == 0.0f) && (pq->y == 0.0f) && (pq->z == 0.0f) && (pq->w == 1.0f) );
1256 static inline FLOAT D3DXQuaternionLength(CONST D3DXQUATERNION *pq)
1258     if (!pq) return 0.0f;
1259     return sqrt( (pq->x) * (pq->x) + (pq->y) * (pq->y) + (pq->z) * (pq->z) + (pq->w) * (pq->w) );
1262 static inline FLOAT D3DXQuaternionLengthSq(CONST D3DXQUATERNION *pq)
1264     if (!pq) return 0.0f;
1265     return (pq->x) * (pq->x) + (pq->y) * (pq->y) + (pq->z) * (pq->z) + (pq->w) * (pq->w);
1268 #endif