~ubuntu-branches/ubuntu/vivid/emscripten/vivid

« back to all changes in this revision

Viewing changes to tests/bullet/src/BulletCollision/Gimpact/gim_linear_math.h

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2013-05-02 13:11:51 UTC
  • Revision ID: package-import@ubuntu.com-20130502131151-q8dvteqr1ef2x7xz
Tags: upstream-1.4.1~20130504~adb56cb
ImportĀ upstreamĀ versionĀ 1.4.1~20130504~adb56cb

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#ifndef GIM_LINEAR_H_INCLUDED
 
2
#define GIM_LINEAR_H_INCLUDED
 
3
 
 
4
/*! \file gim_linear_math.h
 
5
*\author Francisco Leon Najera
 
6
Type Independant Vector and matrix operations.
 
7
*/
 
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
 
 
44
//! Zero out a 2D vector
 
45
#define VEC_ZERO_2(a)                           \
 
46
{                                               \
 
47
   (a)[0] = (a)[1] = 0.0f;                      \
 
48
}\
 
49
 
 
50
 
 
51
//! Zero out a 3D vector
 
52
#define VEC_ZERO(a)                             \
 
53
{                                               \
 
54
   (a)[0] = (a)[1] = (a)[2] = 0.0f;             \
 
55
}\
 
56
 
 
57
 
 
58
/// Zero out a 4D vector
 
59
#define VEC_ZERO_4(a)                           \
 
60
{                                               \
 
61
   (a)[0] = (a)[1] = (a)[2] = (a)[3] = 0.0f;    \
 
62
}\
 
63
 
 
64
 
 
65
/// Vector copy
 
66
#define VEC_COPY_2(b,a)                         \
 
67
{                                               \
 
68
   (b)[0] = (a)[0];                             \
 
69
   (b)[1] = (a)[1];                             \
 
70
}\
 
71
 
 
72
 
 
73
/// Copy 3D vector
 
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
 
 
82
/// Copy 4D vector
 
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
/// VECTOR SWAP
 
92
#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
/// Vector difference
 
100
#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
 
 
107
/// Vector difference
 
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
 
 
116
/// Vector difference
 
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
 
 
126
/// Vector sum
 
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
 
 
134
/// Vector sum
 
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
 
 
143
/// Vector sum
 
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
 
 
153
/// scalar times vector
 
154
#define VEC_SCALE_2(c,a,b)                      \
 
155
{                                               \
 
156
   (c)[0] = (a)*(b)[0];                         \
 
157
   (c)[1] = (a)*(b)[1];                         \
 
158
}\
 
159
 
 
160
 
 
161
/// scalar times vector
 
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
 
 
170
/// scalar times vector
 
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
 
 
180
/// accumulate scaled vector
 
181
#define VEC_ACCUM_2(c,a,b)                      \
 
182
{                                               \
 
183
   (c)[0] += (a)*(b)[0];                        \
 
184
   (c)[1] += (a)*(b)[1];                        \
 
185
}\
 
186
 
 
187
 
 
188
/// accumulate scaled vector
 
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
 
 
197
/// accumulate scaled vector
 
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
 
 
207
/// Vector dot product
 
208
#define VEC_DOT_2(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1])
 
209
 
 
210
 
 
211
/// Vector dot product
 
212
#define VEC_DOT(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2])
 
213
 
 
214
/// Vector dot product
 
215
#define VEC_DOT_4(a,b)  ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2] + (a)[3]*(b)[3])
 
216
 
 
217
/// vector impact parameter (squared)
 
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
 
 
224
/// vector impact parameter
 
225
#define VEC_IMPACT(bsq,direction,position)      {\
 
226
   VEC_IMPACT_SQ(bsq,direction,position);               \
 
227
   GIM_SQRT(bsq,bsq);                                   \
 
228
}\
 
229
 
 
230
/// Vector length
 
231
#define VEC_LENGTH_2(a,l)\
 
232
{\
 
233
    GREAL _pp = VEC_DOT_2(a,a);\
 
234
    GIM_SQRT(_pp,l);\
 
235
}\
 
236
 
 
237
 
 
238
/// Vector length
 
239
#define VEC_LENGTH(a,l)\
 
240
{\
 
241
    GREAL _pp = VEC_DOT(a,a);\
 
242
    GIM_SQRT(_pp,l);\
 
243
}\
 
244
 
 
245
 
 
246
/// Vector length
 
247
#define VEC_LENGTH_4(a,l)\
 
248
{\
 
249
    GREAL _pp = VEC_DOT_4(a,a);\
 
250
    GIM_SQRT(_pp,l);\
 
251
}\
 
252
 
 
253
/// Vector inv length
 
254
#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
 
 
261
/// Vector inv length
 
262
#define VEC_INV_LENGTH(a,l)\
 
263
{\
 
264
    GREAL _pp = VEC_DOT(a,a);\
 
265
    GIM_INV_SQRT(_pp,l);\
 
266
}\
 
267
 
 
268
 
 
269
/// Vector inv length
 
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
 
 
278
/// distance between two points
 
279
#define VEC_DISTANCE(_len,_va,_vb) {\
 
280
    vec3f _tmp_;                                \
 
281
    VEC_DIFF(_tmp_, _vb, _va);                  \
 
282
    VEC_LENGTH(_tmp_,_len);                     \
 
283
}\
 
284
 
 
285
 
 
286
/// Vector length
 
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
 
 
294
/// Vector length
 
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
/// Set Vector size
 
307
#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
/// Vector cross
 
320
#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
 
 
328
/*! Vector perp -- assumes that n is of unit length
 
329
 * accepts vector v, subtracts out any component parallel to n */
 
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
 
 
339
/*! Vector parallel -- assumes that n is of unit length */
 
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
/*! Same as Vector parallel --  n can have any length
 
349
 * accepts vector v, subtracts out any component perpendicular to n */
 
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
 
 
360
/*! accepts vector v*/
 
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
 
 
371
/*! Vector reflection -- assumes n is of unit length
 
372
 Takes vector v, reflects it against reflector n, and returns vr */
 
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
 
 
382
/*! Vector blending
 
383
Takes two vectors a, b, blends them together with two scalars */
 
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
/*! Vector blending
 
392
Takes two vectors a, b, blends them together with s <=1 */
 
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
 
 
397
//! Finds the bigger cartesian coordinate from a vector
 
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
//! Finds the 2 smallest cartesian coordinates from a vector
 
405
#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
 
 
420
/// Vector cross
 
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
 
 
447
/// initialize matrix
 
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
/*! initialize matrix */
 
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
/*! initialize matrix */
 
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
/*! matrix rotation  X */
 
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
/*! matrix rotation  Y */
 
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
/*! matrix rotation  Z */
 
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
/*! matrix copy */
 
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
 
 
601
/*! matrix copy */
 
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
 
 
614
/*! matrix copy */
 
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
 
 
631
/*! matrix copy */
 
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
 
 
656
/*! matrix transpose */
 
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
 
 
667
/*! matrix transpose */
 
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
 
 
684
/*! matrix transpose */
 
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
 
 
709
/*! multiply matrix by scalar */
 
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
 
 
720
/*! multiply matrix by scalar */
 
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
 
 
737
/*! multiply matrix by scalar */
 
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
 
 
762
/*! multiply matrix by scalar */
 
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
 
 
773
/*! multiply matrix by scalar. Each columns is scaled by each scalar vector component */
 
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
 
 
790
/*! multiply matrix by scalar */
 
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
 
 
815
/*! multiply matrix by scalar */
 
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
 
 
826
/*! multiply matrix by scalar */
 
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
 
 
843
/*! multiply matrix by scalar */
 
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
/*! matrix product */
 
868
/*! c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
 
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
/*! matrix product */
 
880
/*! c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
 
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
 
 
897
/*! matrix product */
 
898
/*! c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
 
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
 
 
923
/*! matrix times vector */
 
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
 
 
931
/*! matrix times vector */
 
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
 
 
940
/*! matrix times vector
 
941
v is a vec4f
 
942
*/
 
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
/*! matrix times vector
 
952
v is a vec3f
 
953
and m is a mat4f<br>
 
954
Last column is added as the position
 
955
*/
 
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
 
 
964
/*! vector transpose times matrix */
 
965
/*! p[j] = v[0]*m[0][j] + v[1]*m[1][j] + v[2]*m[2][j]; */
 
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
 
 
974
/*! affine matrix times vector */
 
975
/** The matrix is assumed to be an affine matrix, with last two
 
976
 * entries representing a translation */
 
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
//! Transform a plane
 
984
#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
 
 
994
/** inverse transpose of matrix times vector
 
995
 *
 
996
 * This macro computes inverse transpose of matrix m,
 
997
 * and multiplies vector v into it, to yeild vector p
 
998
 *
 
999
 * DANGER !!! Do Not use this on normal vectors!!!
 
1000
 * It will leave normals the wrong length !!!
 
1001
 * See macro below for use on normals.
 
1002
 */
 
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
 
 
1020
/** transform normal vector by inverse transpose of matrix
 
1021
 * and then renormalize the vector
 
1022
 *
 
1023
 * This macro computes inverse transpose of matrix m,
 
1024
 * and multiplies vector v into it, to yeild vector p
 
1025
 * Vector p is then normalized.
 
1026
 */
 
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
 
 
1047
/** outer product of vector times vector transpose
 
1048
 *
 
1049
 * The outer product of vector v and vector transpose t yeilds
 
1050
 * dyadic matrix m.
 
1051
 */
 
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
 
 
1062
/** outer product of vector times vector transpose
 
1063
 *
 
1064
 * The outer product of vector v and vector transpose t yeilds
 
1065
 * dyadic matrix m.
 
1066
 */
 
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
 
 
1083
/** outer product of vector times vector transpose
 
1084
 *
 
1085
 * The outer product of vector v and vector transpose t yeilds
 
1086
 * dyadic matrix m.
 
1087
 */
 
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
 
 
1112
/** outer product of vector times vector transpose
 
1113
 *
 
1114
 * The outer product of vector v and vector transpose t yeilds
 
1115
 * dyadic matrix m.
 
1116
 */
 
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
 
 
1127
/** outer product of vector times vector transpose
 
1128
 *
 
1129
 * The outer product of vector v and vector transpose t yeilds
 
1130
 * dyadic matrix m.
 
1131
 */
 
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
 
 
1148
/** outer product of vector times vector transpose
 
1149
 *
 
1150
 * The outer product of vector v and vector transpose t yeilds
 
1151
 * dyadic matrix m.
 
1152
 */
 
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
 
 
1177
/** determinant of matrix
 
1178
 *
 
1179
 * Computes determinant of matrix m, returning d
 
1180
 */
 
1181
#define DETERMINANT_2X2(d,m)                                    \
 
1182
{                                                               \
 
1183
   d = m[0][0] * m[1][1] - m[0][1] * m[1][0];                   \
 
1184
}\
 
1185
 
 
1186
 
 
1187
/** determinant of matrix
 
1188
 *
 
1189
 * Computes determinant of matrix m, returning d
 
1190
 */
 
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
 
 
1199
/** i,j,th cofactor of a 4x4 matrix
 
1200
 *
 
1201
 */
 
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
 
 
1225
/** determinant of matrix
 
1226
 *
 
1227
 * Computes determinant of matrix m, returning d
 
1228
 */
 
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
 
 
1243
/** cofactor of matrix
 
1244
 *
 
1245
 * Computes cofactor of matrix m, returning a
 
1246
 */
 
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
 
 
1256
/** cofactor of matrix
 
1257
 *
 
1258
 * Computes cofactor of matrix m, returning a
 
1259
 */
 
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
 
 
1274
/** cofactor of matrix
 
1275
 *
 
1276
 * Computes cofactor of matrix m, returning a
 
1277
 */
 
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
 
 
1290
/** adjoint of matrix
 
1291
 *
 
1292
 * Computes adjoint of matrix m, returning a
 
1293
 * (Note that adjoint is just the transpose of the cofactor matrix)
 
1294
 */
 
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
 
 
1304
/** adjoint of matrix
 
1305
 *
 
1306
 * Computes adjoint of matrix m, returning a
 
1307
 * (Note that adjoint is just the transpose of the cofactor matrix)
 
1308
 */
 
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
 
 
1323
/** adjoint of matrix
 
1324
 *
 
1325
 * Computes adjoint of matrix m, returning a
 
1326
 * (Note that adjoint is just the transpose of the cofactor matrix)
 
1327
 */
 
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
 
 
1340
/** compute adjoint of matrix and scale
 
1341
 *
 
1342
 * Computes adjoint of matrix m, scales it by s, returning a
 
1343
 */
 
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
 
 
1353
/** compute adjoint of matrix and scale
 
1354
 *
 
1355
 * Computes adjoint of matrix m, scales it by s, returning a
 
1356
 */
 
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
 
 
1373
/** compute adjoint of matrix and scale
 
1374
 *
 
1375
 * Computes adjoint of matrix m, scales it by s, returning a
 
1376
 */
 
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
/** inverse of matrix
 
1389
 *
 
1390
 * Compute inverse of matrix a, returning determinant m and
 
1391
 * inverse b
 
1392
 */
 
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
 
 
1402
/** inverse of matrix
 
1403
 *
 
1404
 * Compute inverse of matrix a, returning determinant m and
 
1405
 * inverse b
 
1406
 */
 
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
 
 
1416
/** inverse of matrix
 
1417
 *
 
1418
 * Compute inverse of matrix a, returning determinant m and
 
1419
 * inverse b
 
1420
 */
 
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
//! Get the triple(3) row of a transform matrix
 
1430
#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
//! Get the tuple(2) row of a transform matrix
 
1438
#define MAT_GET_ROW2(mat,vec2,rowindex)\
 
1439
{\
 
1440
    vec2[0] = mat[rowindex][0];\
 
1441
    vec2[1] = mat[rowindex][1];\
 
1442
}\
 
1443
 
 
1444
 
 
1445
//! Get the quad (4) row of a transform matrix
 
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
//! Get the triple(3) col of a transform matrix
 
1455
#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
//! Get the tuple(2) col of a transform matrix
 
1463
#define MAT_GET_COL2(mat,vec2,colindex)\
 
1464
{\
 
1465
    vec2[0] = mat[0][colindex];\
 
1466
    vec2[1] = mat[1][colindex];\
 
1467
}\
 
1468
 
 
1469
 
 
1470
//! Get the quad (4) col of a transform matrix
 
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
//! Get the triple(3) col of a transform matrix
 
1480
#define MAT_GET_X(mat,vec3)\
 
1481
{\
 
1482
    MAT_GET_COL(mat,vec3,0);\
 
1483
}\
 
1484
 
 
1485
//! Get the triple(3) col of a transform matrix
 
1486
#define MAT_GET_Y(mat,vec3)\
 
1487
{\
 
1488
    MAT_GET_COL(mat,vec3,1);\
 
1489
}\
 
1490
 
 
1491
//! Get the triple(3) col of a transform matrix
 
1492
#define MAT_GET_Z(mat,vec3)\
 
1493
{\
 
1494
    MAT_GET_COL(mat,vec3,2);\
 
1495
}\
 
1496
 
 
1497
 
 
1498
//! Get the triple(3) col of a transform matrix
 
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
//! Get the triple(3) col of a transform matrix
 
1507
#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
//! Get the triple(3) col of a transform matrix
 
1515
#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
 
 
1523
//! Get the triple(3) col of a transform matrix
 
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
//! Set the triple(3) col of a transform matrix
 
1532
#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
 
 
1541
//! Returns the dot product between a vec3f and the row of a matrix
 
1542
#define MAT_DOT_ROW(mat,vec3,rowindex) (vec3[0]*mat[rowindex][0] + vec3[1]*mat[rowindex][1] + vec3[2]*mat[rowindex][2])
 
1543
 
 
1544
//! Returns the dot product between a vec2f and the row of a matrix
 
1545
#define MAT_DOT_ROW2(mat,vec2,rowindex) (vec2[0]*mat[rowindex][0] + vec2[1]*mat[rowindex][1])
 
1546
 
 
1547
//! Returns the dot product between a vec4f and the row of a matrix
 
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
 
 
1551
//! Returns the dot product between a vec3f and the col of a matrix
 
1552
#define MAT_DOT_COL(mat,vec3,colindex) (vec3[0]*mat[0][colindex] + vec3[1]*mat[1][colindex] + vec3[2]*mat[2][colindex])
 
1553
 
 
1554
//! Returns the dot product between a vec2f and the col of a matrix
 
1555
#define MAT_DOT_COL2(mat,vec2,colindex) (vec2[0]*mat[0][colindex] + vec2[1]*mat[1][colindex])
 
1556
 
 
1557
//! Returns the dot product between a vec4f and the col of a matrix
 
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
 
 
1560
/*!Transpose matrix times vector
 
1561
v is a vec3f
 
1562
and m is a mat4f<br>
 
1563
*/
 
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