Bullet Collision Detection & Physics Library
Main Page
Namespaces
Classes
Files
File List
File Members
src
BulletCollision
Gimpact
gim_linear_math.h
Go to the documentation of this file.
1
#ifndef GIM_LINEAR_H_INCLUDED
2
#define GIM_LINEAR_H_INCLUDED
3
8
/*
9
-----------------------------------------------------------------------------
10
This source file is part of GIMPACT Library.
11
12
For the latest info, see http://gimpact.sourceforge.net/
13
14
Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371.
15
email: projectileman@yahoo.com
16
17
This library is free software; you can redistribute it and/or
18
modify it under the terms of EITHER:
19
(1) The GNU Lesser General Public License as published by the Free
20
Software Foundation; either version 2.1 of the License, or (at
21
your option) any later version. The text of the GNU Lesser
22
General Public License is included with this library in the
23
file GIMPACT-LICENSE-LGPL.TXT.
24
(2) The BSD-style license that is included with this library in
25
the file GIMPACT-LICENSE-BSD.TXT.
26
(3) The zlib/libpng license that is included with this library in
27
the file GIMPACT-LICENSE-ZLIB.TXT.
28
29
This library is distributed in the hope that it will be useful,
30
but WITHOUT ANY WARRANTY; without even the implied warranty of
31
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files
32
GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
33
34
-----------------------------------------------------------------------------
35
*/
36
37
38
#include "
gim_math.h
"
39
#include "
gim_geom_types.h
"
40
41
42
43
45
#define VEC_ZERO_2(a) \
46
{ \
47
(a)[0] = (a)[1] = 0.0f; \
48
}\
49
50
52
#define VEC_ZERO(a) \
53
{ \
54
(a)[0] = (a)[1] = (a)[2] = 0.0f; \
55
}\
56
57
59
#define VEC_ZERO_4(a) \
60
{ \
61
(a)[0] = (a)[1] = (a)[2] = (a)[3] = 0.0f; \
62
}\
63
64
66
#define VEC_COPY_2(b,a) \
67
{ \
68
(b)[0] = (a)[0]; \
69
(b)[1] = (a)[1]; \
70
}\
71
72
74
#define VEC_COPY(b,a) \
75
{ \
76
(b)[0] = (a)[0]; \
77
(b)[1] = (a)[1]; \
78
(b)[2] = (a)[2]; \
79
}\
80
81
83
#define VEC_COPY_4(b,a) \
84
{ \
85
(b)[0] = (a)[0]; \
86
(b)[1] = (a)[1]; \
87
(b)[2] = (a)[2]; \
88
(b)[3] = (a)[3]; \
89
}\
90
91
#define VEC_SWAP(b,a) \
93
{ \
94
GIM_SWAP_NUMBERS((b)[0],(a)[0]);\
95
GIM_SWAP_NUMBERS((b)[1],(a)[1]);\
96
GIM_SWAP_NUMBERS((b)[2],(a)[2]);\
97
}\
98
99
#define VEC_DIFF_2(v21,v2,v1) \
101
{ \
102
(v21)[0] = (v2)[0] - (v1)[0]; \
103
(v21)[1] = (v2)[1] - (v1)[1]; \
104
}\
105
106
108
#define VEC_DIFF(v21,v2,v1) \
109
{ \
110
(v21)[0] = (v2)[0] - (v1)[0]; \
111
(v21)[1] = (v2)[1] - (v1)[1]; \
112
(v21)[2] = (v2)[2] - (v1)[2]; \
113
}\
114
115
117
#define VEC_DIFF_4(v21,v2,v1) \
118
{ \
119
(v21)[0] = (v2)[0] - (v1)[0]; \
120
(v21)[1] = (v2)[1] - (v1)[1]; \
121
(v21)[2] = (v2)[2] - (v1)[2]; \
122
(v21)[3] = (v2)[3] - (v1)[3]; \
123
}\
124
125
127
#define VEC_SUM_2(v21,v2,v1) \
128
{ \
129
(v21)[0] = (v2)[0] + (v1)[0]; \
130
(v21)[1] = (v2)[1] + (v1)[1]; \
131
}\
132
133
135
#define VEC_SUM(v21,v2,v1) \
136
{ \
137
(v21)[0] = (v2)[0] + (v1)[0]; \
138
(v21)[1] = (v2)[1] + (v1)[1]; \
139
(v21)[2] = (v2)[2] + (v1)[2]; \
140
}\
141
142
144
#define VEC_SUM_4(v21,v2,v1) \
145
{ \
146
(v21)[0] = (v2)[0] + (v1)[0]; \
147
(v21)[1] = (v2)[1] + (v1)[1]; \
148
(v21)[2] = (v2)[2] + (v1)[2]; \
149
(v21)[3] = (v2)[3] + (v1)[3]; \
150
}\
151
152
154
#define VEC_SCALE_2(c,a,b) \
155
{ \
156
(c)[0] = (a)*(b)[0]; \
157
(c)[1] = (a)*(b)[1]; \
158
}\
159
160
162
#define VEC_SCALE(c,a,b) \
163
{ \
164
(c)[0] = (a)*(b)[0]; \
165
(c)[1] = (a)*(b)[1]; \
166
(c)[2] = (a)*(b)[2]; \
167
}\
168
169
171
#define VEC_SCALE_4(c,a,b) \
172
{ \
173
(c)[0] = (a)*(b)[0]; \
174
(c)[1] = (a)*(b)[1]; \
175
(c)[2] = (a)*(b)[2]; \
176
(c)[3] = (a)*(b)[3]; \
177
}\
178
179
181
#define VEC_ACCUM_2(c,a,b) \
182
{ \
183
(c)[0] += (a)*(b)[0]; \
184
(c)[1] += (a)*(b)[1]; \
185
}\
186
187
189
#define VEC_ACCUM(c,a,b) \
190
{ \
191
(c)[0] += (a)*(b)[0]; \
192
(c)[1] += (a)*(b)[1]; \
193
(c)[2] += (a)*(b)[2]; \
194
}\
195
196
198
#define VEC_ACCUM_4(c,a,b) \
199
{ \
200
(c)[0] += (a)*(b)[0]; \
201
(c)[1] += (a)*(b)[1]; \
202
(c)[2] += (a)*(b)[2]; \
203
(c)[3] += (a)*(b)[3]; \
204
}\
205
206
208
#define VEC_DOT_2(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1])
209
210
212
#define VEC_DOT(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2])
213
215
#define VEC_DOT_4(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2] + (a)[3]*(b)[3])
216
218
#define VEC_IMPACT_SQ(bsq,direction,position) {\
219
GREAL _llel_ = VEC_DOT(direction, position);\
220
bsq = VEC_DOT(position, position) - _llel_*_llel_;\
221
}\
222
223
225
#define VEC_IMPACT(bsq,direction,position) {\
226
VEC_IMPACT_SQ(bsq,direction,position); \
227
GIM_SQRT(bsq,bsq); \
228
}\
229
230
#define VEC_LENGTH_2(a,l)\
232
{\
233
GREAL _pp = VEC_DOT_2(a,a);\
234
GIM_SQRT(_pp,l);\
235
}\
236
237
239
#define VEC_LENGTH(a,l)\
240
{\
241
GREAL _pp = VEC_DOT(a,a);\
242
GIM_SQRT(_pp,l);\
243
}\
244
245
247
#define VEC_LENGTH_4(a,l)\
248
{\
249
GREAL _pp = VEC_DOT_4(a,a);\
250
GIM_SQRT(_pp,l);\
251
}\
252
253
#define VEC_INV_LENGTH_2(a,l)\
255
{\
256
GREAL _pp = VEC_DOT_2(a,a);\
257
GIM_INV_SQRT(_pp,l);\
258
}\
259
260
262
#define VEC_INV_LENGTH(a,l)\
263
{\
264
GREAL _pp = VEC_DOT(a,a);\
265
GIM_INV_SQRT(_pp,l);\
266
}\
267
268
270
#define VEC_INV_LENGTH_4(a,l)\
271
{\
272
GREAL _pp = VEC_DOT_4(a,a);\
273
GIM_INV_SQRT(_pp,l);\
274
}\
275
276
277
279
#define VEC_DISTANCE(_len,_va,_vb) {\
280
vec3f _tmp_; \
281
VEC_DIFF(_tmp_, _vb, _va); \
282
VEC_LENGTH(_tmp_,_len); \
283
}\
284
285
287
#define VEC_CONJUGATE_LENGTH(a,l)\
288
{\
289
GREAL _pp = 1.0 - a[0]*a[0] - a[1]*a[1] - a[2]*a[2];\
290
GIM_SQRT(_pp,l);\
291
}\
292
293
295
#define VEC_NORMALIZE(a) { \
296
GREAL len;\
297
VEC_INV_LENGTH(a,len); \
298
if(len<G_REAL_INFINITY)\
299
{\
300
a[0] *= len; \
301
a[1] *= len; \
302
a[2] *= len; \
303
} \
304
}\
305
306
#define VEC_RENORMALIZE(a,newlen) { \
308
GREAL len;\
309
VEC_INV_LENGTH(a,len); \
310
if(len<G_REAL_INFINITY)\
311
{\
312
len *= newlen;\
313
a[0] *= len; \
314
a[1] *= len; \
315
a[2] *= len; \
316
} \
317
}\
318
319
#define VEC_CROSS(c,a,b) \
321
{ \
322
c[0] = (a)[1] * (b)[2] - (a)[2] * (b)[1]; \
323
c[1] = (a)[2] * (b)[0] - (a)[0] * (b)[2]; \
324
c[2] = (a)[0] * (b)[1] - (a)[1] * (b)[0]; \
325
}\
326
327
330
#define VEC_PERPENDICULAR(vp,v,n) \
331
{ \
332
GREAL dot = VEC_DOT(v, n); \
333
vp[0] = (v)[0] - dot*(n)[0]; \
334
vp[1] = (v)[1] - dot*(n)[1]; \
335
vp[2] = (v)[2] - dot*(n)[2]; \
336
}\
337
338
340
#define VEC_PARALLEL(vp,v,n) \
341
{ \
342
GREAL dot = VEC_DOT(v, n); \
343
vp[0] = (dot) * (n)[0]; \
344
vp[1] = (dot) * (n)[1]; \
345
vp[2] = (dot) * (n)[2]; \
346
}\
347
348
350
#define VEC_PROJECT(vp,v,n) \
351
{ \
352
GREAL scalar = VEC_DOT(v, n); \
353
scalar/= VEC_DOT(n, n); \
354
vp[0] = (scalar) * (n)[0]; \
355
vp[1] = (scalar) * (n)[1]; \
356
vp[2] = (scalar) * (n)[2]; \
357
}\
358
359
361
#define VEC_UNPROJECT(vp,v,n) \
362
{ \
363
GREAL scalar = VEC_DOT(v, n); \
364
scalar = VEC_DOT(n, n)/scalar; \
365
vp[0] = (scalar) * (n)[0]; \
366
vp[1] = (scalar) * (n)[1]; \
367
vp[2] = (scalar) * (n)[2]; \
368
}\
369
370
373
#define VEC_REFLECT(vr,v,n) \
374
{ \
375
GREAL dot = VEC_DOT(v, n); \
376
vr[0] = (v)[0] - 2.0 * (dot) * (n)[0]; \
377
vr[1] = (v)[1] - 2.0 * (dot) * (n)[1]; \
378
vr[2] = (v)[2] - 2.0 * (dot) * (n)[2]; \
379
}\
380
381
384
#define VEC_BLEND_AB(vr,sa,a,sb,b) \
385
{ \
386
vr[0] = (sa) * (a)[0] + (sb) * (b)[0]; \
387
vr[1] = (sa) * (a)[1] + (sb) * (b)[1]; \
388
vr[2] = (sa) * (a)[2] + (sb) * (b)[2]; \
389
}\
390
391
393
#define VEC_BLEND(vr,a,b,s) VEC_BLEND_AB(vr,(1-s),a,s,b)
394
395
#define VEC_SET3(a,b,op,c) a[0]=b[0] op c[0]; a[1]=b[1] op c[1]; a[2]=b[2] op c[2];
396
398
#define VEC_MAYOR_COORD(vec, maxc)\
399
{\
400
GREAL A[] = {fabs(vec[0]),fabs(vec[1]),fabs(vec[2])};\
401
maxc = A[0]>A[1]?(A[0]>A[2]?0:2):(A[1]>A[2]?1:2);\
402
}\
403
404
#define VEC_MINOR_AXES(vec, i0, i1)\
406
{\
407
VEC_MAYOR_COORD(vec,i0);\
408
i0 = (i0+1)%3;\
409
i1 = (i0+1)%3;\
410
}\
411
412
413
414
415
#define VEC_EQUAL(v1,v2) (v1[0]==v2[0]&&v1[1]==v2[1]&&v1[2]==v2[2])
416
417
#define VEC_NEAR_EQUAL(v1,v2) (GIM_NEAR_EQUAL(v1[0],v2[0])&&GIM_NEAR_EQUAL(v1[1],v2[1])&&GIM_NEAR_EQUAL(v1[2],v2[2]))
418
419
421
#define X_AXIS_CROSS_VEC(dst,src)\
422
{ \
423
dst[0] = 0.0f; \
424
dst[1] = -src[2]; \
425
dst[2] = src[1]; \
426
}\
427
428
#define Y_AXIS_CROSS_VEC(dst,src)\
429
{ \
430
dst[0] = src[2]; \
431
dst[1] = 0.0f; \
432
dst[2] = -src[0]; \
433
}\
434
435
#define Z_AXIS_CROSS_VEC(dst,src)\
436
{ \
437
dst[0] = -src[1]; \
438
dst[1] = src[0]; \
439
dst[2] = 0.0f; \
440
}\
441
442
443
444
445
446
448
#define IDENTIFY_MATRIX_3X3(m) \
449
{ \
450
m[0][0] = 1.0; \
451
m[0][1] = 0.0; \
452
m[0][2] = 0.0; \
453
\
454
m[1][0] = 0.0; \
455
m[1][1] = 1.0; \
456
m[1][2] = 0.0; \
457
\
458
m[2][0] = 0.0; \
459
m[2][1] = 0.0; \
460
m[2][2] = 1.0; \
461
}\
462
463
464
#define IDENTIFY_MATRIX_4X4(m) \
465
{ \
466
m[0][0] = 1.0; \
467
m[0][1] = 0.0; \
468
m[0][2] = 0.0; \
469
m[0][3] = 0.0; \
470
\
471
m[1][0] = 0.0; \
472
m[1][1] = 1.0; \
473
m[1][2] = 0.0; \
474
m[1][3] = 0.0; \
475
\
476
m[2][0] = 0.0; \
477
m[2][1] = 0.0; \
478
m[2][2] = 1.0; \
479
m[2][3] = 0.0; \
480
\
481
m[3][0] = 0.0; \
482
m[3][1] = 0.0; \
483
m[3][2] = 0.0; \
484
m[3][3] = 1.0; \
485
}\
486
487
488
#define ZERO_MATRIX_4X4(m) \
489
{ \
490
m[0][0] = 0.0; \
491
m[0][1] = 0.0; \
492
m[0][2] = 0.0; \
493
m[0][3] = 0.0; \
494
\
495
m[1][0] = 0.0; \
496
m[1][1] = 0.0; \
497
m[1][2] = 0.0; \
498
m[1][3] = 0.0; \
499
\
500
m[2][0] = 0.0; \
501
m[2][1] = 0.0; \
502
m[2][2] = 0.0; \
503
m[2][3] = 0.0; \
504
\
505
m[3][0] = 0.0; \
506
m[3][1] = 0.0; \
507
m[3][2] = 0.0; \
508
m[3][3] = 0.0; \
509
}\
510
511
512
#define ROTX_CS(m,cosine,sine) \
513
{ \
514
/* rotation about the x-axis */
\
515
\
516
m[0][0] = 1.0; \
517
m[0][1] = 0.0; \
518
m[0][2] = 0.0; \
519
m[0][3] = 0.0; \
520
\
521
m[1][0] = 0.0; \
522
m[1][1] = (cosine); \
523
m[1][2] = (sine); \
524
m[1][3] = 0.0; \
525
\
526
m[2][0] = 0.0; \
527
m[2][1] = -(sine); \
528
m[2][2] = (cosine); \
529
m[2][3] = 0.0; \
530
\
531
m[3][0] = 0.0; \
532
m[3][1] = 0.0; \
533
m[3][2] = 0.0; \
534
m[3][3] = 1.0; \
535
}\
536
537
538
#define ROTY_CS(m,cosine,sine) \
539
{ \
540
/* rotation about the y-axis */
\
541
\
542
m[0][0] = (cosine); \
543
m[0][1] = 0.0; \
544
m[0][2] = -(sine); \
545
m[0][3] = 0.0; \
546
\
547
m[1][0] = 0.0; \
548
m[1][1] = 1.0; \
549
m[1][2] = 0.0; \
550
m[1][3] = 0.0; \
551
\
552
m[2][0] = (sine); \
553
m[2][1] = 0.0; \
554
m[2][2] = (cosine); \
555
m[2][3] = 0.0; \
556
\
557
m[3][0] = 0.0; \
558
m[3][1] = 0.0; \
559
m[3][2] = 0.0; \
560
m[3][3] = 1.0; \
561
}\
562
563
564
#define ROTZ_CS(m,cosine,sine) \
565
{ \
566
/* rotation about the z-axis */
\
567
\
568
m[0][0] = (cosine); \
569
m[0][1] = (sine); \
570
m[0][2] = 0.0; \
571
m[0][3] = 0.0; \
572
\
573
m[1][0] = -(sine); \
574
m[1][1] = (cosine); \
575
m[1][2] = 0.0; \
576
m[1][3] = 0.0; \
577
\
578
m[2][0] = 0.0; \
579
m[2][1] = 0.0; \
580
m[2][2] = 1.0; \
581
m[2][3] = 0.0; \
582
\
583
m[3][0] = 0.0; \
584
m[3][1] = 0.0; \
585
m[3][2] = 0.0; \
586
m[3][3] = 1.0; \
587
}\
588
589
590
#define COPY_MATRIX_2X2(b,a) \
591
{ \
592
b[0][0] = a[0][0]; \
593
b[0][1] = a[0][1]; \
594
\
595
b[1][0] = a[1][0]; \
596
b[1][1] = a[1][1]; \
597
\
598
}\
599
600
602
#define COPY_MATRIX_2X3(b,a) \
603
{ \
604
b[0][0] = a[0][0]; \
605
b[0][1] = a[0][1]; \
606
b[0][2] = a[0][2]; \
607
\
608
b[1][0] = a[1][0]; \
609
b[1][1] = a[1][1]; \
610
b[1][2] = a[1][2]; \
611
}\
612
613
615
#define COPY_MATRIX_3X3(b,a) \
616
{ \
617
b[0][0] = a[0][0]; \
618
b[0][1] = a[0][1]; \
619
b[0][2] = a[0][2]; \
620
\
621
b[1][0] = a[1][0]; \
622
b[1][1] = a[1][1]; \
623
b[1][2] = a[1][2]; \
624
\
625
b[2][0] = a[2][0]; \
626
b[2][1] = a[2][1]; \
627
b[2][2] = a[2][2]; \
628
}\
629
630
632
#define COPY_MATRIX_4X4(b,a) \
633
{ \
634
b[0][0] = a[0][0]; \
635
b[0][1] = a[0][1]; \
636
b[0][2] = a[0][2]; \
637
b[0][3] = a[0][3]; \
638
\
639
b[1][0] = a[1][0]; \
640
b[1][1] = a[1][1]; \
641
b[1][2] = a[1][2]; \
642
b[1][3] = a[1][3]; \
643
\
644
b[2][0] = a[2][0]; \
645
b[2][1] = a[2][1]; \
646
b[2][2] = a[2][2]; \
647
b[2][3] = a[2][3]; \
648
\
649
b[3][0] = a[3][0]; \
650
b[3][1] = a[3][1]; \
651
b[3][2] = a[3][2]; \
652
b[3][3] = a[3][3]; \
653
}\
654
655
657
#define TRANSPOSE_MATRIX_2X2(b,a) \
658
{ \
659
b[0][0] = a[0][0]; \
660
b[0][1] = a[1][0]; \
661
\
662
b[1][0] = a[0][1]; \
663
b[1][1] = a[1][1]; \
664
}\
665
666
668
#define TRANSPOSE_MATRIX_3X3(b,a) \
669
{ \
670
b[0][0] = a[0][0]; \
671
b[0][1] = a[1][0]; \
672
b[0][2] = a[2][0]; \
673
\
674
b[1][0] = a[0][1]; \
675
b[1][1] = a[1][1]; \
676
b[1][2] = a[2][1]; \
677
\
678
b[2][0] = a[0][2]; \
679
b[2][1] = a[1][2]; \
680
b[2][2] = a[2][2]; \
681
}\
682
683
685
#define TRANSPOSE_MATRIX_4X4(b,a) \
686
{ \
687
b[0][0] = a[0][0]; \
688
b[0][1] = a[1][0]; \
689
b[0][2] = a[2][0]; \
690
b[0][3] = a[3][0]; \
691
\
692
b[1][0] = a[0][1]; \
693
b[1][1] = a[1][1]; \
694
b[1][2] = a[2][1]; \
695
b[1][3] = a[3][1]; \
696
\
697
b[2][0] = a[0][2]; \
698
b[2][1] = a[1][2]; \
699
b[2][2] = a[2][2]; \
700
b[2][3] = a[3][2]; \
701
\
702
b[3][0] = a[0][3]; \
703
b[3][1] = a[1][3]; \
704
b[3][2] = a[2][3]; \
705
b[3][3] = a[3][3]; \
706
}\
707
708
710
#define SCALE_MATRIX_2X2(b,s,a) \
711
{ \
712
b[0][0] = (s) * a[0][0]; \
713
b[0][1] = (s) * a[0][1]; \
714
\
715
b[1][0] = (s) * a[1][0]; \
716
b[1][1] = (s) * a[1][1]; \
717
}\
718
719
721
#define SCALE_MATRIX_3X3(b,s,a) \
722
{ \
723
b[0][0] = (s) * a[0][0]; \
724
b[0][1] = (s) * a[0][1]; \
725
b[0][2] = (s) * a[0][2]; \
726
\
727
b[1][0] = (s) * a[1][0]; \
728
b[1][1] = (s) * a[1][1]; \
729
b[1][2] = (s) * a[1][2]; \
730
\
731
b[2][0] = (s) * a[2][0]; \
732
b[2][1] = (s) * a[2][1]; \
733
b[2][2] = (s) * a[2][2]; \
734
}\
735
736
738
#define SCALE_MATRIX_4X4(b,s,a) \
739
{ \
740
b[0][0] = (s) * a[0][0]; \
741
b[0][1] = (s) * a[0][1]; \
742
b[0][2] = (s) * a[0][2]; \
743
b[0][3] = (s) * a[0][3]; \
744
\
745
b[1][0] = (s) * a[1][0]; \
746
b[1][1] = (s) * a[1][1]; \
747
b[1][2] = (s) * a[1][2]; \
748
b[1][3] = (s) * a[1][3]; \
749
\
750
b[2][0] = (s) * a[2][0]; \
751
b[2][1] = (s) * a[2][1]; \
752
b[2][2] = (s) * a[2][2]; \
753
b[2][3] = (s) * a[2][3]; \
754
\
755
b[3][0] = s * a[3][0]; \
756
b[3][1] = s * a[3][1]; \
757
b[3][2] = s * a[3][2]; \
758
b[3][3] = s * a[3][3]; \
759
}\
760
761
763
#define SCALE_VEC_MATRIX_2X2(b,svec,a) \
764
{ \
765
b[0][0] = svec[0] * a[0][0]; \
766
b[1][0] = svec[0] * a[1][0]; \
767
\
768
b[0][1] = svec[1] * a[0][1]; \
769
b[1][1] = svec[1] * a[1][1]; \
770
}\
771
772
774
#define SCALE_VEC_MATRIX_3X3(b,svec,a) \
775
{ \
776
b[0][0] = svec[0] * a[0][0]; \
777
b[1][0] = svec[0] * a[1][0]; \
778
b[2][0] = svec[0] * a[2][0]; \
779
\
780
b[0][1] = svec[1] * a[0][1]; \
781
b[1][1] = svec[1] * a[1][1]; \
782
b[2][1] = svec[1] * a[2][1]; \
783
\
784
b[0][2] = svec[2] * a[0][2]; \
785
b[1][2] = svec[2] * a[1][2]; \
786
b[2][2] = svec[2] * a[2][2]; \
787
}\
788
789
791
#define SCALE_VEC_MATRIX_4X4(b,svec,a) \
792
{ \
793
b[0][0] = svec[0] * a[0][0]; \
794
b[1][0] = svec[0] * a[1][0]; \
795
b[2][0] = svec[0] * a[2][0]; \
796
b[3][0] = svec[0] * a[3][0]; \
797
\
798
b[0][1] = svec[1] * a[0][1]; \
799
b[1][1] = svec[1] * a[1][1]; \
800
b[2][1] = svec[1] * a[2][1]; \
801
b[3][1] = svec[1] * a[3][1]; \
802
\
803
b[0][2] = svec[2] * a[0][2]; \
804
b[1][2] = svec[2] * a[1][2]; \
805
b[2][2] = svec[2] * a[2][2]; \
806
b[3][2] = svec[2] * a[3][2]; \
807
\
808
b[0][3] = svec[3] * a[0][3]; \
809
b[1][3] = svec[3] * a[1][3]; \
810
b[2][3] = svec[3] * a[2][3]; \
811
b[3][3] = svec[3] * a[3][3]; \
812
}\
813
814
816
#define ACCUM_SCALE_MATRIX_2X2(b,s,a) \
817
{ \
818
b[0][0] += (s) * a[0][0]; \
819
b[0][1] += (s) * a[0][1]; \
820
\
821
b[1][0] += (s) * a[1][0]; \
822
b[1][1] += (s) * a[1][1]; \
823
}\
824
825
827
#define ACCUM_SCALE_MATRIX_3X3(b,s,a) \
828
{ \
829
b[0][0] += (s) * a[0][0]; \
830
b[0][1] += (s) * a[0][1]; \
831
b[0][2] += (s) * a[0][2]; \
832
\
833
b[1][0] += (s) * a[1][0]; \
834
b[1][1] += (s) * a[1][1]; \
835
b[1][2] += (s) * a[1][2]; \
836
\
837
b[2][0] += (s) * a[2][0]; \
838
b[2][1] += (s) * a[2][1]; \
839
b[2][2] += (s) * a[2][2]; \
840
}\
841
842
844
#define ACCUM_SCALE_MATRIX_4X4(b,s,a) \
845
{ \
846
b[0][0] += (s) * a[0][0]; \
847
b[0][1] += (s) * a[0][1]; \
848
b[0][2] += (s) * a[0][2]; \
849
b[0][3] += (s) * a[0][3]; \
850
\
851
b[1][0] += (s) * a[1][0]; \
852
b[1][1] += (s) * a[1][1]; \
853
b[1][2] += (s) * a[1][2]; \
854
b[1][3] += (s) * a[1][3]; \
855
\
856
b[2][0] += (s) * a[2][0]; \
857
b[2][1] += (s) * a[2][1]; \
858
b[2][2] += (s) * a[2][2]; \
859
b[2][3] += (s) * a[2][3]; \
860
\
861
b[3][0] += (s) * a[3][0]; \
862
b[3][1] += (s) * a[3][1]; \
863
b[3][2] += (s) * a[3][2]; \
864
b[3][3] += (s) * a[3][3]; \
865
}\
866
867
869
#define MATRIX_PRODUCT_2X2(c,a,b) \
870
{ \
871
c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0]; \
872
c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1]; \
873
\
874
c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0]; \
875
c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1]; \
876
\
877
}\
878
879
881
#define MATRIX_PRODUCT_3X3(c,a,b) \
882
{ \
883
c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0]; \
884
c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1]; \
885
c[0][2] = a[0][0]*b[0][2]+a[0][1]*b[1][2]+a[0][2]*b[2][2]; \
886
\
887
c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0]+a[1][2]*b[2][0]; \
888
c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1]+a[1][2]*b[2][1]; \
889
c[1][2] = a[1][0]*b[0][2]+a[1][1]*b[1][2]+a[1][2]*b[2][2]; \
890
\
891
c[2][0] = a[2][0]*b[0][0]+a[2][1]*b[1][0]+a[2][2]*b[2][0]; \
892
c[2][1] = a[2][0]*b[0][1]+a[2][1]*b[1][1]+a[2][2]*b[2][1]; \
893
c[2][2] = a[2][0]*b[0][2]+a[2][1]*b[1][2]+a[2][2]*b[2][2]; \
894
}\
895
896
899
#define MATRIX_PRODUCT_4X4(c,a,b) \
900
{ \
901
c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0]+a[0][3]*b[3][0];\
902
c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1]+a[0][3]*b[3][1];\
903
c[0][2] = a[0][0]*b[0][2]+a[0][1]*b[1][2]+a[0][2]*b[2][2]+a[0][3]*b[3][2];\
904
c[0][3] = a[0][0]*b[0][3]+a[0][1]*b[1][3]+a[0][2]*b[2][3]+a[0][3]*b[3][3];\
905
\
906
c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0]+a[1][2]*b[2][0]+a[1][3]*b[3][0];\
907
c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1]+a[1][2]*b[2][1]+a[1][3]*b[3][1];\
908
c[1][2] = a[1][0]*b[0][2]+a[1][1]*b[1][2]+a[1][2]*b[2][2]+a[1][3]*b[3][2];\
909
c[1][3] = a[1][0]*b[0][3]+a[1][1]*b[1][3]+a[1][2]*b[2][3]+a[1][3]*b[3][3];\
910
\
911
c[2][0] = a[2][0]*b[0][0]+a[2][1]*b[1][0]+a[2][2]*b[2][0]+a[2][3]*b[3][0];\
912
c[2][1] = a[2][0]*b[0][1]+a[2][1]*b[1][1]+a[2][2]*b[2][1]+a[2][3]*b[3][1];\
913
c[2][2] = a[2][0]*b[0][2]+a[2][1]*b[1][2]+a[2][2]*b[2][2]+a[2][3]*b[3][2];\
914
c[2][3] = a[2][0]*b[0][3]+a[2][1]*b[1][3]+a[2][2]*b[2][3]+a[2][3]*b[3][3];\
915
\
916
c[3][0] = a[3][0]*b[0][0]+a[3][1]*b[1][0]+a[3][2]*b[2][0]+a[3][3]*b[3][0];\
917
c[3][1] = a[3][0]*b[0][1]+a[3][1]*b[1][1]+a[3][2]*b[2][1]+a[3][3]*b[3][1];\
918
c[3][2] = a[3][0]*b[0][2]+a[3][1]*b[1][2]+a[3][2]*b[2][2]+a[3][3]*b[3][2];\
919
c[3][3] = a[3][0]*b[0][3]+a[3][1]*b[1][3]+a[3][2]*b[2][3]+a[3][3]*b[3][3];\
920
}\
921
922
924
#define MAT_DOT_VEC_2X2(p,m,v) \
925
{ \
926
p[0] = m[0][0]*v[0] + m[0][1]*v[1]; \
927
p[1] = m[1][0]*v[0] + m[1][1]*v[1]; \
928
}\
929
930
932
#define MAT_DOT_VEC_3X3(p,m,v) \
933
{ \
934
p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2]; \
935
p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2]; \
936
p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2]; \
937
}\
938
939
943
#define MAT_DOT_VEC_4X4(p,m,v) \
944
{ \
945
p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2] + m[0][3]*v[3]; \
946
p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2] + m[1][3]*v[3]; \
947
p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2] + m[2][3]*v[3]; \
948
p[3] = m[3][0]*v[0] + m[3][1]*v[1] + m[3][2]*v[2] + m[3][3]*v[3]; \
949
}\
950
951
956
#define MAT_DOT_VEC_3X4(p,m,v) \
957
{ \
958
p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2] + m[0][3]; \
959
p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2] + m[1][3]; \
960
p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2] + m[2][3]; \
961
}\
962
963
966
#define VEC_DOT_MAT_3X3(p,v,m) \
967
{ \
968
p[0] = v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0]; \
969
p[1] = v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1]; \
970
p[2] = v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2]; \
971
}\
972
973
977
#define MAT_DOT_VEC_2X3(p,m,v) \
978
{ \
979
p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]; \
980
p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]; \
981
}\
982
983
#define MAT_TRANSFORM_PLANE_4X4(pout,m,plane)\
985
{ \
986
pout[0] = m[0][0]*plane[0] + m[0][1]*plane[1] + m[0][2]*plane[2];\
987
pout[1] = m[1][0]*plane[0] + m[1][1]*plane[1] + m[1][2]*plane[2];\
988
pout[2] = m[2][0]*plane[0] + m[2][1]*plane[1] + m[2][2]*plane[2];\
989
pout[3] = m[0][3]*pout[0] + m[1][3]*pout[1] + m[2][3]*pout[2] + plane[3];\
990
}\
991
992
993
1003
#define INV_TRANSP_MAT_DOT_VEC_2X2(p,m,v) \
1004
{ \
1005
GREAL det; \
1006
\
1007
det = m[0][0]*m[1][1] - m[0][1]*m[1][0]; \
1008
p[0] = m[1][1]*v[0] - m[1][0]*v[1]; \
1009
p[1] = - m[0][1]*v[0] + m[0][0]*v[1]; \
1010
\
1011
/* if matrix not singular, and not orthonormal, then renormalize */
\
1012
if ((det!=1.0f) && (det != 0.0f)) { \
1013
det = 1.0f / det; \
1014
p[0] *= det; \
1015
p[1] *= det; \
1016
} \
1017
}\
1018
1019
1027
#define NORM_XFORM_2X2(p,m,v) \
1028
{ \
1029
GREAL len; \
1030
\
1031
/* do nothing if off-diagonals are zero and diagonals are \
1032
* equal */
\
1033
if ((m[0][1] != 0.0) || (m[1][0] != 0.0) || (m[0][0] != m[1][1])) { \
1034
p[0] = m[1][1]*v[0] - m[1][0]*v[1]; \
1035
p[1] = - m[0][1]*v[0] + m[0][0]*v[1]; \
1036
\
1037
len = p[0]*p[0] + p[1]*p[1]; \
1038
GIM_INV_SQRT(len,len); \
1039
p[0] *= len; \
1040
p[1] *= len; \
1041
} else { \
1042
VEC_COPY_2 (p, v); \
1043
} \
1044
}\
1045
1046
1052
#define OUTER_PRODUCT_2X2(m,v,t) \
1053
{ \
1054
m[0][0] = v[0] * t[0]; \
1055
m[0][1] = v[0] * t[1]; \
1056
\
1057
m[1][0] = v[1] * t[0]; \
1058
m[1][1] = v[1] * t[1]; \
1059
}\
1060
1061
1067
#define OUTER_PRODUCT_3X3(m,v,t) \
1068
{ \
1069
m[0][0] = v[0] * t[0]; \
1070
m[0][1] = v[0] * t[1]; \
1071
m[0][2] = v[0] * t[2]; \
1072
\
1073
m[1][0] = v[1] * t[0]; \
1074
m[1][1] = v[1] * t[1]; \
1075
m[1][2] = v[1] * t[2]; \
1076
\
1077
m[2][0] = v[2] * t[0]; \
1078
m[2][1] = v[2] * t[1]; \
1079
m[2][2] = v[2] * t[2]; \
1080
}\
1081
1082
1088
#define OUTER_PRODUCT_4X4(m,v,t) \
1089
{ \
1090
m[0][0] = v[0] * t[0]; \
1091
m[0][1] = v[0] * t[1]; \
1092
m[0][2] = v[0] * t[2]; \
1093
m[0][3] = v[0] * t[3]; \
1094
\
1095
m[1][0] = v[1] * t[0]; \
1096
m[1][1] = v[1] * t[1]; \
1097
m[1][2] = v[1] * t[2]; \
1098
m[1][3] = v[1] * t[3]; \
1099
\
1100
m[2][0] = v[2] * t[0]; \
1101
m[2][1] = v[2] * t[1]; \
1102
m[2][2] = v[2] * t[2]; \
1103
m[2][3] = v[2] * t[3]; \
1104
\
1105
m[3][0] = v[3] * t[0]; \
1106
m[3][1] = v[3] * t[1]; \
1107
m[3][2] = v[3] * t[2]; \
1108
m[3][3] = v[3] * t[3]; \
1109
}\
1110
1111
1117
#define ACCUM_OUTER_PRODUCT_2X2(m,v,t) \
1118
{ \
1119
m[0][0] += v[0] * t[0]; \
1120
m[0][1] += v[0] * t[1]; \
1121
\
1122
m[1][0] += v[1] * t[0]; \
1123
m[1][1] += v[1] * t[1]; \
1124
}\
1125
1126
1132
#define ACCUM_OUTER_PRODUCT_3X3(m,v,t) \
1133
{ \
1134
m[0][0] += v[0] * t[0]; \
1135
m[0][1] += v[0] * t[1]; \
1136
m[0][2] += v[0] * t[2]; \
1137
\
1138
m[1][0] += v[1] * t[0]; \
1139
m[1][1] += v[1] * t[1]; \
1140
m[1][2] += v[1] * t[2]; \
1141
\
1142
m[2][0] += v[2] * t[0]; \
1143
m[2][1] += v[2] * t[1]; \
1144
m[2][2] += v[2] * t[2]; \
1145
}\
1146
1147
1153
#define ACCUM_OUTER_PRODUCT_4X4(m,v,t) \
1154
{ \
1155
m[0][0] += v[0] * t[0]; \
1156
m[0][1] += v[0] * t[1]; \
1157
m[0][2] += v[0] * t[2]; \
1158
m[0][3] += v[0] * t[3]; \
1159
\
1160
m[1][0] += v[1] * t[0]; \
1161
m[1][1] += v[1] * t[1]; \
1162
m[1][2] += v[1] * t[2]; \
1163
m[1][3] += v[1] * t[3]; \
1164
\
1165
m[2][0] += v[2] * t[0]; \
1166
m[2][1] += v[2] * t[1]; \
1167
m[2][2] += v[2] * t[2]; \
1168
m[2][3] += v[2] * t[3]; \
1169
\
1170
m[3][0] += v[3] * t[0]; \
1171
m[3][1] += v[3] * t[1]; \
1172
m[3][2] += v[3] * t[2]; \
1173
m[3][3] += v[3] * t[3]; \
1174
}\
1175
1176
1181
#define DETERMINANT_2X2(d,m) \
1182
{ \
1183
d = m[0][0] * m[1][1] - m[0][1] * m[1][0]; \
1184
}\
1185
1186
1191
#define DETERMINANT_3X3(d,m) \
1192
{ \
1193
d = m[0][0] * (m[1][1]*m[2][2] - m[1][2] * m[2][1]); \
1194
d -= m[0][1] * (m[1][0]*m[2][2] - m[1][2] * m[2][0]); \
1195
d += m[0][2] * (m[1][0]*m[2][1] - m[1][1] * m[2][0]); \
1196
}\
1197
1198
1202
#define COFACTOR_4X4_IJ(fac,m,i,j) \
1203
{ \
1204
GUINT __ii[4], __jj[4], __k; \
1205
\
1206
for (__k=0; __k<i; __k++) __ii[__k] = __k; \
1207
for (__k=i; __k<3; __k++) __ii[__k] = __k+1; \
1208
for (__k=0; __k<j; __k++) __jj[__k] = __k; \
1209
for (__k=j; __k<3; __k++) __jj[__k] = __k+1; \
1210
\
1211
(fac) = m[__ii[0]][__jj[0]] * (m[__ii[1]][__jj[1]]*m[__ii[2]][__jj[2]] \
1212
- m[__ii[1]][__jj[2]]*m[__ii[2]][__jj[1]]); \
1213
(fac) -= m[__ii[0]][__jj[1]] * (m[__ii[1]][__jj[0]]*m[__ii[2]][__jj[2]] \
1214
- m[__ii[1]][__jj[2]]*m[__ii[2]][__jj[0]]);\
1215
(fac) += m[__ii[0]][__jj[2]] * (m[__ii[1]][__jj[0]]*m[__ii[2]][__jj[1]] \
1216
- m[__ii[1]][__jj[1]]*m[__ii[2]][__jj[0]]);\
1217
\
1218
__k = i+j; \
1219
if ( __k != (__k/2)*2) { \
1220
(fac) = -(fac); \
1221
} \
1222
}\
1223
1224
1229
#define DETERMINANT_4X4(d,m) \
1230
{ \
1231
GREAL cofac; \
1232
COFACTOR_4X4_IJ (cofac, m, 0, 0); \
1233
d = m[0][0] * cofac; \
1234
COFACTOR_4X4_IJ (cofac, m, 0, 1); \
1235
d += m[0][1] * cofac; \
1236
COFACTOR_4X4_IJ (cofac, m, 0, 2); \
1237
d += m[0][2] * cofac; \
1238
COFACTOR_4X4_IJ (cofac, m, 0, 3); \
1239
d += m[0][3] * cofac; \
1240
}\
1241
1242
1247
#define COFACTOR_2X2(a,m) \
1248
{ \
1249
a[0][0] = (m)[1][1]; \
1250
a[0][1] = - (m)[1][0]; \
1251
a[1][0] = - (m)[0][1]; \
1252
a[1][1] = (m)[0][0]; \
1253
}\
1254
1255
1260
#define COFACTOR_3X3(a,m) \
1261
{ \
1262
a[0][0] = m[1][1]*m[2][2] - m[1][2]*m[2][1]; \
1263
a[0][1] = - (m[1][0]*m[2][2] - m[2][0]*m[1][2]); \
1264
a[0][2] = m[1][0]*m[2][1] - m[1][1]*m[2][0]; \
1265
a[1][0] = - (m[0][1]*m[2][2] - m[0][2]*m[2][1]); \
1266
a[1][1] = m[0][0]*m[2][2] - m[0][2]*m[2][0]; \
1267
a[1][2] = - (m[0][0]*m[2][1] - m[0][1]*m[2][0]); \
1268
a[2][0] = m[0][1]*m[1][2] - m[0][2]*m[1][1]; \
1269
a[2][1] = - (m[0][0]*m[1][2] - m[0][2]*m[1][0]); \
1270
a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]); \
1271
}\
1272
1273
1278
#define COFACTOR_4X4(a,m) \
1279
{ \
1280
int i,j; \
1281
\
1282
for (i=0; i<4; i++) { \
1283
for (j=0; j<4; j++) { \
1284
COFACTOR_4X4_IJ (a[i][j], m, i, j); \
1285
} \
1286
} \
1287
}\
1288
1289
1295
#define ADJOINT_2X2(a,m) \
1296
{ \
1297
a[0][0] = (m)[1][1]; \
1298
a[1][0] = - (m)[1][0]; \
1299
a[0][1] = - (m)[0][1]; \
1300
a[1][1] = (m)[0][0]; \
1301
}\
1302
1303
1309
#define ADJOINT_3X3(a,m) \
1310
{ \
1311
a[0][0] = m[1][1]*m[2][2] - m[1][2]*m[2][1]; \
1312
a[1][0] = - (m[1][0]*m[2][2] - m[2][0]*m[1][2]); \
1313
a[2][0] = m[1][0]*m[2][1] - m[1][1]*m[2][0]; \
1314
a[0][1] = - (m[0][1]*m[2][2] - m[0][2]*m[2][1]); \
1315
a[1][1] = m[0][0]*m[2][2] - m[0][2]*m[2][0]; \
1316
a[2][1] = - (m[0][0]*m[2][1] - m[0][1]*m[2][0]); \
1317
a[0][2] = m[0][1]*m[1][2] - m[0][2]*m[1][1]; \
1318
a[1][2] = - (m[0][0]*m[1][2] - m[0][2]*m[1][0]); \
1319
a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]); \
1320
}\
1321
1322
1328
#define ADJOINT_4X4(a,m) \
1329
{ \
1330
char _i_,_j_; \
1331
\
1332
for (_i_=0; _i_<4; _i_++) { \
1333
for (_j_=0; _j_<4; _j_++) { \
1334
COFACTOR_4X4_IJ (a[_j_][_i_], m, _i_, _j_); \
1335
} \
1336
} \
1337
}\
1338
1339
1344
#define SCALE_ADJOINT_2X2(a,s,m) \
1345
{ \
1346
a[0][0] = (s) * m[1][1]; \
1347
a[1][0] = - (s) * m[1][0]; \
1348
a[0][1] = - (s) * m[0][1]; \
1349
a[1][1] = (s) * m[0][0]; \
1350
}\
1351
1352
1357
#define SCALE_ADJOINT_3X3(a,s,m) \
1358
{ \
1359
a[0][0] = (s) * (m[1][1] * m[2][2] - m[1][2] * m[2][1]); \
1360
a[1][0] = (s) * (m[1][2] * m[2][0] - m[1][0] * m[2][2]); \
1361
a[2][0] = (s) * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); \
1362
\
1363
a[0][1] = (s) * (m[0][2] * m[2][1] - m[0][1] * m[2][2]); \
1364
a[1][1] = (s) * (m[0][0] * m[2][2] - m[0][2] * m[2][0]); \
1365
a[2][1] = (s) * (m[0][1] * m[2][0] - m[0][0] * m[2][1]); \
1366
\
1367
a[0][2] = (s) * (m[0][1] * m[1][2] - m[0][2] * m[1][1]); \
1368
a[1][2] = (s) * (m[0][2] * m[1][0] - m[0][0] * m[1][2]); \
1369
a[2][2] = (s) * (m[0][0] * m[1][1] - m[0][1] * m[1][0]); \
1370
}\
1371
1372
1377
#define SCALE_ADJOINT_4X4(a,s,m) \
1378
{ \
1379
char _i_,_j_; \
1380
for (_i_=0; _i_<4; _i_++) { \
1381
for (_j_=0; _j_<4; _j_++) { \
1382
COFACTOR_4X4_IJ (a[_j_][_i_], m, _i_, _j_); \
1383
a[_j_][_i_] *= s; \
1384
} \
1385
} \
1386
}\
1387
1388
1393
#define INVERT_2X2(b,det,a) \
1394
{ \
1395
GREAL _tmp_; \
1396
DETERMINANT_2X2 (det, a); \
1397
_tmp_ = 1.0 / (det); \
1398
SCALE_ADJOINT_2X2 (b, _tmp_, a); \
1399
}\
1400
1401
1407
#define INVERT_3X3(b,det,a) \
1408
{ \
1409
GREAL _tmp_; \
1410
DETERMINANT_3X3 (det, a); \
1411
_tmp_ = 1.0 / (det); \
1412
SCALE_ADJOINT_3X3 (b, _tmp_, a); \
1413
}\
1414
1415
1421
#define INVERT_4X4(b,det,a) \
1422
{ \
1423
GREAL _tmp_; \
1424
DETERMINANT_4X4 (det, a); \
1425
_tmp_ = 1.0 / (det); \
1426
SCALE_ADJOINT_4X4 (b, _tmp_, a); \
1427
}\
1428
1429
#define MAT_GET_ROW(mat,vec3,rowindex)\
1431
{\
1432
vec3[0] = mat[rowindex][0];\
1433
vec3[1] = mat[rowindex][1];\
1434
vec3[2] = mat[rowindex][2]; \
1435
}\
1436
1437
#define MAT_GET_ROW2(mat,vec2,rowindex)\
1439
{\
1440
vec2[0] = mat[rowindex][0];\
1441
vec2[1] = mat[rowindex][1];\
1442
}\
1443
1444
1446
#define MAT_GET_ROW4(mat,vec4,rowindex)\
1447
{\
1448
vec4[0] = mat[rowindex][0];\
1449
vec4[1] = mat[rowindex][1];\
1450
vec4[2] = mat[rowindex][2];\
1451
vec4[3] = mat[rowindex][3];\
1452
}\
1453
1454
#define MAT_GET_COL(mat,vec3,colindex)\
1456
{\
1457
vec3[0] = mat[0][colindex];\
1458
vec3[1] = mat[1][colindex];\
1459
vec3[2] = mat[2][colindex]; \
1460
}\
1461
1462
#define MAT_GET_COL2(mat,vec2,colindex)\
1464
{\
1465
vec2[0] = mat[0][colindex];\
1466
vec2[1] = mat[1][colindex];\
1467
}\
1468
1469
1471
#define MAT_GET_COL4(mat,vec4,colindex)\
1472
{\
1473
vec4[0] = mat[0][colindex];\
1474
vec4[1] = mat[1][colindex];\
1475
vec4[2] = mat[2][colindex];\
1476
vec4[3] = mat[3][colindex];\
1477
}\
1478
1479
#define MAT_GET_X(mat,vec3)\
1481
{\
1482
MAT_GET_COL(mat,vec3,0);\
1483
}\
1484
1485
#define MAT_GET_Y(mat,vec3)\
1487
{\
1488
MAT_GET_COL(mat,vec3,1);\
1489
}\
1490
1491
#define MAT_GET_Z(mat,vec3)\
1493
{\
1494
MAT_GET_COL(mat,vec3,2);\
1495
}\
1496
1497
1499
#define MAT_SET_X(mat,vec3)\
1500
{\
1501
mat[0][0] = vec3[0];\
1502
mat[1][0] = vec3[1];\
1503
mat[2][0] = vec3[2];\
1504
}\
1505
1506
#define MAT_SET_Y(mat,vec3)\
1508
{\
1509
mat[0][1] = vec3[0];\
1510
mat[1][1] = vec3[1];\
1511
mat[2][1] = vec3[2];\
1512
}\
1513
1514
#define MAT_SET_Z(mat,vec3)\
1516
{\
1517
mat[0][2] = vec3[0];\
1518
mat[1][2] = vec3[1];\
1519
mat[2][2] = vec3[2];\
1520
}\
1521
1522
1524
#define MAT_GET_TRANSLATION(mat,vec3)\
1525
{\
1526
vec3[0] = mat[0][3];\
1527
vec3[1] = mat[1][3];\
1528
vec3[2] = mat[2][3]; \
1529
}\
1530
1531
#define MAT_SET_TRANSLATION(mat,vec3)\
1533
{\
1534
mat[0][3] = vec3[0];\
1535
mat[1][3] = vec3[1];\
1536
mat[2][3] = vec3[2]; \
1537
}\
1538
1539
1540
1542
#define MAT_DOT_ROW(mat,vec3,rowindex) (vec3[0]*mat[rowindex][0] + vec3[1]*mat[rowindex][1] + vec3[2]*mat[rowindex][2])
1543
1545
#define MAT_DOT_ROW2(mat,vec2,rowindex) (vec2[0]*mat[rowindex][0] + vec2[1]*mat[rowindex][1])
1546
1548
#define MAT_DOT_ROW4(mat,vec4,rowindex) (vec4[0]*mat[rowindex][0] + vec4[1]*mat[rowindex][1] + vec4[2]*mat[rowindex][2] + vec4[3]*mat[rowindex][3])
1549
1550
1552
#define MAT_DOT_COL(mat,vec3,colindex) (vec3[0]*mat[0][colindex] + vec3[1]*mat[1][colindex] + vec3[2]*mat[2][colindex])
1553
1555
#define MAT_DOT_COL2(mat,vec2,colindex) (vec2[0]*mat[0][colindex] + vec2[1]*mat[1][colindex])
1556
1558
#define MAT_DOT_COL4(mat,vec4,colindex) (vec4[0]*mat[0][colindex] + vec4[1]*mat[1][colindex] + vec4[2]*mat[2][colindex] + vec4[3]*mat[3][colindex])
1559
1564
#define INV_MAT_DOT_VEC_3X3(p,m,v) \
1565
{ \
1566
p[0] = MAT_DOT_COL(m,v,0); \
1567
p[1] = MAT_DOT_COL(m,v,1); \
1568
p[2] = MAT_DOT_COL(m,v,2); \
1569
}\
1570
1571
1572
1573
#endif // GIM_VECTOR_H_INCLUDED
gim_math.h
gim_geom_types.h
Generated on Wed Feb 5 2014 21:36:54 for Bullet Collision Detection & Physics Library by
1.8.6