00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef _VECTORMATH_AOS_CPP_H
00020 #define _VECTORMATH_AOS_CPP_H
00021
00022 #include <math.h>
00023
00024 #ifdef _VECTORMATH_DEBUG
00025 #include <stdio.h>
00026 #endif
00027
00028 namespace Vectormath {
00029
00030 namespace Aos {
00031
00032
00033
00034
00035
00036 class Vector3;
00037 class Vector4;
00038 class Point3;
00039 class Quat;
00040 class Matrix3;
00041 class Matrix4;
00042 class Transform3;
00043
00044
00045
00046 class Vector3
00047 {
00048 float mX;
00049 float mY;
00050 float mZ;
00051 #ifndef __GNUC__
00052 float d;
00053 #endif
00054
00055 public:
00056
00057
00058 inline Vector3( ) { };
00059
00060
00061
00062 inline Vector3( const Vector3 & vec );
00063
00064
00065
00066 inline Vector3( float x, float y, float z );
00067
00068
00069
00070 explicit inline Vector3( const Point3 & pnt );
00071
00072
00073
00074 explicit inline Vector3( float scalar );
00075
00076
00077
00078 inline Vector3 & operator =( const Vector3 & vec );
00079
00080
00081
00082 inline Vector3 & setX( float x );
00083
00084
00085
00086 inline Vector3 & setY( float y );
00087
00088
00089
00090 inline Vector3 & setZ( float z );
00091
00092
00093
00094 inline float getX( ) const;
00095
00096
00097
00098 inline float getY( ) const;
00099
00100
00101
00102 inline float getZ( ) const;
00103
00104
00105
00106 inline Vector3 & setElem( int idx, float value );
00107
00108
00109
00110 inline float getElem( int idx ) const;
00111
00112
00113
00114 inline float & operator []( int idx );
00115
00116
00117
00118 inline float operator []( int idx ) const;
00119
00120
00121
00122 inline const Vector3 operator +( const Vector3 & vec ) const;
00123
00124
00125
00126 inline const Vector3 operator -( const Vector3 & vec ) const;
00127
00128
00129
00130 inline const Point3 operator +( const Point3 & pnt ) const;
00131
00132
00133
00134 inline const Vector3 operator *( float scalar ) const;
00135
00136
00137
00138 inline const Vector3 operator /( float scalar ) const;
00139
00140
00141
00142 inline Vector3 & operator +=( const Vector3 & vec );
00143
00144
00145
00146 inline Vector3 & operator -=( const Vector3 & vec );
00147
00148
00149
00150 inline Vector3 & operator *=( float scalar );
00151
00152
00153
00154 inline Vector3 & operator /=( float scalar );
00155
00156
00157
00158 inline const Vector3 operator -( ) const;
00159
00160
00161
00162 static inline const Vector3 xAxis( );
00163
00164
00165
00166 static inline const Vector3 yAxis( );
00167
00168
00169
00170 static inline const Vector3 zAxis( );
00171
00172 }
00173 #ifdef __GNUC__
00174 __attribute__ ((aligned(16)))
00175 #endif
00176 ;
00177
00178
00179
00180 inline const Vector3 operator *( float scalar, const Vector3 & vec );
00181
00182
00183
00184 inline const Vector3 mulPerElem( const Vector3 & vec0, const Vector3 & vec1 );
00185
00186
00187
00188
00189
00190 inline const Vector3 divPerElem( const Vector3 & vec0, const Vector3 & vec1 );
00191
00192
00193
00194
00195
00196 inline const Vector3 recipPerElem( const Vector3 & vec );
00197
00198
00199
00200
00201
00202 inline const Vector3 sqrtPerElem( const Vector3 & vec );
00203
00204
00205
00206
00207
00208 inline const Vector3 rsqrtPerElem( const Vector3 & vec );
00209
00210
00211
00212 inline const Vector3 absPerElem( const Vector3 & vec );
00213
00214
00215
00216 inline const Vector3 copySignPerElem( const Vector3 & vec0, const Vector3 & vec1 );
00217
00218
00219
00220 inline const Vector3 maxPerElem( const Vector3 & vec0, const Vector3 & vec1 );
00221
00222
00223
00224 inline const Vector3 minPerElem( const Vector3 & vec0, const Vector3 & vec1 );
00225
00226
00227
00228 inline float maxElem( const Vector3 & vec );
00229
00230
00231
00232 inline float minElem( const Vector3 & vec );
00233
00234
00235
00236 inline float sum( const Vector3 & vec );
00237
00238
00239
00240 inline float dot( const Vector3 & vec0, const Vector3 & vec1 );
00241
00242
00243
00244 inline float lengthSqr( const Vector3 & vec );
00245
00246
00247
00248 inline float length( const Vector3 & vec );
00249
00250
00251
00252
00253
00254 inline const Vector3 normalize( const Vector3 & vec );
00255
00256
00257
00258 inline const Vector3 cross( const Vector3 & vec0, const Vector3 & vec1 );
00259
00260
00261
00262 inline const Matrix3 outer( const Vector3 & vec0, const Vector3 & vec1 );
00263
00264
00265
00266 inline const Vector3 rowMul( const Vector3 & vec, const Matrix3 & mat );
00267
00268
00269
00270 inline const Matrix3 crossMatrix( const Vector3 & vec );
00271
00272
00273
00274
00275
00276 inline const Matrix3 crossMatrixMul( const Vector3 & vec, const Matrix3 & mat );
00277
00278
00279
00280
00281
00282 inline const Vector3 lerp( float t, const Vector3 & vec0, const Vector3 & vec1 );
00283
00284
00285
00286
00287
00288
00289 inline const Vector3 slerp( float t, const Vector3 & unitVec0, const Vector3 & unitVec1 );
00290
00291
00292
00293 inline const Vector3 select( const Vector3 & vec0, const Vector3 & vec1, bool select1 );
00294
00295
00296
00297
00298 inline void loadXYZ( Vector3 & vec, const float * fptr );
00299
00300
00301
00302
00303 inline void storeXYZ( const Vector3 & vec, float * fptr );
00304
00305
00306
00307
00308
00309 inline void loadHalfFloats( Vector3 & vec, const unsigned short * hfptr );
00310
00311
00312
00313
00314
00315 inline void storeHalfFloats( const Vector3 & vec, unsigned short * hfptr );
00316
00317 #ifdef _VECTORMATH_DEBUG
00318
00319
00320
00321
00322
00323 inline void print( const Vector3 & vec );
00324
00325
00326
00327
00328
00329 inline void print( const Vector3 & vec, const char * name );
00330
00331 #endif
00332
00333
00334
00335 class Vector4
00336 {
00337 float mX;
00338 float mY;
00339 float mZ;
00340 float mW;
00341
00342 public:
00343
00344
00345 inline Vector4( ) { };
00346
00347
00348
00349 inline Vector4( const Vector4 & vec );
00350
00351
00352
00353 inline Vector4( float x, float y, float z, float w );
00354
00355
00356
00357 inline Vector4( const Vector3 & xyz, float w );
00358
00359
00360
00361 explicit inline Vector4( const Vector3 & vec );
00362
00363
00364
00365 explicit inline Vector4( const Point3 & pnt );
00366
00367
00368
00369 explicit inline Vector4( const Quat & quat );
00370
00371
00372
00373 explicit inline Vector4( float scalar );
00374
00375
00376
00377 inline Vector4 & operator =( const Vector4 & vec );
00378
00379
00380
00381
00382
00383 inline Vector4 & setXYZ( const Vector3 & vec );
00384
00385
00386
00387 inline const Vector3 getXYZ( ) const;
00388
00389
00390
00391 inline Vector4 & setX( float x );
00392
00393
00394
00395 inline Vector4 & setY( float y );
00396
00397
00398
00399 inline Vector4 & setZ( float z );
00400
00401
00402
00403 inline Vector4 & setW( float w );
00404
00405
00406
00407 inline float getX( ) const;
00408
00409
00410
00411 inline float getY( ) const;
00412
00413
00414
00415 inline float getZ( ) const;
00416
00417
00418
00419 inline float getW( ) const;
00420
00421
00422
00423 inline Vector4 & setElem( int idx, float value );
00424
00425
00426
00427 inline float getElem( int idx ) const;
00428
00429
00430
00431 inline float & operator []( int idx );
00432
00433
00434
00435 inline float operator []( int idx ) const;
00436
00437
00438
00439 inline const Vector4 operator +( const Vector4 & vec ) const;
00440
00441
00442
00443 inline const Vector4 operator -( const Vector4 & vec ) const;
00444
00445
00446
00447 inline const Vector4 operator *( float scalar ) const;
00448
00449
00450
00451 inline const Vector4 operator /( float scalar ) const;
00452
00453
00454
00455 inline Vector4 & operator +=( const Vector4 & vec );
00456
00457
00458
00459 inline Vector4 & operator -=( const Vector4 & vec );
00460
00461
00462
00463 inline Vector4 & operator *=( float scalar );
00464
00465
00466
00467 inline Vector4 & operator /=( float scalar );
00468
00469
00470
00471 inline const Vector4 operator -( ) const;
00472
00473
00474
00475 static inline const Vector4 xAxis( );
00476
00477
00478
00479 static inline const Vector4 yAxis( );
00480
00481
00482
00483 static inline const Vector4 zAxis( );
00484
00485
00486
00487 static inline const Vector4 wAxis( );
00488
00489 }
00490 #ifdef __GNUC__
00491 __attribute__ ((aligned(16)))
00492 #endif
00493 ;
00494
00495
00496
00497 inline const Vector4 operator *( float scalar, const Vector4 & vec );
00498
00499
00500
00501 inline const Vector4 mulPerElem( const Vector4 & vec0, const Vector4 & vec1 );
00502
00503
00504
00505
00506
00507 inline const Vector4 divPerElem( const Vector4 & vec0, const Vector4 & vec1 );
00508
00509
00510
00511
00512
00513 inline const Vector4 recipPerElem( const Vector4 & vec );
00514
00515
00516
00517
00518
00519 inline const Vector4 sqrtPerElem( const Vector4 & vec );
00520
00521
00522
00523
00524
00525 inline const Vector4 rsqrtPerElem( const Vector4 & vec );
00526
00527
00528
00529 inline const Vector4 absPerElem( const Vector4 & vec );
00530
00531
00532
00533 inline const Vector4 copySignPerElem( const Vector4 & vec0, const Vector4 & vec1 );
00534
00535
00536
00537 inline const Vector4 maxPerElem( const Vector4 & vec0, const Vector4 & vec1 );
00538
00539
00540
00541 inline const Vector4 minPerElem( const Vector4 & vec0, const Vector4 & vec1 );
00542
00543
00544
00545 inline float maxElem( const Vector4 & vec );
00546
00547
00548
00549 inline float minElem( const Vector4 & vec );
00550
00551
00552
00553 inline float sum( const Vector4 & vec );
00554
00555
00556
00557 inline float dot( const Vector4 & vec0, const Vector4 & vec1 );
00558
00559
00560
00561 inline float lengthSqr( const Vector4 & vec );
00562
00563
00564
00565 inline float length( const Vector4 & vec );
00566
00567
00568
00569
00570
00571 inline const Vector4 normalize( const Vector4 & vec );
00572
00573
00574
00575 inline const Matrix4 outer( const Vector4 & vec0, const Vector4 & vec1 );
00576
00577
00578
00579
00580
00581 inline const Vector4 lerp( float t, const Vector4 & vec0, const Vector4 & vec1 );
00582
00583
00584
00585
00586
00587
00588 inline const Vector4 slerp( float t, const Vector4 & unitVec0, const Vector4 & unitVec1 );
00589
00590
00591
00592 inline const Vector4 select( const Vector4 & vec0, const Vector4 & vec1, bool select1 );
00593
00594
00595
00596
00597 inline void loadXYZW( Vector4 & vec, const float * fptr );
00598
00599
00600
00601
00602 inline void storeXYZW( const Vector4 & vec, float * fptr );
00603
00604
00605
00606
00607
00608 inline void loadHalfFloats( Vector4 & vec, const unsigned short * hfptr );
00609
00610
00611
00612
00613
00614 inline void storeHalfFloats( const Vector4 & vec, unsigned short * hfptr );
00615
00616 #ifdef _VECTORMATH_DEBUG
00617
00618
00619
00620
00621
00622 inline void print( const Vector4 & vec );
00623
00624
00625
00626
00627
00628 inline void print( const Vector4 & vec, const char * name );
00629
00630 #endif
00631
00632
00633
00634 class Point3
00635 {
00636 float mX;
00637 float mY;
00638 float mZ;
00639 #ifndef __GNUC__
00640 float d;
00641 #endif
00642
00643 public:
00644
00645
00646 inline Point3( ) { };
00647
00648
00649
00650 inline Point3( const Point3 & pnt );
00651
00652
00653
00654 inline Point3( float x, float y, float z );
00655
00656
00657
00658 explicit inline Point3( const Vector3 & vec );
00659
00660
00661
00662 explicit inline Point3( float scalar );
00663
00664
00665
00666 inline Point3 & operator =( const Point3 & pnt );
00667
00668
00669
00670 inline Point3 & setX( float x );
00671
00672
00673
00674 inline Point3 & setY( float y );
00675
00676
00677
00678 inline Point3 & setZ( float z );
00679
00680
00681
00682 inline float getX( ) const;
00683
00684
00685
00686 inline float getY( ) const;
00687
00688
00689
00690 inline float getZ( ) const;
00691
00692
00693
00694 inline Point3 & setElem( int idx, float value );
00695
00696
00697
00698 inline float getElem( int idx ) const;
00699
00700
00701
00702 inline float & operator []( int idx );
00703
00704
00705
00706 inline float operator []( int idx ) const;
00707
00708
00709
00710 inline const Vector3 operator -( const Point3 & pnt ) const;
00711
00712
00713
00714 inline const Point3 operator +( const Vector3 & vec ) const;
00715
00716
00717
00718 inline const Point3 operator -( const Vector3 & vec ) const;
00719
00720
00721
00722 inline Point3 & operator +=( const Vector3 & vec );
00723
00724
00725
00726 inline Point3 & operator -=( const Vector3 & vec );
00727
00728 }
00729 #ifdef __GNUC__
00730 __attribute__ ((aligned(16)))
00731 #endif
00732 ;
00733
00734
00735
00736 inline const Point3 mulPerElem( const Point3 & pnt0, const Point3 & pnt1 );
00737
00738
00739
00740
00741
00742 inline const Point3 divPerElem( const Point3 & pnt0, const Point3 & pnt1 );
00743
00744
00745
00746
00747
00748 inline const Point3 recipPerElem( const Point3 & pnt );
00749
00750
00751
00752
00753
00754 inline const Point3 sqrtPerElem( const Point3 & pnt );
00755
00756
00757
00758
00759
00760 inline const Point3 rsqrtPerElem( const Point3 & pnt );
00761
00762
00763
00764 inline const Point3 absPerElem( const Point3 & pnt );
00765
00766
00767
00768 inline const Point3 copySignPerElem( const Point3 & pnt0, const Point3 & pnt1 );
00769
00770
00771
00772 inline const Point3 maxPerElem( const Point3 & pnt0, const Point3 & pnt1 );
00773
00774
00775
00776 inline const Point3 minPerElem( const Point3 & pnt0, const Point3 & pnt1 );
00777
00778
00779
00780 inline float maxElem( const Point3 & pnt );
00781
00782
00783
00784 inline float minElem( const Point3 & pnt );
00785
00786
00787
00788 inline float sum( const Point3 & pnt );
00789
00790
00791
00792 inline const Point3 scale( const Point3 & pnt, float scaleVal );
00793
00794
00795
00796 inline const Point3 scale( const Point3 & pnt, const Vector3 & scaleVec );
00797
00798
00799
00800 inline float projection( const Point3 & pnt, const Vector3 & unitVec );
00801
00802
00803
00804 inline float distSqrFromOrigin( const Point3 & pnt );
00805
00806
00807
00808 inline float distFromOrigin( const Point3 & pnt );
00809
00810
00811
00812 inline float distSqr( const Point3 & pnt0, const Point3 & pnt1 );
00813
00814
00815
00816 inline float dist( const Point3 & pnt0, const Point3 & pnt1 );
00817
00818
00819
00820
00821
00822 inline const Point3 lerp( float t, const Point3 & pnt0, const Point3 & pnt1 );
00823
00824
00825
00826 inline const Point3 select( const Point3 & pnt0, const Point3 & pnt1, bool select1 );
00827
00828
00829
00830
00831 inline void loadXYZ( Point3 & pnt, const float * fptr );
00832
00833
00834
00835
00836 inline void storeXYZ( const Point3 & pnt, float * fptr );
00837
00838
00839
00840
00841
00842 inline void loadHalfFloats( Point3 & pnt, const unsigned short * hfptr );
00843
00844
00845
00846
00847
00848 inline void storeHalfFloats( const Point3 & pnt, unsigned short * hfptr );
00849
00850 #ifdef _VECTORMATH_DEBUG
00851
00852
00853
00854
00855
00856 inline void print( const Point3 & pnt );
00857
00858
00859
00860
00861
00862 inline void print( const Point3 & pnt, const char * name );
00863
00864 #endif
00865
00866
00867
00868 class Quat
00869 {
00870 #if defined( __APPLE__ ) && defined( BT_USE_NEON )
00871 union{
00872 float32x4_t vXYZW;
00873 float mXYZW[4];
00874 };
00875 #else
00876 float mX;
00877 float mY;
00878 float mZ;
00879 float mW;
00880 #endif
00881
00882 public:
00883
00884
00885 inline Quat( ) { };
00886
00887
00888
00889 inline Quat( const Quat & quat );
00890
00891
00892
00893 inline Quat( float x, float y, float z, float w );
00894
00895
00896
00897 inline Quat( float32x4_t fXYZW );
00898
00899
00900
00901 inline Quat( const Vector3 & xyz, float w );
00902
00903
00904
00905 explicit inline Quat( const Vector4 & vec );
00906
00907
00908
00909 explicit inline Quat( const Matrix3 & rotMat );
00910
00911
00912
00913 explicit inline Quat( float scalar );
00914
00915
00916
00917 inline Quat & operator =( const Quat & quat );
00918
00919
00920
00921
00922
00923 inline Quat & setXYZ( const Vector3 & vec );
00924
00925
00926
00927 inline const Vector3 getXYZ( ) const;
00928
00929
00930
00931 inline Quat & setX( float x );
00932
00933
00934
00935 inline Quat & setY( float y );
00936
00937
00938
00939 inline Quat & setZ( float z );
00940
00941
00942
00943 inline Quat & setW( float w );
00944
00945 #if defined( __APPLE__ ) && defined( BT_USE_NEON )
00946 inline float32x4_t getvXYZW( ) const;
00947 #endif
00948
00949
00950
00951 inline float getX( ) const;
00952
00953
00954
00955 inline float getY( ) const;
00956
00957
00958
00959 inline float getZ( ) const;
00960
00961
00962
00963 inline float getW( ) const;
00964
00965
00966
00967 inline Quat & setElem( int idx, float value );
00968
00969
00970
00971 inline float getElem( int idx ) const;
00972
00973
00974
00975 inline float & operator []( int idx );
00976
00977
00978
00979 inline float operator []( int idx ) const;
00980
00981
00982
00983 inline const Quat operator +( const Quat & quat ) const;
00984
00985
00986
00987 inline const Quat operator -( const Quat & quat ) const;
00988
00989
00990
00991 inline const Quat operator *( const Quat & quat ) const;
00992
00993
00994
00995 inline const Quat operator *( float scalar ) const;
00996
00997
00998
00999 inline const Quat operator /( float scalar ) const;
01000
01001
01002
01003 inline Quat & operator +=( const Quat & quat );
01004
01005
01006
01007 inline Quat & operator -=( const Quat & quat );
01008
01009
01010
01011 inline Quat & operator *=( const Quat & quat );
01012
01013
01014
01015 inline Quat & operator *=( float scalar );
01016
01017
01018
01019 inline Quat & operator /=( float scalar );
01020
01021
01022
01023 inline const Quat operator -( ) const;
01024
01025
01026
01027 static inline const Quat identity( );
01028
01029
01030
01031
01032
01033 static inline const Quat rotation( const Vector3 & unitVec0, const Vector3 & unitVec1 );
01034
01035
01036
01037 static inline const Quat rotation( float radians, const Vector3 & unitVec );
01038
01039
01040
01041 static inline const Quat rotationX( float radians );
01042
01043
01044
01045 static inline const Quat rotationY( float radians );
01046
01047
01048
01049 static inline const Quat rotationZ( float radians );
01050
01051 }
01052 #ifdef __GNUC__
01053 __attribute__ ((aligned(16)))
01054 #endif
01055 ;
01056
01057
01058
01059 inline const Quat operator *( float scalar, const Quat & quat );
01060
01061
01062
01063 inline const Quat conj( const Quat & quat );
01064
01065
01066
01067 inline const Vector3 rotate( const Quat & unitQuat, const Vector3 & vec );
01068
01069
01070
01071 inline float dot( const Quat & quat0, const Quat & quat1 );
01072
01073
01074
01075 inline float norm( const Quat & quat );
01076
01077
01078
01079 inline float length( const Quat & quat );
01080
01081
01082
01083
01084
01085 inline const Quat normalize( const Quat & quat );
01086
01087
01088
01089
01090
01091 inline const Quat lerp( float t, const Quat & quat0, const Quat & quat1 );
01092
01093
01094
01095
01096
01097
01098 inline const Quat slerp( float t, const Quat & unitQuat0, const Quat & unitQuat1 );
01099
01100
01101
01102 inline const Quat squad( float t, const Quat & unitQuat0, const Quat & unitQuat1, const Quat & unitQuat2, const Quat & unitQuat3 );
01103
01104
01105
01106 inline const Quat select( const Quat & quat0, const Quat & quat1, bool select1 );
01107
01108
01109
01110
01111 inline void loadXYZW( Quat & quat, const float * fptr );
01112
01113
01114
01115
01116 inline void storeXYZW( const Quat & quat, float * fptr );
01117
01118 #ifdef _VECTORMATH_DEBUG
01119
01120
01121
01122
01123
01124 inline void print( const Quat & quat );
01125
01126
01127
01128
01129
01130 inline void print( const Quat & quat, const char * name );
01131
01132 #endif
01133
01134
01135
01136 class Matrix3
01137 {
01138 Vector3 mCol0;
01139 Vector3 mCol1;
01140 Vector3 mCol2;
01141
01142 public:
01143
01144
01145 inline Matrix3( ) { };
01146
01147
01148
01149 inline Matrix3( const Matrix3 & mat );
01150
01151
01152
01153 inline Matrix3( const Vector3 & col0, const Vector3 & col1, const Vector3 & col2 );
01154
01155
01156
01157 explicit inline Matrix3( const Quat & unitQuat );
01158
01159
01160
01161 explicit inline Matrix3( float scalar );
01162
01163
01164
01165 inline Matrix3 & operator =( const Matrix3 & mat );
01166
01167
01168
01169 inline Matrix3 & setCol0( const Vector3 & col0 );
01170
01171
01172
01173 inline Matrix3 & setCol1( const Vector3 & col1 );
01174
01175
01176
01177 inline Matrix3 & setCol2( const Vector3 & col2 );
01178
01179
01180
01181 inline const Vector3 getCol0( ) const;
01182
01183
01184
01185 inline const Vector3 getCol1( ) const;
01186
01187
01188
01189 inline const Vector3 getCol2( ) const;
01190
01191
01192
01193 inline Matrix3 & setCol( int col, const Vector3 & vec );
01194
01195
01196
01197 inline Matrix3 & setRow( int row, const Vector3 & vec );
01198
01199
01200
01201 inline const Vector3 getCol( int col ) const;
01202
01203
01204
01205 inline const Vector3 getRow( int row ) const;
01206
01207
01208
01209 inline Vector3 & operator []( int col );
01210
01211
01212
01213 inline const Vector3 operator []( int col ) const;
01214
01215
01216
01217 inline Matrix3 & setElem( int col, int row, float val );
01218
01219
01220
01221 inline float getElem( int col, int row ) const;
01222
01223
01224
01225 inline const Matrix3 operator +( const Matrix3 & mat ) const;
01226
01227
01228
01229 inline const Matrix3 operator -( const Matrix3 & mat ) const;
01230
01231
01232
01233 inline const Matrix3 operator -( ) const;
01234
01235
01236
01237 inline const Matrix3 operator *( float scalar ) const;
01238
01239
01240
01241 inline const Vector3 operator *( const Vector3 & vec ) const;
01242
01243
01244
01245 inline const Matrix3 operator *( const Matrix3 & mat ) const;
01246
01247
01248
01249 inline Matrix3 & operator +=( const Matrix3 & mat );
01250
01251
01252
01253 inline Matrix3 & operator -=( const Matrix3 & mat );
01254
01255
01256
01257 inline Matrix3 & operator *=( float scalar );
01258
01259
01260
01261 inline Matrix3 & operator *=( const Matrix3 & mat );
01262
01263
01264
01265 static inline const Matrix3 identity( );
01266
01267
01268
01269 static inline const Matrix3 rotationX( float radians );
01270
01271
01272
01273 static inline const Matrix3 rotationY( float radians );
01274
01275
01276
01277 static inline const Matrix3 rotationZ( float radians );
01278
01279
01280
01281 static inline const Matrix3 rotationZYX( const Vector3 & radiansXYZ );
01282
01283
01284
01285 static inline const Matrix3 rotation( float radians, const Vector3 & unitVec );
01286
01287
01288
01289 static inline const Matrix3 rotation( const Quat & unitQuat );
01290
01291
01292
01293 static inline const Matrix3 scale( const Vector3 & scaleVec );
01294
01295 };
01296
01297
01298 inline const Matrix3 operator *( float scalar, const Matrix3 & mat );
01299
01300
01301
01302
01303
01304 inline const Matrix3 appendScale( const Matrix3 & mat, const Vector3 & scaleVec );
01305
01306
01307
01308
01309
01310 inline const Matrix3 prependScale( const Vector3 & scaleVec, const Matrix3 & mat );
01311
01312
01313
01314 inline const Matrix3 mulPerElem( const Matrix3 & mat0, const Matrix3 & mat1 );
01315
01316
01317
01318 inline const Matrix3 absPerElem( const Matrix3 & mat );
01319
01320
01321
01322 inline const Matrix3 transpose( const Matrix3 & mat );
01323
01324
01325
01326
01327
01328 inline const Matrix3 inverse( const Matrix3 & mat );
01329
01330
01331
01332 inline float determinant( const Matrix3 & mat );
01333
01334
01335
01336 inline const Matrix3 select( const Matrix3 & mat0, const Matrix3 & mat1, bool select1 );
01337
01338 #ifdef _VECTORMATH_DEBUG
01339
01340
01341
01342
01343
01344 inline void print( const Matrix3 & mat );
01345
01346
01347
01348
01349
01350 inline void print( const Matrix3 & mat, const char * name );
01351
01352 #endif
01353
01354
01355
01356 class Matrix4
01357 {
01358 Vector4 mCol0;
01359 Vector4 mCol1;
01360 Vector4 mCol2;
01361 Vector4 mCol3;
01362
01363 public:
01364
01365
01366 inline Matrix4( ) { };
01367
01368
01369
01370 inline Matrix4( const Matrix4 & mat );
01371
01372
01373
01374 inline Matrix4( const Vector4 & col0, const Vector4 & col1, const Vector4 & col2, const Vector4 & col3 );
01375
01376
01377
01378 explicit inline Matrix4( const Transform3 & mat );
01379
01380
01381
01382 inline Matrix4( const Matrix3 & mat, const Vector3 & translateVec );
01383
01384
01385
01386 inline Matrix4( const Quat & unitQuat, const Vector3 & translateVec );
01387
01388
01389
01390 explicit inline Matrix4( float scalar );
01391
01392
01393
01394 inline Matrix4 & operator =( const Matrix4 & mat );
01395
01396
01397
01398
01399
01400 inline Matrix4 & setUpper3x3( const Matrix3 & mat3 );
01401
01402
01403
01404 inline const Matrix3 getUpper3x3( ) const;
01405
01406
01407
01408
01409
01410 inline Matrix4 & setTranslation( const Vector3 & translateVec );
01411
01412
01413
01414 inline const Vector3 getTranslation( ) const;
01415
01416
01417
01418 inline Matrix4 & setCol0( const Vector4 & col0 );
01419
01420
01421
01422 inline Matrix4 & setCol1( const Vector4 & col1 );
01423
01424
01425
01426 inline Matrix4 & setCol2( const Vector4 & col2 );
01427
01428
01429
01430 inline Matrix4 & setCol3( const Vector4 & col3 );
01431
01432
01433
01434 inline const Vector4 getCol0( ) const;
01435
01436
01437
01438 inline const Vector4 getCol1( ) const;
01439
01440
01441
01442 inline const Vector4 getCol2( ) const;
01443
01444
01445
01446 inline const Vector4 getCol3( ) const;
01447
01448
01449
01450 inline Matrix4 & setCol( int col, const Vector4 & vec );
01451
01452
01453
01454 inline Matrix4 & setRow( int row, const Vector4 & vec );
01455
01456
01457
01458 inline const Vector4 getCol( int col ) const;
01459
01460
01461
01462 inline const Vector4 getRow( int row ) const;
01463
01464
01465
01466 inline Vector4 & operator []( int col );
01467
01468
01469
01470 inline const Vector4 operator []( int col ) const;
01471
01472
01473
01474 inline Matrix4 & setElem( int col, int row, float val );
01475
01476
01477
01478 inline float getElem( int col, int row ) const;
01479
01480
01481
01482 inline const Matrix4 operator +( const Matrix4 & mat ) const;
01483
01484
01485
01486 inline const Matrix4 operator -( const Matrix4 & mat ) const;
01487
01488
01489
01490 inline const Matrix4 operator -( ) const;
01491
01492
01493
01494 inline const Matrix4 operator *( float scalar ) const;
01495
01496
01497
01498 inline const Vector4 operator *( const Vector4 & vec ) const;
01499
01500
01501
01502 inline const Vector4 operator *( const Vector3 & vec ) const;
01503
01504
01505
01506 inline const Vector4 operator *( const Point3 & pnt ) const;
01507
01508
01509
01510 inline const Matrix4 operator *( const Matrix4 & mat ) const;
01511
01512
01513
01514 inline const Matrix4 operator *( const Transform3 & tfrm ) const;
01515
01516
01517
01518 inline Matrix4 & operator +=( const Matrix4 & mat );
01519
01520
01521
01522 inline Matrix4 & operator -=( const Matrix4 & mat );
01523
01524
01525
01526 inline Matrix4 & operator *=( float scalar );
01527
01528
01529
01530 inline Matrix4 & operator *=( const Matrix4 & mat );
01531
01532
01533
01534 inline Matrix4 & operator *=( const Transform3 & tfrm );
01535
01536
01537
01538 static inline const Matrix4 identity( );
01539
01540
01541
01542 static inline const Matrix4 rotationX( float radians );
01543
01544
01545
01546 static inline const Matrix4 rotationY( float radians );
01547
01548
01549
01550 static inline const Matrix4 rotationZ( float radians );
01551
01552
01553
01554 static inline const Matrix4 rotationZYX( const Vector3 & radiansXYZ );
01555
01556
01557
01558 static inline const Matrix4 rotation( float radians, const Vector3 & unitVec );
01559
01560
01561
01562 static inline const Matrix4 rotation( const Quat & unitQuat );
01563
01564
01565
01566 static inline const Matrix4 scale( const Vector3 & scaleVec );
01567
01568
01569
01570 static inline const Matrix4 translation( const Vector3 & translateVec );
01571
01572
01573
01574 static inline const Matrix4 lookAt( const Point3 & eyePos, const Point3 & lookAtPos, const Vector3 & upVec );
01575
01576
01577
01578 static inline const Matrix4 perspective( float fovyRadians, float aspect, float zNear, float zFar );
01579
01580
01581
01582 static inline const Matrix4 frustum( float left, float right, float bottom, float top, float zNear, float zFar );
01583
01584
01585
01586 static inline const Matrix4 orthographic( float left, float right, float bottom, float top, float zNear, float zFar );
01587
01588 };
01589
01590
01591 inline const Matrix4 operator *( float scalar, const Matrix4 & mat );
01592
01593
01594
01595
01596
01597 inline const Matrix4 appendScale( const Matrix4 & mat, const Vector3 & scaleVec );
01598
01599
01600
01601
01602
01603 inline const Matrix4 prependScale( const Vector3 & scaleVec, const Matrix4 & mat );
01604
01605
01606
01607 inline const Matrix4 mulPerElem( const Matrix4 & mat0, const Matrix4 & mat1 );
01608
01609
01610
01611 inline const Matrix4 absPerElem( const Matrix4 & mat );
01612
01613
01614
01615 inline const Matrix4 transpose( const Matrix4 & mat );
01616
01617
01618
01619
01620
01621 inline const Matrix4 inverse( const Matrix4 & mat );
01622
01623
01624
01625
01626
01627 inline const Matrix4 affineInverse( const Matrix4 & mat );
01628
01629
01630
01631
01632
01633 inline const Matrix4 orthoInverse( const Matrix4 & mat );
01634
01635
01636
01637 inline float determinant( const Matrix4 & mat );
01638
01639
01640
01641 inline const Matrix4 select( const Matrix4 & mat0, const Matrix4 & mat1, bool select1 );
01642
01643 #ifdef _VECTORMATH_DEBUG
01644
01645
01646
01647
01648
01649 inline void print( const Matrix4 & mat );
01650
01651
01652
01653
01654
01655 inline void print( const Matrix4 & mat, const char * name );
01656
01657 #endif
01658
01659
01660
01661 class Transform3
01662 {
01663 Vector3 mCol0;
01664 Vector3 mCol1;
01665 Vector3 mCol2;
01666 Vector3 mCol3;
01667
01668 public:
01669
01670
01671 inline Transform3( ) { };
01672
01673
01674
01675 inline Transform3( const Transform3 & tfrm );
01676
01677
01678
01679 inline Transform3( const Vector3 & col0, const Vector3 & col1, const Vector3 & col2, const Vector3 & col3 );
01680
01681
01682
01683 inline Transform3( const Matrix3 & tfrm, const Vector3 & translateVec );
01684
01685
01686
01687 inline Transform3( const Quat & unitQuat, const Vector3 & translateVec );
01688
01689
01690
01691 explicit inline Transform3( float scalar );
01692
01693
01694
01695 inline Transform3 & operator =( const Transform3 & tfrm );
01696
01697
01698
01699 inline Transform3 & setUpper3x3( const Matrix3 & mat3 );
01700
01701
01702
01703 inline const Matrix3 getUpper3x3( ) const;
01704
01705
01706
01707 inline Transform3 & setTranslation( const Vector3 & translateVec );
01708
01709
01710
01711 inline const Vector3 getTranslation( ) const;
01712
01713
01714
01715 inline Transform3 & setCol0( const Vector3 & col0 );
01716
01717
01718
01719 inline Transform3 & setCol1( const Vector3 & col1 );
01720
01721
01722
01723 inline Transform3 & setCol2( const Vector3 & col2 );
01724
01725
01726
01727 inline Transform3 & setCol3( const Vector3 & col3 );
01728
01729
01730
01731 inline const Vector3 getCol0( ) const;
01732
01733
01734
01735 inline const Vector3 getCol1( ) const;
01736
01737
01738
01739 inline const Vector3 getCol2( ) const;
01740
01741
01742
01743 inline const Vector3 getCol3( ) const;
01744
01745
01746
01747 inline Transform3 & setCol( int col, const Vector3 & vec );
01748
01749
01750
01751 inline Transform3 & setRow( int row, const Vector4 & vec );
01752
01753
01754
01755 inline const Vector3 getCol( int col ) const;
01756
01757
01758
01759 inline const Vector4 getRow( int row ) const;
01760
01761
01762
01763 inline Vector3 & operator []( int col );
01764
01765
01766
01767 inline const Vector3 operator []( int col ) const;
01768
01769
01770
01771 inline Transform3 & setElem( int col, int row, float val );
01772
01773
01774
01775 inline float getElem( int col, int row ) const;
01776
01777
01778
01779 inline const Vector3 operator *( const Vector3 & vec ) const;
01780
01781
01782
01783 inline const Point3 operator *( const Point3 & pnt ) const;
01784
01785
01786
01787 inline const Transform3 operator *( const Transform3 & tfrm ) const;
01788
01789
01790
01791 inline Transform3 & operator *=( const Transform3 & tfrm );
01792
01793
01794
01795 static inline const Transform3 identity( );
01796
01797
01798
01799 static inline const Transform3 rotationX( float radians );
01800
01801
01802
01803 static inline const Transform3 rotationY( float radians );
01804
01805
01806
01807 static inline const Transform3 rotationZ( float radians );
01808
01809
01810
01811 static inline const Transform3 rotationZYX( const Vector3 & radiansXYZ );
01812
01813
01814
01815 static inline const Transform3 rotation( float radians, const Vector3 & unitVec );
01816
01817
01818
01819 static inline const Transform3 rotation( const Quat & unitQuat );
01820
01821
01822
01823 static inline const Transform3 scale( const Vector3 & scaleVec );
01824
01825
01826
01827 static inline const Transform3 translation( const Vector3 & translateVec );
01828
01829 };
01830
01831
01832
01833
01834 inline const Transform3 appendScale( const Transform3 & tfrm, const Vector3 & scaleVec );
01835
01836
01837
01838
01839
01840 inline const Transform3 prependScale( const Vector3 & scaleVec, const Transform3 & tfrm );
01841
01842
01843
01844 inline const Transform3 mulPerElem( const Transform3 & tfrm0, const Transform3 & tfrm1 );
01845
01846
01847
01848 inline const Transform3 absPerElem( const Transform3 & tfrm );
01849
01850
01851
01852
01853
01854 inline const Transform3 inverse( const Transform3 & tfrm );
01855
01856
01857
01858
01859
01860 inline const Transform3 orthoInverse( const Transform3 & tfrm );
01861
01862
01863
01864 inline const Transform3 select( const Transform3 & tfrm0, const Transform3 & tfrm1, bool select1 );
01865
01866 #ifdef _VECTORMATH_DEBUG
01867
01868
01869
01870
01871
01872 inline void print( const Transform3 & tfrm );
01873
01874
01875
01876
01877
01878 inline void print( const Transform3 & tfrm, const char * name );
01879
01880 #endif
01881
01882 }
01883 }
01884
01885 #include "vec_aos.h"
01886 #include "quat_aos.h"
01887 #include "mat_aos.h"
01888
01889 #endif
01890