/[cvs]/api/include/d3dx8math.inl
ViewVC logotype

Annotation of /api/include/d3dx8math.inl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations)
Sun Jul 1 20:47:59 2001 UTC (23 years, 4 months ago) by bearsoft
Branch point for: lazy, MAIN
Initial revision

1 bearsoft 1.1 //////////////////////////////////////////////////////////////////////////////
2     //
3     // Copyright (C) 1998 Microsoft Corporation. All Rights Reserved.
4     //
5     // File: d3dx8math.inl
6     // Content: D3DX math inline functions
7     //
8     //////////////////////////////////////////////////////////////////////////////
9    
10     #ifndef __D3DX8MATH_INL__
11     #define __D3DX8MATH_INL__
12    
13    
14     //===========================================================================
15     //
16     // Inline Class Methods
17     //
18     //===========================================================================
19    
20     #ifdef __cplusplus
21    
22     //--------------------------
23     // 2D Vector
24     //--------------------------
25    
26     D3DXINLINE
27     D3DXVECTOR2::D3DXVECTOR2( CONST FLOAT *pf )
28     {
29     #ifdef D3DX_DEBUG
30     if(!pf)
31     return;
32     #endif
33    
34     x = pf[0];
35     y = pf[1];
36     }
37    
38     D3DXINLINE
39     D3DXVECTOR2::D3DXVECTOR2( FLOAT fx, FLOAT fy )
40     {
41     x = fx;
42     y = fy;
43     }
44    
45     // casting
46     D3DXINLINE
47     D3DXVECTOR2::operator FLOAT* ()
48     {
49     return (FLOAT *) &x;
50     }
51    
52     D3DXINLINE
53     D3DXVECTOR2::operator CONST FLOAT* () const
54     {
55     return (CONST FLOAT *) &x;
56     }
57    
58     // assignment operators
59     D3DXINLINE D3DXVECTOR2&
60     D3DXVECTOR2::operator += ( CONST D3DXVECTOR2& v )
61     {
62     x += v.x;
63     y += v.y;
64     return *this;
65     }
66    
67     D3DXINLINE D3DXVECTOR2&
68     D3DXVECTOR2::operator -= ( CONST D3DXVECTOR2& v )
69     {
70     x -= v.x;
71     y -= v.y;
72     return *this;
73     }
74    
75     D3DXINLINE D3DXVECTOR2&
76     D3DXVECTOR2::operator *= ( FLOAT f )
77     {
78     x *= f;
79     y *= f;
80     return *this;
81     }
82    
83     D3DXINLINE D3DXVECTOR2&
84     D3DXVECTOR2::operator /= ( FLOAT f )
85     {
86     FLOAT fInv = 1.0f / f;
87     x *= fInv;
88     y *= fInv;
89     return *this;
90     }
91    
92     // unary operators
93     D3DXINLINE D3DXVECTOR2
94     D3DXVECTOR2::operator + () const
95     {
96     return *this;
97     }
98    
99     D3DXINLINE D3DXVECTOR2
100     D3DXVECTOR2::operator - () const
101     {
102     return D3DXVECTOR2(-x, -y);
103     }
104    
105     // binary operators
106     D3DXINLINE D3DXVECTOR2
107     D3DXVECTOR2::operator + ( CONST D3DXVECTOR2& v ) const
108     {
109     return D3DXVECTOR2(x + v.x, y + v.y);
110     }
111    
112     D3DXINLINE D3DXVECTOR2
113     D3DXVECTOR2::operator - ( CONST D3DXVECTOR2& v ) const
114     {
115     return D3DXVECTOR2(x - v.x, y - v.y);
116     }
117    
118     D3DXINLINE D3DXVECTOR2
119     D3DXVECTOR2::operator * ( FLOAT f ) const
120     {
121     return D3DXVECTOR2(x * f, y * f);
122     }
123    
124     D3DXINLINE D3DXVECTOR2
125     D3DXVECTOR2::operator / ( FLOAT f ) const
126     {
127     FLOAT fInv = 1.0f / f;
128     return D3DXVECTOR2(x * fInv, y * fInv);
129     }
130    
131    
132     D3DXINLINE D3DXVECTOR2
133     operator * ( FLOAT f, CONST D3DXVECTOR2& v )
134     {
135     return D3DXVECTOR2(f * v.x, f * v.y);
136     }
137    
138     D3DXINLINE BOOL
139     D3DXVECTOR2::operator == ( CONST D3DXVECTOR2& v ) const
140     {
141     return x == v.x && y == v.y;
142     }
143    
144     D3DXINLINE BOOL
145     D3DXVECTOR2::operator != ( CONST D3DXVECTOR2& v ) const
146     {
147     return x != v.x || y != v.y;
148     }
149    
150    
151    
152    
153     //--------------------------
154     // 3D Vector
155     //--------------------------
156     D3DXINLINE
157     D3DXVECTOR3::D3DXVECTOR3( CONST FLOAT *pf )
158     {
159     #ifdef D3DX_DEBUG
160     if(!pf)
161     return;
162     #endif
163    
164     x = pf[0];
165     y = pf[1];
166     z = pf[2];
167     }
168    
169     D3DXINLINE
170     D3DXVECTOR3::D3DXVECTOR3( CONST D3DVECTOR& v )
171     {
172     x = v.x;
173     y = v.y;
174     z = v.z;
175     }
176    
177     D3DXINLINE
178     D3DXVECTOR3::D3DXVECTOR3( FLOAT fx, FLOAT fy, FLOAT fz )
179     {
180     x = fx;
181     y = fy;
182     z = fz;
183     }
184    
185    
186     // casting
187     D3DXINLINE
188     D3DXVECTOR3::operator FLOAT* ()
189     {
190     return (FLOAT *) &x;
191     }
192    
193     D3DXINLINE
194     D3DXVECTOR3::operator CONST FLOAT* () const
195     {
196     return (CONST FLOAT *) &x;
197     }
198    
199    
200     // assignment operators
201     D3DXINLINE D3DXVECTOR3&
202     D3DXVECTOR3::operator += ( CONST D3DXVECTOR3& v )
203     {
204     x += v.x;
205     y += v.y;
206     z += v.z;
207     return *this;
208     }
209    
210     D3DXINLINE D3DXVECTOR3&
211     D3DXVECTOR3::operator -= ( CONST D3DXVECTOR3& v )
212     {
213     x -= v.x;
214     y -= v.y;
215     z -= v.z;
216     return *this;
217     }
218    
219     D3DXINLINE D3DXVECTOR3&
220     D3DXVECTOR3::operator *= ( FLOAT f )
221     {
222     x *= f;
223     y *= f;
224     z *= f;
225     return *this;
226     }
227    
228     D3DXINLINE D3DXVECTOR3&
229     D3DXVECTOR3::operator /= ( FLOAT f )
230     {
231     FLOAT fInv = 1.0f / f;
232     x *= fInv;
233     y *= fInv;
234     z *= fInv;
235     return *this;
236     }
237    
238    
239     // unary operators
240     D3DXINLINE D3DXVECTOR3
241     D3DXVECTOR3::operator + () const
242     {
243     return *this;
244     }
245    
246     D3DXINLINE D3DXVECTOR3
247     D3DXVECTOR3::operator - () const
248     {
249     return D3DXVECTOR3(-x, -y, -z);
250     }
251    
252    
253     // binary operators
254     D3DXINLINE D3DXVECTOR3
255     D3DXVECTOR3::operator + ( CONST D3DXVECTOR3& v ) const
256     {
257     return D3DXVECTOR3(x + v.x, y + v.y, z + v.z);
258     }
259    
260     D3DXINLINE D3DXVECTOR3
261     D3DXVECTOR3::operator - ( CONST D3DXVECTOR3& v ) const
262     {
263     return D3DXVECTOR3(x - v.x, y - v.y, z - v.z);
264     }
265    
266     D3DXINLINE D3DXVECTOR3
267     D3DXVECTOR3::operator * ( FLOAT f ) const
268     {
269     return D3DXVECTOR3(x * f, y * f, z * f);
270     }
271    
272     D3DXINLINE D3DXVECTOR3
273     D3DXVECTOR3::operator / ( FLOAT f ) const
274     {
275     FLOAT fInv = 1.0f / f;
276     return D3DXVECTOR3(x * fInv, y * fInv, z * fInv);
277     }
278    
279    
280     D3DXINLINE D3DXVECTOR3
281     operator * ( FLOAT f, CONST struct D3DXVECTOR3& v )
282     {
283     return D3DXVECTOR3(f * v.x, f * v.y, f * v.z);
284     }
285    
286    
287     D3DXINLINE BOOL
288     D3DXVECTOR3::operator == ( CONST D3DXVECTOR3& v ) const
289     {
290     return x == v.x && y == v.y && z == v.z;
291     }
292    
293     D3DXINLINE BOOL
294     D3DXVECTOR3::operator != ( CONST D3DXVECTOR3& v ) const
295     {
296     return x != v.x || y != v.y || z != v.z;
297     }
298    
299    
300    
301     //--------------------------
302     // 4D Vector
303     //--------------------------
304     D3DXINLINE
305     D3DXVECTOR4::D3DXVECTOR4( CONST FLOAT *pf )
306     {
307     #ifdef D3DX_DEBUG
308     if(!pf)
309     return;
310     #endif
311    
312     x = pf[0];
313     y = pf[1];
314     z = pf[2];
315     w = pf[3];
316     }
317    
318     D3DXINLINE
319     D3DXVECTOR4::D3DXVECTOR4( FLOAT fx, FLOAT fy, FLOAT fz, FLOAT fw )
320     {
321     x = fx;
322     y = fy;
323     z = fz;
324     w = fw;
325     }
326    
327    
328     // casting
329     D3DXINLINE
330     D3DXVECTOR4::operator FLOAT* ()
331     {
332     return (FLOAT *) &x;
333     }
334    
335     D3DXINLINE
336     D3DXVECTOR4::operator CONST FLOAT* () const
337     {
338     return (CONST FLOAT *) &x;
339     }
340    
341    
342     // assignment operators
343     D3DXINLINE D3DXVECTOR4&
344     D3DXVECTOR4::operator += ( CONST D3DXVECTOR4& v )
345     {
346     x += v.x;
347     y += v.y;
348     z += v.z;
349     w += v.w;
350     return *this;
351     }
352    
353     D3DXINLINE D3DXVECTOR4&
354     D3DXVECTOR4::operator -= ( CONST D3DXVECTOR4& v )
355     {
356     x -= v.x;
357     y -= v.y;
358     z -= v.z;
359     w -= v.w;
360     return *this;
361     }
362    
363     D3DXINLINE D3DXVECTOR4&
364     D3DXVECTOR4::operator *= ( FLOAT f )
365     {
366     x *= f;
367     y *= f;
368     z *= f;
369     w *= f;
370     return *this;
371     }
372    
373     D3DXINLINE D3DXVECTOR4&
374     D3DXVECTOR4::operator /= ( FLOAT f )
375     {
376     FLOAT fInv = 1.0f / f;
377     x *= fInv;
378     y *= fInv;
379     z *= fInv;
380     w *= fInv;
381     return *this;
382     }
383    
384    
385     // unary operators
386     D3DXINLINE D3DXVECTOR4
387     D3DXVECTOR4::operator + () const
388     {
389     return *this;
390     }
391    
392     D3DXINLINE D3DXVECTOR4
393     D3DXVECTOR4::operator - () const
394     {
395     return D3DXVECTOR4(-x, -y, -z, -w);
396     }
397    
398    
399     // binary operators
400     D3DXINLINE D3DXVECTOR4
401     D3DXVECTOR4::operator + ( CONST D3DXVECTOR4& v ) const
402     {
403     return D3DXVECTOR4(x + v.x, y + v.y, z + v.z, w + v.w);
404     }
405    
406     D3DXINLINE D3DXVECTOR4
407     D3DXVECTOR4::operator - ( CONST D3DXVECTOR4& v ) const
408     {
409     return D3DXVECTOR4(x - v.x, y - v.y, z - v.z, w - v.w);
410     }
411    
412     D3DXINLINE D3DXVECTOR4
413     D3DXVECTOR4::operator * ( FLOAT f ) const
414     {
415     return D3DXVECTOR4(x * f, y * f, z * f, w * f);
416     }
417    
418     D3DXINLINE D3DXVECTOR4
419     D3DXVECTOR4::operator / ( FLOAT f ) const
420     {
421     FLOAT fInv = 1.0f / f;
422     return D3DXVECTOR4(x * fInv, y * fInv, z * fInv, w * fInv);
423     }
424    
425    
426     D3DXINLINE D3DXVECTOR4
427     operator * ( FLOAT f, CONST D3DXVECTOR4& v )
428     {
429     return D3DXVECTOR4(f * v.x, f * v.y, f * v.z, f * v.w);
430     }
431    
432    
433     D3DXINLINE BOOL
434     D3DXVECTOR4::operator == ( CONST D3DXVECTOR4& v ) const
435     {
436     return x == v.x && y == v.y && z == v.z && w == v.w;
437     }
438    
439     D3DXINLINE BOOL
440     D3DXVECTOR4::operator != ( CONST D3DXVECTOR4& v ) const
441     {
442     return x != v.x || y != v.y || z != v.z || w != v.w;
443     }
444    
445    
446     //--------------------------
447     // Matrix
448     //--------------------------
449     D3DXINLINE
450     D3DXMATRIX::D3DXMATRIX( CONST FLOAT* pf )
451     {
452     #ifdef D3DX_DEBUG
453     if(!pf)
454     return;
455     #endif
456    
457     memcpy(&_11, pf, sizeof(D3DXMATRIX));
458     }
459    
460     D3DXINLINE
461     D3DXMATRIX::D3DXMATRIX( CONST D3DMATRIX& mat )
462     {
463     memcpy(&_11, &mat, sizeof(D3DXMATRIX));
464     }
465    
466     D3DXINLINE
467     D3DXMATRIX::D3DXMATRIX( FLOAT f11, FLOAT f12, FLOAT f13, FLOAT f14,
468     FLOAT f21, FLOAT f22, FLOAT f23, FLOAT f24,
469     FLOAT f31, FLOAT f32, FLOAT f33, FLOAT f34,
470     FLOAT f41, FLOAT f42, FLOAT f43, FLOAT f44 )
471     {
472     _11 = f11; _12 = f12; _13 = f13; _14 = f14;
473     _21 = f21; _22 = f22; _23 = f23; _24 = f24;
474     _31 = f31; _32 = f32; _33 = f33; _34 = f34;
475     _41 = f41; _42 = f42; _43 = f43; _44 = f44;
476     }
477    
478    
479    
480     // access grants
481     D3DXINLINE FLOAT&
482     D3DXMATRIX::operator () ( UINT iRow, UINT iCol )
483     {
484     return m[iRow][iCol];
485     }
486    
487     D3DXINLINE FLOAT
488     D3DXMATRIX::operator () ( UINT iRow, UINT iCol ) const
489     {
490     return m[iRow][iCol];
491     }
492    
493    
494     // casting operators
495     D3DXINLINE
496     D3DXMATRIX::operator FLOAT* ()
497     {
498     return (FLOAT *) &_11;
499     }
500    
501     D3DXINLINE
502     D3DXMATRIX::operator CONST FLOAT* () const
503     {
504     return (CONST FLOAT *) &_11;
505     }
506    
507    
508     // assignment operators
509     D3DXINLINE D3DXMATRIX&
510     D3DXMATRIX::operator *= ( CONST D3DXMATRIX& mat )
511     {
512     D3DXMatrixMultiply(this, this, &mat);
513     return *this;
514     }
515    
516     D3DXINLINE D3DXMATRIX&
517     D3DXMATRIX::operator += ( CONST D3DXMATRIX& mat )
518     {
519     _11 += mat._11; _12 += mat._12; _13 += mat._13; _14 += mat._14;
520     _21 += mat._21; _22 += mat._22; _23 += mat._23; _24 += mat._24;
521     _31 += mat._31; _32 += mat._32; _33 += mat._33; _34 += mat._34;
522     _41 += mat._41; _42 += mat._42; _43 += mat._43; _44 += mat._44;
523     return *this;
524     }
525    
526     D3DXINLINE D3DXMATRIX&
527     D3DXMATRIX::operator -= ( CONST D3DXMATRIX& mat )
528     {
529     _11 -= mat._11; _12 -= mat._12; _13 -= mat._13; _14 -= mat._14;
530     _21 -= mat._21; _22 -= mat._22; _23 -= mat._23; _24 -= mat._24;
531     _31 -= mat._31; _32 -= mat._32; _33 -= mat._33; _34 -= mat._34;
532     _41 -= mat._41; _42 -= mat._42; _43 -= mat._43; _44 -= mat._44;
533     return *this;
534     }
535    
536     D3DXINLINE D3DXMATRIX&
537     D3DXMATRIX::operator *= ( FLOAT f )
538     {
539     _11 *= f; _12 *= f; _13 *= f; _14 *= f;
540     _21 *= f; _22 *= f; _23 *= f; _24 *= f;
541     _31 *= f; _32 *= f; _33 *= f; _34 *= f;
542     _41 *= f; _42 *= f; _43 *= f; _44 *= f;
543     return *this;
544     }
545    
546     D3DXINLINE D3DXMATRIX&
547     D3DXMATRIX::operator /= ( FLOAT f )
548     {
549     FLOAT fInv = 1.0f / f;
550     _11 *= fInv; _12 *= fInv; _13 *= fInv; _14 *= fInv;
551     _21 *= fInv; _22 *= fInv; _23 *= fInv; _24 *= fInv;
552     _31 *= fInv; _32 *= fInv; _33 *= fInv; _34 *= fInv;
553     _41 *= fInv; _42 *= fInv; _43 *= fInv; _44 *= fInv;
554     return *this;
555     }
556    
557    
558     // unary operators
559     D3DXINLINE D3DXMATRIX
560     D3DXMATRIX::operator + () const
561     {
562     return *this;
563     }
564    
565     D3DXINLINE D3DXMATRIX
566     D3DXMATRIX::operator - () const
567     {
568     return D3DXMATRIX(-_11, -_12, -_13, -_14,
569     -_21, -_22, -_23, -_24,
570     -_31, -_32, -_33, -_34,
571     -_41, -_42, -_43, -_44);
572     }
573    
574    
575     // binary operators
576     D3DXINLINE D3DXMATRIX
577     D3DXMATRIX::operator * ( CONST D3DXMATRIX& mat ) const
578     {
579     D3DXMATRIX matT;
580     D3DXMatrixMultiply(&matT, this, &mat);
581     return matT;
582     }
583    
584     D3DXINLINE D3DXMATRIX
585     D3DXMATRIX::operator + ( CONST D3DXMATRIX& mat ) const
586     {
587     return D3DXMATRIX(_11 + mat._11, _12 + mat._12, _13 + mat._13, _14 + mat._14,
588     _21 + mat._21, _22 + mat._22, _23 + mat._23, _24 + mat._24,
589     _31 + mat._31, _32 + mat._32, _33 + mat._33, _34 + mat._34,
590     _41 + mat._41, _42 + mat._42, _43 + mat._43, _44 + mat._44);
591     }
592    
593     D3DXINLINE D3DXMATRIX
594     D3DXMATRIX::operator - ( CONST D3DXMATRIX& mat ) const
595     {
596     return D3DXMATRIX(_11 - mat._11, _12 - mat._12, _13 - mat._13, _14 - mat._14,
597     _21 - mat._21, _22 - mat._22, _23 - mat._23, _24 - mat._24,
598     _31 - mat._31, _32 - mat._32, _33 - mat._33, _34 - mat._34,
599     _41 - mat._41, _42 - mat._42, _43 - mat._43, _44 - mat._44);
600     }
601    
602     D3DXINLINE D3DXMATRIX
603     D3DXMATRIX::operator * ( FLOAT f ) const
604     {
605     return D3DXMATRIX(_11 * f, _12 * f, _13 * f, _14 * f,
606     _21 * f, _22 * f, _23 * f, _24 * f,
607     _31 * f, _32 * f, _33 * f, _34 * f,
608     _41 * f, _42 * f, _43 * f, _44 * f);
609     }
610    
611     D3DXINLINE D3DXMATRIX
612     D3DXMATRIX::operator / ( FLOAT f ) const
613     {
614     FLOAT fInv = 1.0f / f;
615     return D3DXMATRIX(_11 * fInv, _12 * fInv, _13 * fInv, _14 * fInv,
616     _21 * fInv, _22 * fInv, _23 * fInv, _24 * fInv,
617     _31 * fInv, _32 * fInv, _33 * fInv, _34 * fInv,
618     _41 * fInv, _42 * fInv, _43 * fInv, _44 * fInv);
619     }
620    
621    
622     D3DXINLINE D3DXMATRIX
623     operator * ( FLOAT f, CONST D3DXMATRIX& mat )
624     {
625     return D3DXMATRIX(f * mat._11, f * mat._12, f * mat._13, f * mat._14,
626     f * mat._21, f * mat._22, f * mat._23, f * mat._24,
627     f * mat._31, f * mat._32, f * mat._33, f * mat._34,
628     f * mat._41, f * mat._42, f * mat._43, f * mat._44);
629     }
630    
631    
632     D3DXINLINE BOOL
633     D3DXMATRIX::operator == ( CONST D3DXMATRIX& mat ) const
634     {
635     return 0 == memcmp(this, &mat, sizeof(D3DXMATRIX));
636     }
637    
638     D3DXINLINE BOOL
639     D3DXMATRIX::operator != ( CONST D3DXMATRIX& mat ) const
640     {
641     return 0 != memcmp(this, &mat, sizeof(D3DXMATRIX));
642     }
643    
644    
645    
646     //--------------------------
647     // Quaternion
648     //--------------------------
649    
650     D3DXINLINE
651     D3DXQUATERNION::D3DXQUATERNION( CONST FLOAT* pf )
652     {
653     #ifdef D3DX_DEBUG
654     if(!pf)
655     return;
656     #endif
657    
658     x = pf[0];
659     y = pf[1];
660     z = pf[2];
661     w = pf[3];
662     }
663    
664     D3DXINLINE
665     D3DXQUATERNION::D3DXQUATERNION( FLOAT fx, FLOAT fy, FLOAT fz, FLOAT fw )
666     {
667     x = fx;
668     y = fy;
669     z = fz;
670     w = fw;
671     }
672    
673    
674     // casting
675     D3DXINLINE
676     D3DXQUATERNION::operator FLOAT* ()
677     {
678     return (FLOAT *) &x;
679     }
680    
681     D3DXINLINE
682     D3DXQUATERNION::operator CONST FLOAT* () const
683     {
684     return (CONST FLOAT *) &x;
685     }
686    
687    
688     // assignment operators
689     D3DXINLINE D3DXQUATERNION&
690     D3DXQUATERNION::operator += ( CONST D3DXQUATERNION& q )
691     {
692     x += q.x;
693     y += q.y;
694     z += q.z;
695     w += q.w;
696     return *this;
697     }
698    
699     D3DXINLINE D3DXQUATERNION&
700     D3DXQUATERNION::operator -= ( CONST D3DXQUATERNION& q )
701     {
702     x -= q.x;
703     y -= q.y;
704     z -= q.z;
705     w -= q.w;
706     return *this;
707     }
708    
709     D3DXINLINE D3DXQUATERNION&
710     D3DXQUATERNION::operator *= ( CONST D3DXQUATERNION& q )
711     {
712     D3DXQuaternionMultiply(this, this, &q);
713     return *this;
714     }
715    
716     D3DXINLINE D3DXQUATERNION&
717     D3DXQUATERNION::operator *= ( FLOAT f )
718     {
719     x *= f;
720     y *= f;
721     z *= f;
722     w *= f;
723     return *this;
724     }
725    
726     D3DXINLINE D3DXQUATERNION&
727     D3DXQUATERNION::operator /= ( FLOAT f )
728     {
729     FLOAT fInv = 1.0f / f;
730     x *= fInv;
731     y *= fInv;
732     z *= fInv;
733     w *= fInv;
734     return *this;
735     }
736    
737    
738     // unary operators
739     D3DXINLINE D3DXQUATERNION
740     D3DXQUATERNION::operator + () const
741     {
742     return *this;
743     }
744    
745     D3DXINLINE D3DXQUATERNION
746     D3DXQUATERNION::operator - () const
747     {
748     return D3DXQUATERNION(-x, -y, -z, -w);
749     }
750    
751    
752     // binary operators
753     D3DXINLINE D3DXQUATERNION
754     D3DXQUATERNION::operator + ( CONST D3DXQUATERNION& q ) const
755     {
756     return D3DXQUATERNION(x + q.x, y + q.y, z + q.z, w + q.w);
757     }
758    
759     D3DXINLINE D3DXQUATERNION
760     D3DXQUATERNION::operator - ( CONST D3DXQUATERNION& q ) const
761     {
762     return D3DXQUATERNION(x - q.x, y - q.y, z - q.z, w - q.w);
763     }
764    
765     D3DXINLINE D3DXQUATERNION
766     D3DXQUATERNION::operator * ( CONST D3DXQUATERNION& q ) const
767     {
768     D3DXQUATERNION qT;
769     D3DXQuaternionMultiply(&qT, this, &q);
770     return qT;
771     }
772    
773     D3DXINLINE D3DXQUATERNION
774     D3DXQUATERNION::operator * ( FLOAT f ) const
775     {
776     return D3DXQUATERNION(x * f, y * f, z * f, w * f);
777     }
778    
779     D3DXINLINE D3DXQUATERNION
780     D3DXQUATERNION::operator / ( FLOAT f ) const
781     {
782     FLOAT fInv = 1.0f / f;
783     return D3DXQUATERNION(x * fInv, y * fInv, z * fInv, w * fInv);
784     }
785    
786    
787     D3DXINLINE D3DXQUATERNION
788     operator * (FLOAT f, CONST D3DXQUATERNION& q )
789     {
790     return D3DXQUATERNION(f * q.x, f * q.y, f * q.z, f * q.w);
791     }
792    
793    
794     D3DXINLINE BOOL
795     D3DXQUATERNION::operator == ( CONST D3DXQUATERNION& q ) const
796     {
797     return x == q.x && y == q.y && z == q.z && w == q.w;
798     }
799    
800     D3DXINLINE BOOL
801     D3DXQUATERNION::operator != ( CONST D3DXQUATERNION& q ) const
802     {
803     return x != q.x || y != q.y || z != q.z || w != q.w;
804     }
805    
806    
807    
808     //--------------------------
809     // Plane
810     //--------------------------
811    
812     D3DXINLINE
813     D3DXPLANE::D3DXPLANE( CONST FLOAT* pf )
814     {
815     #ifdef D3DX_DEBUG
816     if(!pf)
817     return;
818     #endif
819    
820     a = pf[0];
821     b = pf[1];
822     c = pf[2];
823     d = pf[3];
824     }
825    
826     D3DXINLINE
827     D3DXPLANE::D3DXPLANE( FLOAT fa, FLOAT fb, FLOAT fc, FLOAT fd )
828     {
829     a = fa;
830     b = fb;
831     c = fc;
832     d = fd;
833     }
834    
835    
836     // casting
837     D3DXINLINE
838     D3DXPLANE::operator FLOAT* ()
839     {
840     return (FLOAT *) &a;
841     }
842    
843     D3DXINLINE
844     D3DXPLANE::operator CONST FLOAT* () const
845     {
846     return (CONST FLOAT *) &a;
847     }
848    
849    
850     // unary operators
851     D3DXINLINE D3DXPLANE
852     D3DXPLANE::operator + () const
853     {
854     return *this;
855     }
856    
857     D3DXINLINE D3DXPLANE
858     D3DXPLANE::operator - () const
859     {
860     return D3DXPLANE(-a, -b, -c, -d);
861     }
862    
863    
864     // binary operators
865     D3DXINLINE BOOL
866     D3DXPLANE::operator == ( CONST D3DXPLANE& p ) const
867     {
868     return a == p.a && b == p.b && c == p.c && d == p.d;
869     }
870    
871     D3DXINLINE BOOL
872     D3DXPLANE::operator != ( CONST D3DXPLANE& p ) const
873     {
874     return a != p.a || b != p.b || c != p.c || d != p.d;
875     }
876    
877    
878    
879    
880     //--------------------------
881     // Color
882     //--------------------------
883    
884     D3DXINLINE
885     D3DXCOLOR::D3DXCOLOR( DWORD dw )
886     {
887     CONST FLOAT f = 1.0f / 255.0f;
888     r = f * (FLOAT) (unsigned char) (dw >> 16);
889     g = f * (FLOAT) (unsigned char) (dw >> 8);
890     b = f * (FLOAT) (unsigned char) (dw >> 0);
891     a = f * (FLOAT) (unsigned char) (dw >> 24);
892     }
893    
894     D3DXINLINE
895     D3DXCOLOR::D3DXCOLOR( CONST FLOAT* pf )
896     {
897     #ifdef D3DX_DEBUG
898     if(!pf)
899     return;
900     #endif
901    
902     r = pf[0];
903     g = pf[1];
904     b = pf[2];
905     a = pf[3];
906     }
907    
908     D3DXINLINE
909     D3DXCOLOR::D3DXCOLOR( CONST D3DCOLORVALUE& c )
910     {
911     r = c.r;
912     g = c.g;
913     b = c.b;
914     a = c.a;
915     }
916    
917     D3DXINLINE
918     D3DXCOLOR::D3DXCOLOR( FLOAT fr, FLOAT fg, FLOAT fb, FLOAT fa )
919     {
920     r = fr;
921     g = fg;
922     b = fb;
923     a = fa;
924     }
925    
926    
927     // casting
928     D3DXINLINE
929     D3DXCOLOR::operator DWORD () const
930     {
931     DWORD dwR = r >= 1.0f ? 0xff : r <= 0.0f ? 0x00 : (DWORD) (r * 255.0f + 0.5f);
932     DWORD dwG = g >= 1.0f ? 0xff : g <= 0.0f ? 0x00 : (DWORD) (g * 255.0f + 0.5f);
933     DWORD dwB = b >= 1.0f ? 0xff : b <= 0.0f ? 0x00 : (DWORD) (b * 255.0f + 0.5f);
934     DWORD dwA = a >= 1.0f ? 0xff : a <= 0.0f ? 0x00 : (DWORD) (a * 255.0f + 0.5f);
935    
936     return (dwA << 24) | (dwR << 16) | (dwG << 8) | dwB;
937     }
938    
939    
940     D3DXINLINE
941     D3DXCOLOR::operator FLOAT * ()
942     {
943     return (FLOAT *) &r;
944     }
945    
946     D3DXINLINE
947     D3DXCOLOR::operator CONST FLOAT * () const
948     {
949     return (CONST FLOAT *) &r;
950     }
951    
952    
953     D3DXINLINE
954     D3DXCOLOR::operator D3DCOLORVALUE * ()
955     {
956     return (D3DCOLORVALUE *) &r;
957     }
958    
959     D3DXINLINE
960     D3DXCOLOR::operator CONST D3DCOLORVALUE * () const
961     {
962     return (CONST D3DCOLORVALUE *) &r;
963     }
964    
965    
966     D3DXINLINE
967     D3DXCOLOR::operator D3DCOLORVALUE& ()
968     {
969     return *((D3DCOLORVALUE *) &r);
970     }
971    
972     D3DXINLINE
973     D3DXCOLOR::operator CONST D3DCOLORVALUE& () const
974     {
975     return *((CONST D3DCOLORVALUE *) &r);
976     }
977    
978    
979     // assignment operators
980     D3DXINLINE D3DXCOLOR&
981     D3DXCOLOR::operator += ( CONST D3DXCOLOR& c )
982     {
983     r += c.r;
984     g += c.g;
985     b += c.b;
986     a += c.a;
987     return *this;
988     }
989    
990     D3DXINLINE D3DXCOLOR&
991     D3DXCOLOR::operator -= ( CONST D3DXCOLOR& c )
992     {
993     r -= c.r;
994     g -= c.g;
995     b -= c.b;
996     a -= c.a;
997     return *this;
998     }
999    
1000     D3DXINLINE D3DXCOLOR&
1001     D3DXCOLOR::operator *= ( FLOAT f )
1002     {
1003     r *= f;
1004     g *= f;
1005     b *= f;
1006     a *= f;
1007     return *this;
1008     }
1009    
1010     D3DXINLINE D3DXCOLOR&
1011     D3DXCOLOR::operator /= ( FLOAT f )
1012     {
1013     FLOAT fInv = 1.0f / f;
1014     r *= fInv;
1015     g *= fInv;
1016     b *= fInv;
1017     a *= fInv;
1018     return *this;
1019     }
1020    
1021    
1022     // unary operators
1023     D3DXINLINE D3DXCOLOR
1024     D3DXCOLOR::operator + () const
1025     {
1026     return *this;
1027     }
1028    
1029     D3DXINLINE D3DXCOLOR
1030     D3DXCOLOR::operator - () const
1031     {
1032     return D3DXCOLOR(-r, -g, -b, -a);
1033     }
1034    
1035    
1036     // binary operators
1037     D3DXINLINE D3DXCOLOR
1038     D3DXCOLOR::operator + ( CONST D3DXCOLOR& c ) const
1039     {
1040     return D3DXCOLOR(r + c.r, g + c.g, b + c.b, a + c.a);
1041     }
1042    
1043     D3DXINLINE D3DXCOLOR
1044     D3DXCOLOR::operator - ( CONST D3DXCOLOR& c ) const
1045     {
1046     return D3DXCOLOR(r - c.r, g - c.g, b - c.b, a - c.a);
1047     }
1048    
1049     D3DXINLINE D3DXCOLOR
1050     D3DXCOLOR::operator * ( FLOAT f ) const
1051     {
1052     return D3DXCOLOR(r * f, g * f, b * f, a * f);
1053     }
1054    
1055     D3DXINLINE D3DXCOLOR
1056     D3DXCOLOR::operator / ( FLOAT f ) const
1057     {
1058     FLOAT fInv = 1.0f / f;
1059     return D3DXCOLOR(r * fInv, g * fInv, b * fInv, a * fInv);
1060     }
1061    
1062    
1063     D3DXINLINE D3DXCOLOR
1064     operator * (FLOAT f, CONST D3DXCOLOR& c )
1065     {
1066     return D3DXCOLOR(f * c.r, f * c.g, f * c.b, f * c.a);
1067     }
1068    
1069    
1070     D3DXINLINE BOOL
1071     D3DXCOLOR::operator == ( CONST D3DXCOLOR& c ) const
1072     {
1073     return r == c.r && g == c.g && b == c.b && a == c.a;
1074     }
1075    
1076     D3DXINLINE BOOL
1077     D3DXCOLOR::operator != ( CONST D3DXCOLOR& c ) const
1078     {
1079     return r != c.r || g != c.g || b != c.b || a != c.a;
1080     }
1081    
1082    
1083     #endif //__cplusplus
1084    
1085    
1086    
1087     //===========================================================================
1088     //
1089     // Inline functions
1090     //
1091     //===========================================================================
1092    
1093    
1094     //--------------------------
1095     // 2D Vector
1096     //--------------------------
1097    
1098     D3DXINLINE FLOAT D3DXVec2Length
1099     ( CONST D3DXVECTOR2 *pV )
1100     {
1101     #ifdef D3DX_DEBUG
1102     if(!pV)
1103     return 0.0f;
1104     #endif
1105    
1106     #ifdef __cplusplus
1107     return sqrtf(pV->x * pV->x + pV->y * pV->y);
1108     #else
1109     return (FLOAT) sqrt(pV->x * pV->x + pV->y * pV->y);
1110     #endif
1111     }
1112    
1113     D3DXINLINE FLOAT D3DXVec2LengthSq
1114     ( CONST D3DXVECTOR2 *pV )
1115     {
1116     #ifdef D3DX_DEBUG
1117     if(!pV)
1118     return 0.0f;
1119     #endif
1120    
1121     return pV->x * pV->x + pV->y * pV->y;
1122     }
1123    
1124     D3DXINLINE FLOAT D3DXVec2Dot
1125     ( CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 )
1126     {
1127     #ifdef D3DX_DEBUG
1128     if(!pV1 || !pV2)
1129     return 0.0f;
1130     #endif
1131    
1132     return pV1->x * pV2->x + pV1->y * pV2->y;
1133     }
1134    
1135     D3DXINLINE FLOAT D3DXVec2CCW
1136     ( CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 )
1137     {
1138     #ifdef D3DX_DEBUG
1139     if(!pV1 || !pV2)
1140     return 0.0f;
1141     #endif
1142    
1143     return pV1->x * pV2->y - pV1->y * pV2->x;
1144     }
1145    
1146     D3DXINLINE D3DXVECTOR2* D3DXVec2Add
1147     ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 )
1148     {
1149     #ifdef D3DX_DEBUG
1150     if(!pOut || !pV1 || !pV2)
1151     return NULL;
1152     #endif
1153    
1154     pOut->x = pV1->x + pV2->x;
1155     pOut->y = pV1->y + pV2->y;
1156     return pOut;
1157     }
1158    
1159     D3DXINLINE D3DXVECTOR2* D3DXVec2Subtract
1160     ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 )
1161     {
1162     #ifdef D3DX_DEBUG
1163     if(!pOut || !pV1 || !pV2)
1164     return NULL;
1165     #endif
1166    
1167     pOut->x = pV1->x - pV2->x;
1168     pOut->y = pV1->y - pV2->y;
1169     return pOut;
1170     }
1171    
1172     D3DXINLINE D3DXVECTOR2* D3DXVec2Minimize
1173     ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 )
1174     {
1175     #ifdef D3DX_DEBUG
1176     if(!pOut || !pV1 || !pV2)
1177     return NULL;
1178     #endif
1179    
1180     pOut->x = pV1->x < pV2->x ? pV1->x : pV2->x;
1181     pOut->y = pV1->y < pV2->y ? pV1->y : pV2->y;
1182     return pOut;
1183     }
1184    
1185     D3DXINLINE D3DXVECTOR2* D3DXVec2Maximize
1186     ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 )
1187     {
1188     #ifdef D3DX_DEBUG
1189     if(!pOut || !pV1 || !pV2)
1190     return NULL;
1191     #endif
1192    
1193     pOut->x = pV1->x > pV2->x ? pV1->x : pV2->x;
1194     pOut->y = pV1->y > pV2->y ? pV1->y : pV2->y;
1195     return pOut;
1196     }
1197    
1198     D3DXINLINE D3DXVECTOR2* D3DXVec2Scale
1199     ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV, FLOAT s )
1200     {
1201     #ifdef D3DX_DEBUG
1202     if(!pOut || !pV)
1203     return NULL;
1204     #endif
1205    
1206     pOut->x = pV->x * s;
1207     pOut->y = pV->y * s;
1208     return pOut;
1209     }
1210    
1211     D3DXINLINE D3DXVECTOR2* D3DXVec2Lerp
1212     ( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2,
1213     FLOAT s )
1214     {
1215     #ifdef D3DX_DEBUG
1216     if(!pOut || !pV1 || !pV2)
1217     return NULL;
1218     #endif
1219    
1220     pOut->x = pV1->x + s * (pV2->x - pV1->x);
1221     pOut->y = pV1->y + s * (pV2->y - pV1->y);
1222     return pOut;
1223     }
1224    
1225    
1226     //--------------------------
1227     // 3D Vector
1228     //--------------------------
1229    
1230     D3DXINLINE FLOAT D3DXVec3Length
1231     ( CONST D3DXVECTOR3 *pV )
1232     {
1233     #ifdef D3DX_DEBUG
1234     if(!pV)
1235     return 0.0f;
1236     #endif
1237    
1238     #ifdef __cplusplus
1239     return sqrtf(pV->x * pV->x + pV->y * pV->y + pV->z * pV->z);
1240     #else
1241     return (FLOAT) sqrt(pV->x * pV->x + pV->y * pV->y + pV->z * pV->z);
1242     #endif
1243     }
1244    
1245     D3DXINLINE FLOAT D3DXVec3LengthSq
1246     ( CONST D3DXVECTOR3 *pV )
1247     {
1248     #ifdef D3DX_DEBUG
1249     if(!pV)
1250     return 0.0f;
1251     #endif
1252    
1253     return pV->x * pV->x + pV->y * pV->y + pV->z * pV->z;
1254     }
1255    
1256     D3DXINLINE FLOAT D3DXVec3Dot
1257     ( CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 )
1258     {
1259     #ifdef D3DX_DEBUG
1260     if(!pV1 || !pV2)
1261     return 0.0f;
1262     #endif
1263    
1264     return pV1->x * pV2->x + pV1->y * pV2->y + pV1->z * pV2->z;
1265     }
1266    
1267     D3DXINLINE D3DXVECTOR3* D3DXVec3Cross
1268     ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 )
1269     {
1270     D3DXVECTOR3 v;
1271    
1272     #ifdef D3DX_DEBUG
1273     if(!pOut || !pV1 || !pV2)
1274     return NULL;
1275     #endif
1276    
1277     v.x = pV1->y * pV2->z - pV1->z * pV2->y;
1278     v.y = pV1->z * pV2->x - pV1->x * pV2->z;
1279     v.z = pV1->x * pV2->y - pV1->y * pV2->x;
1280    
1281     *pOut = v;
1282     return pOut;
1283     }
1284    
1285     D3DXINLINE D3DXVECTOR3* D3DXVec3Add
1286     ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 )
1287     {
1288     #ifdef D3DX_DEBUG
1289     if(!pOut || !pV1 || !pV2)
1290     return NULL;
1291     #endif
1292    
1293     pOut->x = pV1->x + pV2->x;
1294     pOut->y = pV1->y + pV2->y;
1295     pOut->z = pV1->z + pV2->z;
1296     return pOut;
1297     }
1298    
1299     D3DXINLINE D3DXVECTOR3* D3DXVec3Subtract
1300     ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 )
1301     {
1302     #ifdef D3DX_DEBUG
1303     if(!pOut || !pV1 || !pV2)
1304     return NULL;
1305     #endif
1306    
1307     pOut->x = pV1->x - pV2->x;
1308     pOut->y = pV1->y - pV2->y;
1309     pOut->z = pV1->z - pV2->z;
1310     return pOut;
1311     }
1312    
1313     D3DXINLINE D3DXVECTOR3* D3DXVec3Minimize
1314     ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 )
1315     {
1316     #ifdef D3DX_DEBUG
1317     if(!pOut || !pV1 || !pV2)
1318     return NULL;
1319     #endif
1320    
1321     pOut->x = pV1->x < pV2->x ? pV1->x : pV2->x;
1322     pOut->y = pV1->y < pV2->y ? pV1->y : pV2->y;
1323     pOut->z = pV1->z < pV2->z ? pV1->z : pV2->z;
1324     return pOut;
1325     }
1326    
1327     D3DXINLINE D3DXVECTOR3* D3DXVec3Maximize
1328     ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 )
1329     {
1330     #ifdef D3DX_DEBUG
1331     if(!pOut || !pV1 || !pV2)
1332     return NULL;
1333     #endif
1334    
1335     pOut->x = pV1->x > pV2->x ? pV1->x : pV2->x;
1336     pOut->y = pV1->y > pV2->y ? pV1->y : pV2->y;
1337     pOut->z = pV1->z > pV2->z ? pV1->z : pV2->z;
1338     return pOut;
1339     }
1340    
1341     D3DXINLINE D3DXVECTOR3* D3DXVec3Scale
1342     ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, FLOAT s)
1343     {
1344     #ifdef D3DX_DEBUG
1345     if(!pOut || !pV)
1346     return NULL;
1347     #endif
1348    
1349     pOut->x = pV->x * s;
1350     pOut->y = pV->y * s;
1351     pOut->z = pV->z * s;
1352     return pOut;
1353     }
1354    
1355     D3DXINLINE D3DXVECTOR3* D3DXVec3Lerp
1356     ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2,
1357     FLOAT s )
1358     {
1359     #ifdef D3DX_DEBUG
1360     if(!pOut || !pV1 || !pV2)
1361     return NULL;
1362     #endif
1363    
1364     pOut->x = pV1->x + s * (pV2->x - pV1->x);
1365     pOut->y = pV1->y + s * (pV2->y - pV1->y);
1366     pOut->z = pV1->z + s * (pV2->z - pV1->z);
1367     return pOut;
1368     }
1369    
1370    
1371     //--------------------------
1372     // 4D Vector
1373     //--------------------------
1374    
1375     D3DXINLINE FLOAT D3DXVec4Length
1376     ( CONST D3DXVECTOR4 *pV )
1377     {
1378     #ifdef D3DX_DEBUG
1379     if(!pV)
1380     return 0.0f;
1381     #endif
1382    
1383     #ifdef __cplusplus
1384     return sqrtf(pV->x * pV->x + pV->y * pV->y + pV->z * pV->z + pV->w * pV->w);
1385     #else
1386     return (FLOAT) sqrt(pV->x * pV->x + pV->y * pV->y + pV->z * pV->z + pV->w * pV->w);
1387     #endif
1388     }
1389    
1390     D3DXINLINE FLOAT D3DXVec4LengthSq
1391     ( CONST D3DXVECTOR4 *pV )
1392     {
1393     #ifdef D3DX_DEBUG
1394     if(!pV)
1395     return 0.0f;
1396     #endif
1397    
1398     return pV->x * pV->x + pV->y * pV->y + pV->z * pV->z + pV->w * pV->w;
1399     }
1400    
1401     D3DXINLINE FLOAT D3DXVec4Dot
1402     ( CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2 )
1403     {
1404     #ifdef D3DX_DEBUG
1405     if(!pV1 || !pV2)
1406     return 0.0f;
1407     #endif
1408    
1409     return pV1->x * pV2->x + pV1->y * pV2->y + pV1->z * pV2->z + pV1->w * pV2->w;
1410     }
1411    
1412     D3DXINLINE D3DXVECTOR4* D3DXVec4Add
1413     ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2)
1414     {
1415     #ifdef D3DX_DEBUG
1416     if(!pOut || !pV1 || !pV2)
1417     return NULL;
1418     #endif
1419    
1420     pOut->x = pV1->x + pV2->x;
1421     pOut->y = pV1->y + pV2->y;
1422     pOut->z = pV1->z + pV2->z;
1423     pOut->w = pV1->w + pV2->w;
1424     return pOut;
1425     }
1426    
1427     D3DXINLINE D3DXVECTOR4* D3DXVec4Subtract
1428     ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2)
1429     {
1430     #ifdef D3DX_DEBUG
1431     if(!pOut || !pV1 || !pV2)
1432     return NULL;
1433     #endif
1434    
1435     pOut->x = pV1->x - pV2->x;
1436     pOut->y = pV1->y - pV2->y;
1437     pOut->z = pV1->z - pV2->z;
1438     pOut->w = pV1->w - pV2->w;
1439     return pOut;
1440     }
1441    
1442     D3DXINLINE D3DXVECTOR4* D3DXVec4Minimize
1443     ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2)
1444     {
1445     #ifdef D3DX_DEBUG
1446     if(!pOut || !pV1 || !pV2)
1447     return NULL;
1448     #endif
1449    
1450     pOut->x = pV1->x < pV2->x ? pV1->x : pV2->x;
1451     pOut->y = pV1->y < pV2->y ? pV1->y : pV2->y;
1452     pOut->z = pV1->z < pV2->z ? pV1->z : pV2->z;
1453     pOut->w = pV1->w < pV2->w ? pV1->w : pV2->w;
1454     return pOut;
1455     }
1456    
1457     D3DXINLINE D3DXVECTOR4* D3DXVec4Maximize
1458     ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2)
1459     {
1460     #ifdef D3DX_DEBUG
1461     if(!pOut || !pV1 || !pV2)
1462     return NULL;
1463     #endif
1464    
1465     pOut->x = pV1->x > pV2->x ? pV1->x : pV2->x;
1466     pOut->y = pV1->y > pV2->y ? pV1->y : pV2->y;
1467     pOut->z = pV1->z > pV2->z ? pV1->z : pV2->z;
1468     pOut->w = pV1->w > pV2->w ? pV1->w : pV2->w;
1469     return pOut;
1470     }
1471    
1472     D3DXINLINE D3DXVECTOR4* D3DXVec4Scale
1473     ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV, FLOAT s)
1474     {
1475     #ifdef D3DX_DEBUG
1476     if(!pOut || !pV)
1477     return NULL;
1478     #endif
1479    
1480     pOut->x = pV->x * s;
1481     pOut->y = pV->y * s;
1482     pOut->z = pV->z * s;
1483     pOut->w = pV->w * s;
1484     return pOut;
1485     }
1486    
1487     D3DXINLINE D3DXVECTOR4* D3DXVec4Lerp
1488     ( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV1, CONST D3DXVECTOR4 *pV2,
1489     FLOAT s )
1490     {
1491     #ifdef D3DX_DEBUG
1492     if(!pOut || !pV1 || !pV2)
1493     return NULL;
1494     #endif
1495    
1496     pOut->x = pV1->x + s * (pV2->x - pV1->x);
1497     pOut->y = pV1->y + s * (pV2->y - pV1->y);
1498     pOut->z = pV1->z + s * (pV2->z - pV1->z);
1499     pOut->w = pV1->w + s * (pV2->w - pV1->w);
1500     return pOut;
1501     }
1502    
1503    
1504     //--------------------------
1505     // 4D Matrix
1506     //--------------------------
1507    
1508     D3DXINLINE D3DXMATRIX* D3DXMatrixIdentity
1509     ( D3DXMATRIX *pOut )
1510     {
1511     #ifdef D3DX_DEBUG
1512     if(!pOut)
1513     return NULL;
1514     #endif
1515    
1516     pOut->m[0][1] = pOut->m[0][2] = pOut->m[0][3] =
1517     pOut->m[1][0] = pOut->m[1][2] = pOut->m[1][3] =
1518     pOut->m[2][0] = pOut->m[2][1] = pOut->m[2][3] =
1519     pOut->m[3][0] = pOut->m[3][1] = pOut->m[3][2] = 0.0f;
1520    
1521     pOut->m[0][0] = pOut->m[1][1] = pOut->m[2][2] = pOut->m[3][3] = 1.0f;
1522     return pOut;
1523     }
1524    
1525    
1526     D3DXINLINE BOOL D3DXMatrixIsIdentity
1527     ( CONST D3DXMATRIX *pM )
1528     {
1529     #ifdef D3DX_DEBUG
1530     if(!pM)
1531     return FALSE;
1532     #endif
1533    
1534     return pM->m[0][0] == 1.0f && pM->m[0][1] == 0.0f && pM->m[0][2] == 0.0f && pM->m[0][3] == 0.0f &&
1535     pM->m[1][0] == 0.0f && pM->m[1][1] == 1.0f && pM->m[1][2] == 0.0f && pM->m[1][3] == 0.0f &&
1536     pM->m[2][0] == 0.0f && pM->m[2][1] == 0.0f && pM->m[2][2] == 1.0f && pM->m[2][3] == 0.0f &&
1537     pM->m[3][0] == 0.0f && pM->m[3][1] == 0.0f && pM->m[3][2] == 0.0f && pM->m[3][3] == 1.0f;
1538     }
1539    
1540    
1541     //--------------------------
1542     // Quaternion
1543     //--------------------------
1544    
1545     D3DXINLINE FLOAT D3DXQuaternionLength
1546     ( CONST D3DXQUATERNION *pQ )
1547     {
1548     #ifdef D3DX_DEBUG
1549     if(!pQ)
1550     return 0.0f;
1551     #endif
1552    
1553     #ifdef __cplusplus
1554     return sqrtf(pQ->x * pQ->x + pQ->y * pQ->y + pQ->z * pQ->z + pQ->w * pQ->w);
1555     #else
1556     return (FLOAT) sqrt(pQ->x * pQ->x + pQ->y * pQ->y + pQ->z * pQ->z + pQ->w * pQ->w);
1557     #endif
1558     }
1559    
1560     D3DXINLINE FLOAT D3DXQuaternionLengthSq
1561     ( CONST D3DXQUATERNION *pQ )
1562     {
1563     #ifdef D3DX_DEBUG
1564     if(!pQ)
1565     return 0.0f;
1566     #endif
1567    
1568     return pQ->x * pQ->x + pQ->y * pQ->y + pQ->z * pQ->z + pQ->w * pQ->w;
1569     }
1570    
1571     D3DXINLINE FLOAT D3DXQuaternionDot
1572     ( CONST D3DXQUATERNION *pQ1, CONST D3DXQUATERNION *pQ2 )
1573     {
1574     #ifdef D3DX_DEBUG
1575     if(!pQ1 || !pQ2)
1576     return 0.0f;
1577     #endif
1578    
1579     return pQ1->x * pQ2->x + pQ1->y * pQ2->y + pQ1->z * pQ2->z + pQ1->w * pQ2->w;
1580     }
1581    
1582    
1583     D3DXINLINE D3DXQUATERNION* D3DXQuaternionIdentity
1584     ( D3DXQUATERNION *pOut )
1585     {
1586     #ifdef D3DX_DEBUG
1587     if(!pOut)
1588     return NULL;
1589     #endif
1590    
1591     pOut->x = pOut->y = pOut->z = 0.0f;
1592     pOut->w = 1.0f;
1593     return pOut;
1594     }
1595    
1596     D3DXINLINE BOOL D3DXQuaternionIsIdentity
1597     ( CONST D3DXQUATERNION *pQ )
1598     {
1599     #ifdef D3DX_DEBUG
1600     if(!pQ)
1601     return FALSE;
1602     #endif
1603    
1604     return pQ->x == 0.0f && pQ->y == 0.0f && pQ->z == 0.0f && pQ->w == 1.0f;
1605     }
1606    
1607    
1608     D3DXINLINE D3DXQUATERNION* D3DXQuaternionConjugate
1609     ( D3DXQUATERNION *pOut, CONST D3DXQUATERNION *pQ )
1610     {
1611     #ifdef D3DX_DEBUG
1612     if(!pOut || !pQ)
1613     return NULL;
1614     #endif
1615    
1616     pOut->x = -pQ->x;
1617     pOut->y = -pQ->y;
1618     pOut->z = -pQ->z;
1619     pOut->w = pQ->w;
1620     return pOut;
1621     }
1622    
1623    
1624     //--------------------------
1625     // Plane
1626     //--------------------------
1627    
1628     D3DXINLINE FLOAT D3DXPlaneDot
1629     ( CONST D3DXPLANE *pP, CONST D3DXVECTOR4 *pV)
1630     {
1631     #ifdef D3DX_DEBUG
1632     if(!pP || !pV)
1633     return 0.0f;
1634     #endif
1635    
1636     return pP->a * pV->x + pP->b * pV->y + pP->c * pV->z + pP->d * pV->w;
1637     }
1638    
1639     D3DXINLINE FLOAT D3DXPlaneDotCoord
1640     ( CONST D3DXPLANE *pP, CONST D3DXVECTOR3 *pV)
1641     {
1642     #ifdef D3DX_DEBUG
1643     if(!pP || !pV)
1644     return 0.0f;
1645     #endif
1646    
1647     return pP->a * pV->x + pP->b * pV->y + pP->c * pV->z + pP->d;
1648     }
1649    
1650     D3DXINLINE FLOAT D3DXPlaneDotNormal
1651     ( CONST D3DXPLANE *pP, CONST D3DXVECTOR3 *pV)
1652     {
1653     #ifdef D3DX_DEBUG
1654     if(!pP || !pV)
1655     return 0.0f;
1656     #endif
1657    
1658     return pP->a * pV->x + pP->b * pV->y + pP->c * pV->z;
1659     }
1660    
1661    
1662     //--------------------------
1663     // Color
1664     //--------------------------
1665    
1666     D3DXINLINE D3DXCOLOR* D3DXColorNegative
1667     (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC)
1668     {
1669     #ifdef D3DX_DEBUG
1670     if(!pOut || !pC)
1671     return NULL;
1672     #endif
1673    
1674     pOut->r = 1.0f - pC->r;
1675     pOut->g = 1.0f - pC->g;
1676     pOut->b = 1.0f - pC->b;
1677     pOut->a = pC->a;
1678     return pOut;
1679     }
1680    
1681     D3DXINLINE D3DXCOLOR* D3DXColorAdd
1682     (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC1, CONST D3DXCOLOR *pC2)
1683     {
1684     #ifdef D3DX_DEBUG
1685     if(!pOut || !pC1 || !pC2)
1686     return NULL;
1687     #endif
1688    
1689     pOut->r = pC1->r + pC2->r;
1690     pOut->g = pC1->g + pC2->g;
1691     pOut->b = pC1->b + pC2->b;
1692     pOut->a = pC1->a + pC2->a;
1693     return pOut;
1694     }
1695    
1696     D3DXINLINE D3DXCOLOR* D3DXColorSubtract
1697     (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC1, CONST D3DXCOLOR *pC2)
1698     {
1699     #ifdef D3DX_DEBUG
1700     if(!pOut || !pC1 || !pC2)
1701     return NULL;
1702     #endif
1703    
1704     pOut->r = pC1->r - pC2->r;
1705     pOut->g = pC1->g - pC2->g;
1706     pOut->b = pC1->b - pC2->b;
1707     pOut->a = pC1->a - pC2->a;
1708     return pOut;
1709     }
1710    
1711     D3DXINLINE D3DXCOLOR* D3DXColorScale
1712     (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC, FLOAT s)
1713     {
1714     #ifdef D3DX_DEBUG
1715     if(!pOut || !pC)
1716     return NULL;
1717     #endif
1718    
1719     pOut->r = pC->r * s;
1720     pOut->g = pC->g * s;
1721     pOut->b = pC->b * s;
1722     pOut->a = pC->a * s;
1723     return pOut;
1724     }
1725    
1726     D3DXINLINE D3DXCOLOR* D3DXColorModulate
1727     (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC1, CONST D3DXCOLOR *pC2)
1728     {
1729     #ifdef D3DX_DEBUG
1730     if(!pOut || !pC1 || !pC2)
1731     return NULL;
1732     #endif
1733    
1734     pOut->r = pC1->r * pC2->r;
1735     pOut->g = pC1->g * pC2->g;
1736     pOut->b = pC1->b * pC2->b;
1737     pOut->a = pC1->a * pC2->a;
1738     return pOut;
1739     }
1740    
1741     D3DXINLINE D3DXCOLOR* D3DXColorLerp
1742     (D3DXCOLOR *pOut, CONST D3DXCOLOR *pC1, CONST D3DXCOLOR *pC2, FLOAT s)
1743     {
1744     #ifdef D3DX_DEBUG
1745     if(!pOut || !pC1 || !pC2)
1746     return NULL;
1747     #endif
1748    
1749     pOut->r = pC1->r + s * (pC2->r - pC1->r);
1750     pOut->g = pC1->g + s * (pC2->g - pC1->g);
1751     pOut->b = pC1->b + s * (pC2->b - pC1->b);
1752     pOut->a = pC1->a + s * (pC2->a - pC1->a);
1753     return pOut;
1754     }
1755    
1756    
1757     #endif // __D3DX8MATH_INL__

root@recompile.se
ViewVC Help
Powered by ViewVC 1.1.26