Isle
Loading...
Searching...
No Matches
vec.h
Go to the documentation of this file.
1/*
2 * vec.h -- Vector macros for 2,3, and 4 dimensions,
3 * for any combination of C scalar types.
4 *
5 * Author: Don Hatch (hatch@sgi.com)
6 * Last modified: Fri Dec 15 01:57:07 PST 1995
7 *
8 * General description:
9 *
10 * The macro name describes its arguments; e.g.
11 * MXS3 is "matrix times scalar in 3 dimensions";
12 * VMV2 is "vector minus vector in 2 dimensions".
13 *
14 * If the result of an operation is a scalar, then the macro "returns"
15 * the value; e.g.
16 * result = DOT3(v,w);
17 * result = DET4(m);
18 *
19 * If the result of an operation is a vector or matrix, then
20 * the first argument is the destination; e.g.
21 * SET2(tovec, fromvec);
22 * MXM3(result, m1, m2);
23 *
24 * WARNING: For the operations that are not done "componentwise"
25 * (e.g. vector cross products and matrix multiplies)
26 * the destination should not be either of the arguments,
27 * for obvious reasons. For example, the following is wrong:
28 * VXM2(v,v,m);
29 * For such "unsafe" macros, there are safe versions provided,
30 * but you have to specify a type for the temporary
31 * result vector or matrix. For example, the safe versions
32 * of VXM2 are:
33 * VXM2d(v,v,m) if v's scalar type is double or float
34 * VXM2i(v,v,m) if v's scalar type is int or char
35 * VXM2l(v,v,m) if v's scalar type is long
36 * VXM2r(v,v,m) if v's scalar type is real
37 * VXM2safe(type,v,v,m) for other scalar types.
38 *
39 * These "safe" macros and INVERTMAT do not evaluate to C expressions
40 * (so, for example, they can't be used inside the parentheses of
41 * a for(...)).
42 *
43 * Specific descriptions:
44 *
45 * The "?"'s in the following can be 2, 3, or 4.
46 *
47 * EXPAND?(v) comma-separated list of elements of v
48 *
49 * SET?(to,from) to = from
50 * SETMAT?(to,from) to = from
51 * ROUNDVEC?(to,from) to = from with entries rounded
52 * to nearest integer
53 * ROUNDMAT?(to,from) to = from with entries rounded
54 * to nearest integer
55 * FILLVEC?(v,s) set each entry of vector v to be s
56 * FILLMAT?(m,s) set each entry of matrix m to be s
57 * ZEROVEC?(v) v = 0
58 * ISZEROVEC?(v) v == 0
59 * EQVEC?(v,w) v == w
60 * EQMAT?(m1,m2) m1 == m2
61 * ZEROMAT?(m) m = 0
62 * IDENTMAT?(m) m = 1
63 * TRANSPOSE?(to,from) (matrix to) = (transpose of matrix from)
64 * ADJOINT?(to,from) (matrix to) = (adjoint of matrix from)
65 * i.e. its determinant times its inverse
66 * INVERTMAT?{d,i,l,r}(to,from) (matrix to) = (inverse of matrix from)
67 * with temp adjoint and determinant type
68 * double, int, long, or real respectively
69 *
70 * V{P,M}V?(to,v,w) to = v {+,-} w
71 * M{P,M}M?(to,m1,m2) to = m1 {+,-} m2
72 * SX{V,M}?(to,s,from) to = s * from
73 * VPSXV?(to,v,s,w) to = v + s*w
74 * VPVXS?(to,v,w,s) to = v + w*s
75 * M{V,M}?(to,from) to = -from
76 * {V,M}{X,D}S?(to,from,s) to = from {*,/} s
77 * MXM?(to,m1,m2) to = m1 * m2
78 * VXM?(to,v,m) (row vec to) = (row vec v) * m
79 * MXV?(to,m,v) (column vec to) = m * (column vec v)
80 * VMODS?(to,v,s) to = v mod s (always >= 0)
81 * VMODV?(to,v0,v1) to = v0 mod v1 componentwise
82 * VDIVS?(to,v,s) to = (v-(v mod s))/s
83 * VDIVV?(to,v0,v1) to = (v0-(v0 mod v1))/v1 componentwise
84 * V{MIN,MAX}S?(to,v,s) to = {MIN,MAX}(v, s)
85 * V{MIN,MAX}V?(to,v0,v1) to = {MIN,MAX}(v0, v1)
86 * LERP?(to,v0,v1,t) to = v0 + t*(v1-v0)
87 *
88 * DET?(m) determinant of m
89 * TRACE?(m) trace (sum of diagonal entries) of m
90 * DOT?(v,w) dot (scalar) product of v and w
91 * NORMSQRD?(v) square of |v|
92 * DISTSQRD?(v,w) square of |v-w|
93 *
94 * XV2(to,v) to = v rotated by 90 degrees
95 * VXV3(to,v1,v2) to = cross (vector) product of v1 and v2
96 * VXVXV4(to,v1,v2,v3) to = 4-dimensional vector cross product
97 * of v1,v2,v3 (a vector orthogonal to
98 * v1,v2,v3 whose length equals the
99 * volume of the spanned parallelotope)
100 * VXV2(v0,v1) determinant of matrix with rows v0,v1
101 * VXVXV3(v0,v1,v2) determinant of matrix with rows v0,v1,v2
102 * VXVXVXV4(v0,v1,v2,v3) determinant of matrix with rows v0,..,v3
103 *
104 * The following macros mix objects from different dimensions.
105 * For example, V3XM4 would be used to apply a composite
106 * 4x4 rotation-and-translation matrix to a 3d vector.
107 *
108 * SET3from2(to,from,pad) (3d vec to) = (2d vec from) with pad
109 * SET4from3(to,from,pad) (4d vec to) = (3d vec from) with pad
110 * SETMAT3from2(to,from,pad0,pad1) (3x3 mat to) = (2x2 mat from)
111 * padded with pad0 on the sides
112 * and pad1 in the corner
113 * SETMAT4from3(to,from,pad0,pad1) (4x4 mat to) = (3x3 mat from)
114 * padded with pad0 on the sides
115 * and pad1 in the corner
116 * V2XM3(to2,v2,m3) (2d row vec to2) = (2d row vec v2) * (3x3 mat m3)
117 * V3XM4(to3,v3,m4) (3d row vec to3) = (3d row vec v2) * (4x4 mat m4)
118 * M3XV2(to2,m3,v2) (2d col vec to2) = (3x3 mat m3) * (2d col vec v2)
119 * M4XV3(to3,m4,v3) (3d col vec to3) = (4x4 mat m4) * (3d col vec v3)
120 * M2XM3(to3,m2,m3) (3x3 mat to3) = (2x2 mat m2) * (3x3 mat m3)
121 * M3XM4(to4,m3,m4) (4x4 mat to4) = (3x3 mat m3) * (4x4 mat m4)
122 * M3XM2(to3,m3,m2) (3x3 mat to3) = (3x3 mat m3) * (2x2 mat m2)
123 * M4XM3(to4,m4,m3) (4x4 mat to4) = (4x4 mat m4) * (3x3 mat m3)
124 *
125 *
126 * This file is machine-generated and can be regenerated
127 * for any number of dimensions.
128 * The program that generated it is available upon request.
129 */
130
131#ifndef VEC_H
132#define VEC_H 4
133#include <math.h> /* for definition of floor() */
134#define EXPAND2(v) (v)[0], (v)[1]
135#define EXPAND3(v) (v)[0], (v)[1], (v)[2]
136#define EXPAND4(v) (v)[0], (v)[1], (v)[2], (v)[3]
137#define SET2(to,from) \
138 ((to)[0] = (from)[0], \
139 (to)[1] = (from)[1])
140#define SETMAT2(to,from) \
141 (SET2((to)[0], (from)[0]), \
142 SET2((to)[1], (from)[1]))
143#define ROUNDVEC2(to,from) \
144 ((to)[0] = floor((from)[0]+.5), \
145 (to)[1] = floor((from)[1]+.5))
146#define ROUNDMAT2(to,from) \
147 (ROUNDVEC2((to)[0], (from)[0]), \
148 ROUNDVEC2((to)[1], (from)[1]))
149#define FILLVEC2(v,s) \
150 ((v)[0] = (s), \
151 (v)[1] = (s))
152#define FILLMAT2(m,s) \
153 (FILLVEC2((m)[0], s), \
154 FILLVEC2((m)[1], s))
155#define ZEROVEC2(v) \
156 ((v)[0] = 0, \
157 (v)[1] = 0)
158#define ISZEROVEC2(v) \
159 ((v)[0] == 0 && \
160 (v)[1] == 0)
161#define EQVEC2(v,w) \
162 ((v)[0] == (w)[0] && \
163 (v)[1] == (w)[1])
164#define EQMAT2(m1,m2) \
165 (EQVEC2((m1)[0], (m2)[0]) && \
166 EQVEC2((m1)[1], (m2)[1]))
167#define ZEROMAT2(m) \
168 (ZEROVEC2((m)[0]), \
169 ZEROVEC2((m)[1]))
170#define IDENTMAT2(m) \
171 (ZEROVEC2((m)[0]), (m)[0][0]=1, \
172 ZEROVEC2((m)[1]), (m)[1][1]=1)
173#define TRANSPOSE2(to,from) \
174 (_SETcol2((to)[0], from, 0), \
175 _SETcol2((to)[1], from, 1))
176#define VPSXV2(to,v,s,w) \
177 ((to)[0] = (v)[0] + (s) * (w)[0], \
178 (to)[1] = (v)[1] + (s) * (w)[1])
179#define VPVXS2(to,v,w,s) \
180 ((to)[0] = (v)[0] + (w)[0] * (s), \
181 (to)[1] = (v)[1] + (w)[1] * (s))
182#define VPV2(to,v,w) \
183 ((to)[0] = (v)[0] + (w)[0], \
184 (to)[1] = (v)[1] + (w)[1])
185#define VMV2(to,v,w) \
186 ((to)[0] = (v)[0] - (w)[0], \
187 (to)[1] = (v)[1] - (w)[1])
188#define MPM2(to,m1,m2) \
189 (VPV2((to)[0], (m1)[0], (m2)[0]), \
190 VPV2((to)[1], (m1)[1], (m2)[1]))
191#define MMM2(to,m1,m2) \
192 (VMV2((to)[0], (m1)[0], (m2)[0]), \
193 VMV2((to)[1], (m1)[1], (m2)[1]))
194#define SXV2(to,s,from) \
195 ((to)[0] = (s) * (from)[0], \
196 (to)[1] = (s) * (from)[1])
197#define SXM2(to,s,from) \
198 (SXV2((to)[0], s, (from)[0]), \
199 SXV2((to)[1], s, (from)[1]))
200#define MV2(to,from) \
201 ((to)[0] = -(from)[0], \
202 (to)[1] = -(from)[1])
203#define MM2(to,from) \
204 (MV2((to)[0], (from)[0]), \
205 MV2((to)[1], (from)[1]))
206#define VXS2(to,from,s) \
207 ((to)[0] = (from)[0] * (s), \
208 (to)[1] = (from)[1] * (s))
209#define VDS2(to,from,s) \
210 ((to)[0] = (from)[0] / (s), \
211 (to)[1] = (from)[1] / (s))
212#define MXS2(to,from,s) \
213 (VXS2((to)[0], (from)[0], s), \
214 VXS2((to)[1], (from)[1], s))
215#define MDS2(to,from,s) \
216 (VDS2((to)[0], (from)[0], s), \
217 VDS2((to)[1], (from)[1], s))
218#define MXM2(to,m1,m2) \
219 (VXM2((to)[0], (m1)[0], m2), \
220 VXM2((to)[1], (m1)[1], m2))
221#define VXM2(to,v,m) \
222 ((to)[0] = _DOTcol2(v, m, 0), \
223 (to)[1] = _DOTcol2(v, m, 1))
224#define MXV2(to,m,v) \
225 ((to)[0] = DOT2((m)[0], v), \
226 (to)[1] = DOT2((m)[1], v))
227#define VMODS2(to,v,s) \
228 ((to)[0] = SMODS1((v)[0], s), \
229 (to)[1] = SMODS1((v)[1], s))
230#define VMODV2(to,v0,v1) \
231 ((to)[0] = SMODS1((v0)[0], (v1)[0]), \
232 (to)[1] = SMODS1((v0)[1], (v1)[1]))
233#define VDIVS2(to,v,s) \
234 ((to)[0] = SDIVS1((v)[0], s), \
235 (to)[1] = SDIVS1((v)[1], s))
236#define VDIVV2(to,v0,v1) \
237 ((to)[0] = SDIVS1((v0)[0], (v1)[0]), \
238 (to)[1] = SDIVS1((v0)[1], (v1)[1]))
239#define VMINS2(to,v,s) \
240 ((to)[0] = SMINS1((v)[0], s), \
241 (to)[1] = SMINS1((v)[1], s))
242#define VMINV2(to,v0,v1) \
243 ((to)[0] = SMINS1((v0)[0], (v1)[0]), \
244 (to)[1] = SMINS1((v0)[1], (v1)[1]))
245#define VMAXS2(to,v,s) \
246 ((to)[0] = SMAXS1((v)[0], s), \
247 (to)[1] = SMAXS1((v)[1], s))
248#define VMAXV2(to,v0,v1) \
249 ((to)[0] = SMAXS1((v0)[0], (v1)[0]), \
250 (to)[1] = SMAXS1((v0)[1], (v1)[1]))
251#define LERP2(to,v0,v1,t) \
252 ((to)[0]=(v0)[0]+(t)*((v1)[0]-(v0)[0]), \
253 (to)[1]=(v0)[1]+(t)*((v1)[1]-(v0)[1]))
254#define TRACE2(m) \
255 ((m)[0][0] + \
256 (m)[1][1])
257#define DOT2(v,w) \
258 ((v)[0] * (w)[0] + \
259 (v)[1] * (w)[1])
260#define NORMSQRD2(v) \
261 ((v)[0] * (v)[0] + \
262 (v)[1] * (v)[1])
263#define DISTSQRD2(v,w) \
264 (((v)[0]-(w)[0])*((v)[0]-(w)[0]) + \
265 ((v)[1]-(w)[1])*((v)[1]-(w)[1]))
266#define _DOTcol2(v,m,j) \
267 ((v)[0] * (m)[0][j] + \
268 (v)[1] * (m)[1][j])
269#define _SETcol2(v,m,j) \
270 ((v)[0] = (m)[0][j], \
271 (v)[1] = (m)[1][j])
272#define _MXVcol2(to,m,M,j) \
273 ((to)[0][j] = _DOTcol2((m)[0],M,j), \
274 (to)[1][j] = _DOTcol2((m)[1],M,j))
275#define _DET2(v0,v1,i0,i1) \
276 ((v0)[i0]* _DET1(v1,i1) + \
277 (v0)[i1]*-_DET1(v1,i0))
278#define XV2(to,v1) \
279 ((to)[0] = -_DET1(v1, 1), \
280 (to)[1] = _DET1(v1, 0))
281#define V2XM3(to2,v2,m3) \
282 ((to2)[0] = _DOTcol2(v2,m3,0) + (m3)[2][0], \
283 (to2)[1] = _DOTcol2(v2,m3,1) + (m3)[2][1])
284#define M3XV2(to2,m3,v2) \
285 ((to2)[0] = DOT2((m3)[0],v2) + (m3)[0][2], \
286 (to2)[1] = DOT2((m3)[1],v2) + (m3)[1][2])
287#define _DET1(v0,i0) \
288 ((v0)[i0])
289#define VXV2(v0,v1) \
290 (_DET2(v0,v1,0,1))
291#define DET2(m) \
292 (VXV2((m)[0],(m)[1]))
293#define SMODS1(a,b) \
294 ((((a)%(b)+(b))%(b)))
295#define SDIVS1(a,b) \
296 ((((a)-SMODS1(a,b))/(b)))
297#define SMINS1(a,b) \
298 (((a) < (b) ? (a) : (b)))
299#define SMAXS1(a,b) \
300 (((a) > (b) ? (a) : (b)))
301#define ADJOINT2(to,m) \
302 ( _ADJOINTcol2(to,0,m,1), \
303 __ADJOINTcol2(to,1,m,0))
304#define _ADJOINTcol2(to,col,m,i1) \
305 ((to)[0][col] = _DET1(m[i1], 1), \
306 (to)[1][col] = -_DET1(m[i1], 0))
307#define __ADJOINTcol2(to,col,m,i1) \
308 ((to)[0][col] = -_DET1(m[i1], 1), \
309 (to)[1][col] = _DET1(m[i1], 0))
310#define SET3(to,from) \
311 ((to)[0] = (from)[0], \
312 (to)[1] = (from)[1], \
313 (to)[2] = (from)[2])
314#define SETMAT3(to,from) \
315 (SET3((to)[0], (from)[0]), \
316 SET3((to)[1], (from)[1]), \
317 SET3((to)[2], (from)[2]))
318#define ROUNDVEC3(to,from) \
319 ((to)[0] = floor((from)[0]+.5), \
320 (to)[1] = floor((from)[1]+.5), \
321 (to)[2] = floor((from)[2]+.5))
322#define ROUNDMAT3(to,from) \
323 (ROUNDVEC3((to)[0], (from)[0]), \
324 ROUNDVEC3((to)[1], (from)[1]), \
325 ROUNDVEC3((to)[2], (from)[2]))
326#define FILLVEC3(v,s) \
327 ((v)[0] = (s), \
328 (v)[1] = (s), \
329 (v)[2] = (s))
330#define FILLMAT3(m,s) \
331 (FILLVEC3((m)[0], s), \
332 FILLVEC3((m)[1], s), \
333 FILLVEC3((m)[2], s))
334#define ZEROVEC3(v) \
335 ((v)[0] = 0, \
336 (v)[1] = 0, \
337 (v)[2] = 0)
338#define ISZEROVEC3(v) \
339 ((v)[0] == 0 && \
340 (v)[1] == 0 && \
341 (v)[2] == 0)
342#define EQVEC3(v,w) \
343 ((v)[0] == (w)[0] && \
344 (v)[1] == (w)[1] && \
345 (v)[2] == (w)[2])
346#define EQMAT3(m1,m2) \
347 (EQVEC3((m1)[0], (m2)[0]) && \
348 EQVEC3((m1)[1], (m2)[1]) && \
349 EQVEC3((m1)[2], (m2)[2]))
350#define ZEROMAT3(m) \
351 (ZEROVEC3((m)[0]), \
352 ZEROVEC3((m)[1]), \
353 ZEROVEC3((m)[2]))
354#define IDENTMAT3(m) \
355 (ZEROVEC3((m)[0]), (m)[0][0]=1, \
356 ZEROVEC3((m)[1]), (m)[1][1]=1, \
357 ZEROVEC3((m)[2]), (m)[2][2]=1)
358#define TRANSPOSE3(to,from) \
359 (_SETcol3((to)[0], from, 0), \
360 _SETcol3((to)[1], from, 1), \
361 _SETcol3((to)[2], from, 2))
362#define VPSXV3(to,v,s,w) \
363 ((to)[0] = (v)[0] + (s) * (w)[0], \
364 (to)[1] = (v)[1] + (s) * (w)[1], \
365 (to)[2] = (v)[2] + (s) * (w)[2])
366#define VPVXS3(to,v,w,s) \
367 ((to)[0] = (v)[0] + (w)[0] * (s), \
368 (to)[1] = (v)[1] + (w)[1] * (s), \
369 (to)[2] = (v)[2] + (w)[2] * (s))
370#define VPV3(to,v,w) \
371 ((to)[0] = (v)[0] + (w)[0], \
372 (to)[1] = (v)[1] + (w)[1], \
373 (to)[2] = (v)[2] + (w)[2])
374#define VMV3(to,v,w) \
375 ((to)[0] = (v)[0] - (w)[0], \
376 (to)[1] = (v)[1] - (w)[1], \
377 (to)[2] = (v)[2] - (w)[2])
378#define MPM3(to,m1,m2) \
379 (VPV3((to)[0], (m1)[0], (m2)[0]), \
380 VPV3((to)[1], (m1)[1], (m2)[1]), \
381 VPV3((to)[2], (m1)[2], (m2)[2]))
382#define MMM3(to,m1,m2) \
383 (VMV3((to)[0], (m1)[0], (m2)[0]), \
384 VMV3((to)[1], (m1)[1], (m2)[1]), \
385 VMV3((to)[2], (m1)[2], (m2)[2]))
386#define SXV3(to,s,from) \
387 ((to)[0] = (s) * (from)[0], \
388 (to)[1] = (s) * (from)[1], \
389 (to)[2] = (s) * (from)[2])
390#define SXM3(to,s,from) \
391 (SXV3((to)[0], s, (from)[0]), \
392 SXV3((to)[1], s, (from)[1]), \
393 SXV3((to)[2], s, (from)[2]))
394#define MV3(to,from) \
395 ((to)[0] = -(from)[0], \
396 (to)[1] = -(from)[1], \
397 (to)[2] = -(from)[2])
398#define MM3(to,from) \
399 (MV3((to)[0], (from)[0]), \
400 MV3((to)[1], (from)[1]), \
401 MV3((to)[2], (from)[2]))
402#define VXS3(to,from,s) \
403 ((to)[0] = (from)[0] * (s), \
404 (to)[1] = (from)[1] * (s), \
405 (to)[2] = (from)[2] * (s))
406#define VDS3(to,from,s) \
407 ((to)[0] = (from)[0] / (s), \
408 (to)[1] = (from)[1] / (s), \
409 (to)[2] = (from)[2] / (s))
410#define MXS3(to,from,s) \
411 (VXS3((to)[0], (from)[0], s), \
412 VXS3((to)[1], (from)[1], s), \
413 VXS3((to)[2], (from)[2], s))
414#define MDS3(to,from,s) \
415 (VDS3((to)[0], (from)[0], s), \
416 VDS3((to)[1], (from)[1], s), \
417 VDS3((to)[2], (from)[2], s))
418#define MXM3(to,m1,m2) \
419 (VXM3((to)[0], (m1)[0], m2), \
420 VXM3((to)[1], (m1)[1], m2), \
421 VXM3((to)[2], (m1)[2], m2))
422#define VXM3(to,v,m) \
423 ((to)[0] = _DOTcol3(v, m, 0), \
424 (to)[1] = _DOTcol3(v, m, 1), \
425 (to)[2] = _DOTcol3(v, m, 2))
426#define MXV3(to,m,v) \
427 ((to)[0] = DOT3((m)[0], v), \
428 (to)[1] = DOT3((m)[1], v), \
429 (to)[2] = DOT3((m)[2], v))
430#define VMODS3(to,v,s) \
431 ((to)[0] = SMODS1((v)[0], s), \
432 (to)[1] = SMODS1((v)[1], s), \
433 (to)[2] = SMODS1((v)[2], s))
434#define VMODV3(to,v0,v1) \
435 ((to)[0] = SMODS1((v0)[0], (v1)[0]), \
436 (to)[1] = SMODS1((v0)[1], (v1)[1]), \
437 (to)[2] = SMODS1((v0)[2], (v1)[2]))
438#define VDIVS3(to,v,s) \
439 ((to)[0] = SDIVS1((v)[0], s), \
440 (to)[1] = SDIVS1((v)[1], s), \
441 (to)[2] = SDIVS1((v)[2], s))
442#define VDIVV3(to,v0,v1) \
443 ((to)[0] = SDIVS1((v0)[0], (v1)[0]), \
444 (to)[1] = SDIVS1((v0)[1], (v1)[1]), \
445 (to)[2] = SDIVS1((v0)[2], (v1)[2]))
446#define VMINS3(to,v,s) \
447 ((to)[0] = SMINS1((v)[0], s), \
448 (to)[1] = SMINS1((v)[1], s), \
449 (to)[2] = SMINS1((v)[2], s))
450#define VMINV3(to,v0,v1) \
451 ((to)[0] = SMINS1((v0)[0], (v1)[0]), \
452 (to)[1] = SMINS1((v0)[1], (v1)[1]), \
453 (to)[2] = SMINS1((v0)[2], (v1)[2]))
454#define VMAXS3(to,v,s) \
455 ((to)[0] = SMAXS1((v)[0], s), \
456 (to)[1] = SMAXS1((v)[1], s), \
457 (to)[2] = SMAXS1((v)[2], s))
458#define VMAXV3(to,v0,v1) \
459 ((to)[0] = SMAXS1((v0)[0], (v1)[0]), \
460 (to)[1] = SMAXS1((v0)[1], (v1)[1]), \
461 (to)[2] = SMAXS1((v0)[2], (v1)[2]))
462#define LERP3(to,v0,v1,t) \
463 ((to)[0]=(v0)[0]+(t)*((v1)[0]-(v0)[0]), \
464 (to)[1]=(v0)[1]+(t)*((v1)[1]-(v0)[1]), \
465 (to)[2]=(v0)[2]+(t)*((v1)[2]-(v0)[2]))
466#define TRACE3(m) \
467 ((m)[0][0] + \
468 (m)[1][1] + \
469 (m)[2][2])
470#define DOT3(v,w) \
471 ((v)[0] * (w)[0] + \
472 (v)[1] * (w)[1] + \
473 (v)[2] * (w)[2])
474#define NORMSQRD3(v) \
475 ((v)[0] * (v)[0] + \
476 (v)[1] * (v)[1] + \
477 (v)[2] * (v)[2])
478#define DISTSQRD3(v,w) \
479 (((v)[0]-(w)[0])*((v)[0]-(w)[0]) + \
480 ((v)[1]-(w)[1])*((v)[1]-(w)[1]) + \
481 ((v)[2]-(w)[2])*((v)[2]-(w)[2]))
482#define _DOTcol3(v,m,j) \
483 ((v)[0] * (m)[0][j] + \
484 (v)[1] * (m)[1][j] + \
485 (v)[2] * (m)[2][j])
486#define _SETcol3(v,m,j) \
487 ((v)[0] = (m)[0][j], \
488 (v)[1] = (m)[1][j], \
489 (v)[2] = (m)[2][j])
490#define _MXVcol3(to,m,M,j) \
491 ((to)[0][j] = _DOTcol3((m)[0],M,j), \
492 (to)[1][j] = _DOTcol3((m)[1],M,j), \
493 (to)[2][j] = _DOTcol3((m)[2],M,j))
494#define _DET3(v0,v1,v2,i0,i1,i2) \
495 ((v0)[i0]* _DET2(v1,v2,i1,i2) + \
496 (v0)[i1]*-_DET2(v1,v2,i0,i2) + \
497 (v0)[i2]* _DET2(v1,v2,i0,i1))
498#define VXV3(to,v1,v2) \
499 ((to)[0] = _DET2(v1,v2, 1,2), \
500 (to)[1] = -_DET2(v1,v2, 0,2), \
501 (to)[2] = _DET2(v1,v2, 0,1))
502#define SET3from2(to,from,pad) \
503 ((to)[0] = (from)[0], \
504 (to)[1] = (from)[1], \
505 (to)[2] = (pad))
506#define SETMAT3from2(to,from,pad0,pad1) \
507 (SET3from2((to)[0], (from)[0], pad0), \
508 SET3from2((to)[1], (from)[1], pad0), \
509 FILLVEC2((to)[2], (pad0)), (to)[2][2] = (pad1))
510#define M2XM3(to3,m2,m3) \
511 (_MXVcol2(to3,m2,m3,0), (to3)[2][0]=(m3)[2][0], \
512 _MXVcol2(to3,m2,m3,1), (to3)[2][1]=(m3)[2][1], \
513 _MXVcol2(to3,m2,m3,2), (to3)[2][2]=(m3)[2][2])
514#define M3XM2(to3,m3,m2) \
515 (VXM2((to3)[0],(m3)[0],m2), (to3)[0][2]=(m3)[0][2], \
516 VXM2((to3)[1],(m3)[1],m2), (to3)[1][2]=(m3)[1][2], \
517 VXM2((to3)[2],(m3)[2],m2), (to3)[2][2]=(m3)[2][2])
518#define V3XM4(to3,v3,m4) \
519 ((to3)[0] = _DOTcol3(v3,m4,0) + (m4)[3][0], \
520 (to3)[1] = _DOTcol3(v3,m4,1) + (m4)[3][1], \
521 (to3)[2] = _DOTcol3(v3,m4,2) + (m4)[3][2])
522#define M4XV3(to3,m4,v3) \
523 ((to3)[0] = DOT3((m4)[0],v3) + (m4)[0][3], \
524 (to3)[1] = DOT3((m4)[1],v3) + (m4)[1][3], \
525 (to3)[2] = DOT3((m4)[2],v3) + (m4)[2][3])
526#define VXVXV3(v0,v1,v2) \
527 (_DET3(v0,v1,v2,0,1,2))
528#define DET3(m) \
529 (VXVXV3((m)[0],(m)[1],(m)[2]))
530#define ADJOINT3(to,m) \
531 ( _ADJOINTcol3(to,0,m,1,2), \
532 __ADJOINTcol3(to,1,m,0,2), \
533 _ADJOINTcol3(to,2,m,0,1))
534#define _ADJOINTcol3(to,col,m,i1,i2) \
535 ((to)[0][col] = _DET2(m[i1],m[i2], 1,2), \
536 (to)[1][col] = -_DET2(m[i1],m[i2], 0,2), \
537 (to)[2][col] = _DET2(m[i1],m[i2], 0,1))
538#define __ADJOINTcol3(to,col,m,i1,i2) \
539 ((to)[0][col] = -_DET2(m[i1],m[i2], 1,2), \
540 (to)[1][col] = _DET2(m[i1],m[i2], 0,2), \
541 (to)[2][col] = -_DET2(m[i1],m[i2], 0,1))
542#define SET4(to,from) \
543 ((to)[0] = (from)[0], \
544 (to)[1] = (from)[1], \
545 (to)[2] = (from)[2], \
546 (to)[3] = (from)[3])
547#define SETMAT4(to,from) \
548 (SET4((to)[0], (from)[0]), \
549 SET4((to)[1], (from)[1]), \
550 SET4((to)[2], (from)[2]), \
551 SET4((to)[3], (from)[3]))
552#define ROUNDVEC4(to,from) \
553 ((to)[0] = floor((from)[0]+.5), \
554 (to)[1] = floor((from)[1]+.5), \
555 (to)[2] = floor((from)[2]+.5), \
556 (to)[3] = floor((from)[3]+.5))
557#define ROUNDMAT4(to,from) \
558 (ROUNDVEC4((to)[0], (from)[0]), \
559 ROUNDVEC4((to)[1], (from)[1]), \
560 ROUNDVEC4((to)[2], (from)[2]), \
561 ROUNDVEC4((to)[3], (from)[3]))
562#define FILLVEC4(v,s) \
563 ((v)[0] = (s), \
564 (v)[1] = (s), \
565 (v)[2] = (s), \
566 (v)[3] = (s))
567#define FILLMAT4(m,s) \
568 (FILLVEC4((m)[0], s), \
569 FILLVEC4((m)[1], s), \
570 FILLVEC4((m)[2], s), \
571 FILLVEC4((m)[3], s))
572#define ZEROVEC4(v) \
573 ((v)[0] = 0, \
574 (v)[1] = 0, \
575 (v)[2] = 0, \
576 (v)[3] = 0)
577#define ISZEROVEC4(v) \
578 ((v)[0] == 0 && \
579 (v)[1] == 0 && \
580 (v)[2] == 0 && \
581 (v)[3] == 0)
582#define EQVEC4(v,w) \
583 ((v)[0] == (w)[0] && \
584 (v)[1] == (w)[1] && \
585 (v)[2] == (w)[2] && \
586 (v)[3] == (w)[3])
587#define EQMAT4(m1,m2) \
588 (EQVEC4((m1)[0], (m2)[0]) && \
589 EQVEC4((m1)[1], (m2)[1]) && \
590 EQVEC4((m1)[2], (m2)[2]) && \
591 EQVEC4((m1)[3], (m2)[3]))
592#define ZEROMAT4(m) \
593 (ZEROVEC4((m)[0]), \
594 ZEROVEC4((m)[1]), \
595 ZEROVEC4((m)[2]), \
596 ZEROVEC4((m)[3]))
597#define IDENTMAT4(m) \
598 (ZEROVEC4((m)[0]), (m)[0][0]=1, \
599 ZEROVEC4((m)[1]), (m)[1][1]=1, \
600 ZEROVEC4((m)[2]), (m)[2][2]=1, \
601 ZEROVEC4((m)[3]), (m)[3][3]=1)
602#define TRANSPOSE4(to,from) \
603 (_SETcol4((to)[0], from, 0), \
604 _SETcol4((to)[1], from, 1), \
605 _SETcol4((to)[2], from, 2), \
606 _SETcol4((to)[3], from, 3))
607#define VPSXV4(to,v,s,w) \
608 ((to)[0] = (v)[0] + (s) * (w)[0], \
609 (to)[1] = (v)[1] + (s) * (w)[1], \
610 (to)[2] = (v)[2] + (s) * (w)[2], \
611 (to)[3] = (v)[3] + (s) * (w)[3])
612#define VPVXS4(to,v,w,s) \
613 ((to)[0] = (v)[0] + (w)[0] * (s), \
614 (to)[1] = (v)[1] + (w)[1] * (s), \
615 (to)[2] = (v)[2] + (w)[2] * (s), \
616 (to)[3] = (v)[3] + (w)[3] * (s))
617#define VPV4(to,v,w) \
618 ((to)[0] = (v)[0] + (w)[0], \
619 (to)[1] = (v)[1] + (w)[1], \
620 (to)[2] = (v)[2] + (w)[2], \
621 (to)[3] = (v)[3] + (w)[3])
622#define VMV4(to,v,w) \
623 ((to)[0] = (v)[0] - (w)[0], \
624 (to)[1] = (v)[1] - (w)[1], \
625 (to)[2] = (v)[2] - (w)[2], \
626 (to)[3] = (v)[3] - (w)[3])
627#define MPM4(to,m1,m2) \
628 (VPV4((to)[0], (m1)[0], (m2)[0]), \
629 VPV4((to)[1], (m1)[1], (m2)[1]), \
630 VPV4((to)[2], (m1)[2], (m2)[2]), \
631 VPV4((to)[3], (m1)[3], (m2)[3]))
632#define MMM4(to,m1,m2) \
633 (VMV4((to)[0], (m1)[0], (m2)[0]), \
634 VMV4((to)[1], (m1)[1], (m2)[1]), \
635 VMV4((to)[2], (m1)[2], (m2)[2]), \
636 VMV4((to)[3], (m1)[3], (m2)[3]))
637#define SXV4(to,s,from) \
638 ((to)[0] = (s) * (from)[0], \
639 (to)[1] = (s) * (from)[1], \
640 (to)[2] = (s) * (from)[2], \
641 (to)[3] = (s) * (from)[3])
642#define SXM4(to,s,from) \
643 (SXV4((to)[0], s, (from)[0]), \
644 SXV4((to)[1], s, (from)[1]), \
645 SXV4((to)[2], s, (from)[2]), \
646 SXV4((to)[3], s, (from)[3]))
647#define MV4(to,from) \
648 ((to)[0] = -(from)[0], \
649 (to)[1] = -(from)[1], \
650 (to)[2] = -(from)[2], \
651 (to)[3] = -(from)[3])
652#define MM4(to,from) \
653 (MV4((to)[0], (from)[0]), \
654 MV4((to)[1], (from)[1]), \
655 MV4((to)[2], (from)[2]), \
656 MV4((to)[3], (from)[3]))
657#define VXS4(to,from,s) \
658 ((to)[0] = (from)[0] * (s), \
659 (to)[1] = (from)[1] * (s), \
660 (to)[2] = (from)[2] * (s), \
661 (to)[3] = (from)[3] * (s))
662#define VDS4(to,from,s) \
663 ((to)[0] = (from)[0] / (s), \
664 (to)[1] = (from)[1] / (s), \
665 (to)[2] = (from)[2] / (s), \
666 (to)[3] = (from)[3] / (s))
667#define MXS4(to,from,s) \
668 (VXS4((to)[0], (from)[0], s), \
669 VXS4((to)[1], (from)[1], s), \
670 VXS4((to)[2], (from)[2], s), \
671 VXS4((to)[3], (from)[3], s))
672#define MDS4(to,from,s) \
673 (VDS4((to)[0], (from)[0], s), \
674 VDS4((to)[1], (from)[1], s), \
675 VDS4((to)[2], (from)[2], s), \
676 VDS4((to)[3], (from)[3], s))
677#define MXM4(to,m1,m2) \
678 (VXM4((to)[0], (m1)[0], m2), \
679 VXM4((to)[1], (m1)[1], m2), \
680 VXM4((to)[2], (m1)[2], m2), \
681 VXM4((to)[3], (m1)[3], m2))
682#define VXM4(to,v,m) \
683 ((to)[0] = _DOTcol4(v, m, 0), \
684 (to)[1] = _DOTcol4(v, m, 1), \
685 (to)[2] = _DOTcol4(v, m, 2), \
686 (to)[3] = _DOTcol4(v, m, 3))
687#define MXV4(to,m,v) \
688 ((to)[0] = DOT4((m)[0], v), \
689 (to)[1] = DOT4((m)[1], v), \
690 (to)[2] = DOT4((m)[2], v), \
691 (to)[3] = DOT4((m)[3], v))
692#define VMODS4(to,v,s) \
693 ((to)[0] = SMODS1((v)[0], s), \
694 (to)[1] = SMODS1((v)[1], s), \
695 (to)[2] = SMODS1((v)[2], s), \
696 (to)[3] = SMODS1((v)[3], s))
697#define VMODV4(to,v0,v1) \
698 ((to)[0] = SMODS1((v0)[0], (v1)[0]), \
699 (to)[1] = SMODS1((v0)[1], (v1)[1]), \
700 (to)[2] = SMODS1((v0)[2], (v1)[2]), \
701 (to)[3] = SMODS1((v0)[3], (v1)[3]))
702#define VDIVS4(to,v,s) \
703 ((to)[0] = SDIVS1((v)[0], s), \
704 (to)[1] = SDIVS1((v)[1], s), \
705 (to)[2] = SDIVS1((v)[2], s), \
706 (to)[3] = SDIVS1((v)[3], s))
707#define VDIVV4(to,v0,v1) \
708 ((to)[0] = SDIVS1((v0)[0], (v1)[0]), \
709 (to)[1] = SDIVS1((v0)[1], (v1)[1]), \
710 (to)[2] = SDIVS1((v0)[2], (v1)[2]), \
711 (to)[3] = SDIVS1((v0)[3], (v1)[3]))
712#define VMINS4(to,v,s) \
713 ((to)[0] = SMINS1((v)[0], s), \
714 (to)[1] = SMINS1((v)[1], s), \
715 (to)[2] = SMINS1((v)[2], s), \
716 (to)[3] = SMINS1((v)[3], s))
717#define VMINV4(to,v0,v1) \
718 ((to)[0] = SMINS1((v0)[0], (v1)[0]), \
719 (to)[1] = SMINS1((v0)[1], (v1)[1]), \
720 (to)[2] = SMINS1((v0)[2], (v1)[2]), \
721 (to)[3] = SMINS1((v0)[3], (v1)[3]))
722#define VMAXS4(to,v,s) \
723 ((to)[0] = SMAXS1((v)[0], s), \
724 (to)[1] = SMAXS1((v)[1], s), \
725 (to)[2] = SMAXS1((v)[2], s), \
726 (to)[3] = SMAXS1((v)[3], s))
727#define VMAXV4(to,v0,v1) \
728 ((to)[0] = SMAXS1((v0)[0], (v1)[0]), \
729 (to)[1] = SMAXS1((v0)[1], (v1)[1]), \
730 (to)[2] = SMAXS1((v0)[2], (v1)[2]), \
731 (to)[3] = SMAXS1((v0)[3], (v1)[3]))
732#define LERP4(to,v0,v1,t) \
733 ((to)[0]=(v0)[0]+(t)*((v1)[0]-(v0)[0]), \
734 (to)[1]=(v0)[1]+(t)*((v1)[1]-(v0)[1]), \
735 (to)[2]=(v0)[2]+(t)*((v1)[2]-(v0)[2]), \
736 (to)[3]=(v0)[3]+(t)*((v1)[3]-(v0)[3]))
737#define TRACE4(m) \
738 ((m)[0][0] + \
739 (m)[1][1] + \
740 (m)[2][2] + \
741 (m)[3][3])
742#define DOT4(v,w) \
743 ((v)[0] * (w)[0] + \
744 (v)[1] * (w)[1] + \
745 (v)[2] * (w)[2] + \
746 (v)[3] * (w)[3])
747#define NORMSQRD4(v) \
748 ((v)[0] * (v)[0] + \
749 (v)[1] * (v)[1] + \
750 (v)[2] * (v)[2] + \
751 (v)[3] * (v)[3])
752#define DISTSQRD4(v,w) \
753 (((v)[0]-(w)[0])*((v)[0]-(w)[0]) + \
754 ((v)[1]-(w)[1])*((v)[1]-(w)[1]) + \
755 ((v)[2]-(w)[2])*((v)[2]-(w)[2]) + \
756 ((v)[3]-(w)[3])*((v)[3]-(w)[3]))
757#define _DOTcol4(v,m,j) \
758 ((v)[0] * (m)[0][j] + \
759 (v)[1] * (m)[1][j] + \
760 (v)[2] * (m)[2][j] + \
761 (v)[3] * (m)[3][j])
762#define _SETcol4(v,m,j) \
763 ((v)[0] = (m)[0][j], \
764 (v)[1] = (m)[1][j], \
765 (v)[2] = (m)[2][j], \
766 (v)[3] = (m)[3][j])
767#define _MXVcol4(to,m,M,j) \
768 ((to)[0][j] = _DOTcol4((m)[0],M,j), \
769 (to)[1][j] = _DOTcol4((m)[1],M,j), \
770 (to)[2][j] = _DOTcol4((m)[2],M,j), \
771 (to)[3][j] = _DOTcol4((m)[3],M,j))
772#define _DET4(v0,v1,v2,v3,i0,i1,i2,i3) \
773 ((v0)[i0]* _DET3(v1,v2,v3,i1,i2,i3) + \
774 (v0)[i1]*-_DET3(v1,v2,v3,i0,i2,i3) + \
775 (v0)[i2]* _DET3(v1,v2,v3,i0,i1,i3) + \
776 (v0)[i3]*-_DET3(v1,v2,v3,i0,i1,i2))
777#define VXVXV4(to,v1,v2,v3) \
778 ((to)[0] = -_DET3(v1,v2,v3, 1,2,3), \
779 (to)[1] = _DET3(v1,v2,v3, 0,2,3), \
780 (to)[2] = -_DET3(v1,v2,v3, 0,1,3), \
781 (to)[3] = _DET3(v1,v2,v3, 0,1,2))
782#define SET4from3(to,from,pad) \
783 ((to)[0] = (from)[0], \
784 (to)[1] = (from)[1], \
785 (to)[2] = (from)[2], \
786 (to)[3] = (pad))
787#define SETMAT4from3(to,from,pad0,pad1) \
788 (SET4from3((to)[0], (from)[0], pad0), \
789 SET4from3((to)[1], (from)[1], pad0), \
790 SET4from3((to)[2], (from)[2], pad0), \
791 FILLVEC3((to)[3], (pad0)), (to)[3][3] = (pad1))
792#define M3XM4(to4,m3,m4) \
793 (_MXVcol3(to4,m3,m4,0), (to4)[3][0]=(m4)[3][0], \
794 _MXVcol3(to4,m3,m4,1), (to4)[3][1]=(m4)[3][1], \
795 _MXVcol3(to4,m3,m4,2), (to4)[3][2]=(m4)[3][2], \
796 _MXVcol3(to4,m3,m4,3), (to4)[3][3]=(m4)[3][3])
797#define M4XM3(to4,m4,m3) \
798 (VXM3((to4)[0],(m4)[0],m3), (to4)[0][3]=(m4)[0][3], \
799 VXM3((to4)[1],(m4)[1],m3), (to4)[1][3]=(m4)[1][3], \
800 VXM3((to4)[2],(m4)[2],m3), (to4)[2][3]=(m4)[2][3], \
801 VXM3((to4)[3],(m4)[3],m3), (to4)[3][3]=(m4)[3][3])
802#define VXVXVXV4(v0,v1,v2,v3) \
803 (_DET4(v0,v1,v2,v3,0,1,2,3))
804#define DET4(m) \
805 (VXVXVXV4((m)[0],(m)[1],(m)[2],(m)[3]))
806#define ADJOINT4(to,m) \
807 ( _ADJOINTcol4(to,0,m,1,2,3), \
808 __ADJOINTcol4(to,1,m,0,2,3), \
809 _ADJOINTcol4(to,2,m,0,1,3), \
810 __ADJOINTcol4(to,3,m,0,1,2))
811#define _ADJOINTcol4(to,col,m,i1,i2,i3) \
812 ((to)[0][col] = _DET3(m[i1],m[i2],m[i3], 1,2,3), \
813 (to)[1][col] = -_DET3(m[i1],m[i2],m[i3], 0,2,3), \
814 (to)[2][col] = _DET3(m[i1],m[i2],m[i3], 0,1,3), \
815 (to)[3][col] = -_DET3(m[i1],m[i2],m[i3], 0,1,2))
816#define __ADJOINTcol4(to,col,m,i1,i2,i3) \
817 ((to)[0][col] = -_DET3(m[i1],m[i2],m[i3], 1,2,3), \
818 (to)[1][col] = _DET3(m[i1],m[i2],m[i3], 0,2,3), \
819 (to)[2][col] = -_DET3(m[i1],m[i2],m[i3], 0,1,3), \
820 (to)[3][col] = _DET3(m[i1],m[i2],m[i3], 0,1,2))
821#define TRANSPOSE2safe(type,to,from) \
822 do {type _vec_h_temp_[2][2]; \
823 TRANSPOSE2(_vec_h_temp_,from); \
824 SETMAT2(to, _vec_h_temp_); \
825 } while (0)
826#define TRANSPOSE2d(to,from) TRANSPOSE2safe(double,to,from)
827#define TRANSPOSE2i(to,from) TRANSPOSE2safe(int,to,from)
828#define TRANSPOSE2l(to,from) TRANSPOSE2safe(long,to,from)
829#define TRANSPOSE2r(to,from) TRANSPOSE2safe(real,to,from)
830#define MXM2safe(type,to,m1,m2) \
831 do {type _vec_h_temp_[2][2]; \
832 MXM2(_vec_h_temp_,m1,m2); \
833 SETMAT2(to, _vec_h_temp_); \
834 } while (0)
835#define MXM2d(to,m1,m2) MXM2safe(double,to,m1,m2)
836#define MXM2i(to,m1,m2) MXM2safe(int,to,m1,m2)
837#define MXM2l(to,m1,m2) MXM2safe(long,to,m1,m2)
838#define MXM2r(to,m1,m2) MXM2safe(real,to,m1,m2)
839#define VXM2safe(type,to,v,m) \
840 do {type _vec_h_temp_[2]; \
841 VXM2(_vec_h_temp_,v,m); \
842 SET2(to, _vec_h_temp_); \
843 } while (0)
844#define VXM2d(to,v,m) VXM2safe(double,to,v,m)
845#define VXM2i(to,v,m) VXM2safe(int,to,v,m)
846#define VXM2l(to,v,m) VXM2safe(long,to,v,m)
847#define VXM2r(to,v,m) VXM2safe(real,to,v,m)
848#define MXV2safe(type,to,m,v) \
849 do {type _vec_h_temp_[2]; \
850 MXV2(_vec_h_temp_,m,v); \
851 SET2(to, _vec_h_temp_); \
852 } while (0)
853#define MXV2d(to,m,v) MXV2safe(double,to,m,v)
854#define MXV2i(to,m,v) MXV2safe(int,to,m,v)
855#define MXV2l(to,m,v) MXV2safe(long,to,m,v)
856#define MXV2r(to,m,v) MXV2safe(real,to,m,v)
857#define XV2safe(type,to,v1) \
858 do {type _vec_h_temp_[2]; \
859 XV2(_vec_h_temp_,v1); \
860 SET2(to, _vec_h_temp_); \
861 } while (0)
862#define XV2d(to,v1) XV2safe(double,to,v1)
863#define XV2i(to,v1) XV2safe(int,to,v1)
864#define XV2l(to,v1) XV2safe(long,to,v1)
865#define XV2r(to,v1) XV2safe(real,to,v1)
866#define V2XM3safe(type,to2,v2,m3) \
867 do {type _vec_h_temp_[2]; \
868 V2XM3(_vec_h_temp_,v2,m3); \
869 SET2(to2, _vec_h_temp_); \
870 } while (0)
871#define V2XM3d(to2,v2,m3) V2XM3safe(double,to2,v2,m3)
872#define V2XM3i(to2,v2,m3) V2XM3safe(int,to2,v2,m3)
873#define V2XM3l(to2,v2,m3) V2XM3safe(long,to2,v2,m3)
874#define V2XM3r(to2,v2,m3) V2XM3safe(real,to2,v2,m3)
875#define M3XV2safe(type,to2,m3,v2) \
876 do {type _vec_h_temp_[2]; \
877 M3XV2(_vec_h_temp_,m3,v2); \
878 SET2(to2, _vec_h_temp_); \
879 } while (0)
880#define M3XV2d(to2,m3,v2) M3XV2safe(double,to2,m3,v2)
881#define M3XV2i(to2,m3,v2) M3XV2safe(int,to2,m3,v2)
882#define M3XV2l(to2,m3,v2) M3XV2safe(long,to2,m3,v2)
883#define M3XV2r(to2,m3,v2) M3XV2safe(real,to2,m3,v2)
884#define ADJOINT2safe(type,to,m) \
885 do {type _vec_h_temp_[2][2]; \
886 ADJOINT2(_vec_h_temp_,m); \
887 SETMAT2(to, _vec_h_temp_); \
888 } while (0)
889#define ADJOINT2d(to,m) ADJOINT2safe(double,to,m)
890#define ADJOINT2i(to,m) ADJOINT2safe(int,to,m)
891#define ADJOINT2l(to,m) ADJOINT2safe(long,to,m)
892#define ADJOINT2r(to,m) ADJOINT2safe(real,to,m)
893#define INVERTMAT2safe(type,to,from) \
894 do {type _vec_h_temp_[2][2]; \
895 ADJOINT2(_vec_h_temp_, from); \
896 type _vec_h_temp_invdet_ = (type)1/(type)DET2(from); \
897 SXM2(to, _vec_h_temp_invdet_, _vec_h_temp_); \
898 } while (0)
899#define INVERTMAT2d(to,from) INVERTMAT2safe(double,to,from)
900#define INVERTMAT2i(to,from) INVERTMAT2safe(int,to,from)
901#define INVERTMAT2l(to,from) INVERTMAT2safe(long,to,from)
902#define INVERTMAT2r(to,from) INVERTMAT2safe(real,to,from)
903#define TRANSPOSE3safe(type,to,from) \
904 do {type _vec_h_temp_[3][3]; \
905 TRANSPOSE3(_vec_h_temp_,from); \
906 SETMAT3(to, _vec_h_temp_); \
907 } while (0)
908#define TRANSPOSE3d(to,from) TRANSPOSE3safe(double,to,from)
909#define TRANSPOSE3i(to,from) TRANSPOSE3safe(int,to,from)
910#define TRANSPOSE3l(to,from) TRANSPOSE3safe(long,to,from)
911#define TRANSPOSE3r(to,from) TRANSPOSE3safe(real,to,from)
912#define MXM3safe(type,to,m1,m2) \
913 do {type _vec_h_temp_[3][3]; \
914 MXM3(_vec_h_temp_,m1,m2); \
915 SETMAT3(to, _vec_h_temp_); \
916 } while (0)
917#define MXM3d(to,m1,m2) MXM3safe(double,to,m1,m2)
918#define MXM3i(to,m1,m2) MXM3safe(int,to,m1,m2)
919#define MXM3l(to,m1,m2) MXM3safe(long,to,m1,m2)
920#define MXM3r(to,m1,m2) MXM3safe(real,to,m1,m2)
921#define VXM3safe(type,to,v,m) \
922 do {type _vec_h_temp_[3]; \
923 VXM3(_vec_h_temp_,v,m); \
924 SET3(to, _vec_h_temp_); \
925 } while (0)
926#define VXM3d(to,v,m) VXM3safe(double,to,v,m)
927#define VXM3i(to,v,m) VXM3safe(int,to,v,m)
928#define VXM3l(to,v,m) VXM3safe(long,to,v,m)
929#define VXM3r(to,v,m) VXM3safe(real,to,v,m)
930#define MXV3safe(type,to,m,v) \
931 do {type _vec_h_temp_[3]; \
932 MXV3(_vec_h_temp_,m,v); \
933 SET3(to, _vec_h_temp_); \
934 } while (0)
935#define MXV3d(to,m,v) MXV3safe(double,to,m,v)
936#define MXV3i(to,m,v) MXV3safe(int,to,m,v)
937#define MXV3l(to,m,v) MXV3safe(long,to,m,v)
938#define MXV3r(to,m,v) MXV3safe(real,to,m,v)
939#define VXV3safe(type,to,v1,v2) \
940 do {type _vec_h_temp_[3]; \
941 VXV3(_vec_h_temp_,v1,v2); \
942 SET3(to, _vec_h_temp_); \
943 } while (0)
944#define VXV3d(to,v1,v2) VXV3safe(double,to,v1,v2)
945#define VXV3i(to,v1,v2) VXV3safe(int,to,v1,v2)
946#define VXV3l(to,v1,v2) VXV3safe(long,to,v1,v2)
947#define VXV3r(to,v1,v2) VXV3safe(real,to,v1,v2)
948#define M2XM3safe(type,to3,m2,m3) \
949 do {type _vec_h_temp_[3][3]; \
950 M2XM3(_vec_h_temp_,m2,m3); \
951 SETMAT3(to3, _vec_h_temp_); \
952 } while (0)
953#define M2XM3d(to3,m2,m3) M2XM3safe(double,to3,m2,m3)
954#define M2XM3i(to3,m2,m3) M2XM3safe(int,to3,m2,m3)
955#define M2XM3l(to3,m2,m3) M2XM3safe(long,to3,m2,m3)
956#define M2XM3r(to3,m2,m3) M2XM3safe(real,to3,m2,m3)
957#define M3XM2safe(type,to3,m3,m2) \
958 do {type _vec_h_temp_[3][3]; \
959 M3XM2(_vec_h_temp_,m3,m2); \
960 SETMAT3(to3, _vec_h_temp_); \
961 } while (0)
962#define M3XM2d(to3,m3,m2) M3XM2safe(double,to3,m3,m2)
963#define M3XM2i(to3,m3,m2) M3XM2safe(int,to3,m3,m2)
964#define M3XM2l(to3,m3,m2) M3XM2safe(long,to3,m3,m2)
965#define M3XM2r(to3,m3,m2) M3XM2safe(real,to3,m3,m2)
966#define V3XM4safe(type,to3,v3,m4) \
967 do {type _vec_h_temp_[3]; \
968 V3XM4(_vec_h_temp_,v3,m4); \
969 SET3(to3, _vec_h_temp_); \
970 } while (0)
971#define V3XM4d(to3,v3,m4) V3XM4safe(double,to3,v3,m4)
972#define V3XM4i(to3,v3,m4) V3XM4safe(int,to3,v3,m4)
973#define V3XM4l(to3,v3,m4) V3XM4safe(long,to3,v3,m4)
974#define V3XM4r(to3,v3,m4) V3XM4safe(real,to3,v3,m4)
975#define M4XV3safe(type,to3,m4,v3) \
976 do {type _vec_h_temp_[3]; \
977 M4XV3(_vec_h_temp_,m4,v3); \
978 SET3(to3, _vec_h_temp_); \
979 } while (0)
980#define M4XV3d(to3,m4,v3) M4XV3safe(double,to3,m4,v3)
981#define M4XV3i(to3,m4,v3) M4XV3safe(int,to3,m4,v3)
982#define M4XV3l(to3,m4,v3) M4XV3safe(long,to3,m4,v3)
983#define M4XV3r(to3,m4,v3) M4XV3safe(real,to3,m4,v3)
984#define ADJOINT3safe(type,to,m) \
985 do {type _vec_h_temp_[3][3]; \
986 ADJOINT3(_vec_h_temp_,m); \
987 SETMAT3(to, _vec_h_temp_); \
988 } while (0)
989#define ADJOINT3d(to,m) ADJOINT3safe(double,to,m)
990#define ADJOINT3i(to,m) ADJOINT3safe(int,to,m)
991#define ADJOINT3l(to,m) ADJOINT3safe(long,to,m)
992#define ADJOINT3r(to,m) ADJOINT3safe(real,to,m)
993#define INVERTMAT3safe(type,to,from) \
994 do {type _vec_h_temp_[3][3]; \
995 ADJOINT3(_vec_h_temp_, from); \
996 type _vec_h_temp_invdet_ = (type)1/(type)DET3(from); \
997 SXM3(to, _vec_h_temp_invdet_, _vec_h_temp_); \
998 } while (0)
999#define INVERTMAT3d(to,from) INVERTMAT3safe(double,to,from)
1000#define INVERTMAT3i(to,from) INVERTMAT3safe(int,to,from)
1001#define INVERTMAT3l(to,from) INVERTMAT3safe(long,to,from)
1002#define INVERTMAT3r(to,from) INVERTMAT3safe(real,to,from)
1003#define TRANSPOSE4safe(type,to,from) \
1004 do {type _vec_h_temp_[4][4]; \
1005 TRANSPOSE4(_vec_h_temp_,from); \
1006 SETMAT4(to, _vec_h_temp_); \
1007 } while (0)
1008#define TRANSPOSE4d(to,from) TRANSPOSE4safe(double,to,from)
1009#define TRANSPOSE4i(to,from) TRANSPOSE4safe(int,to,from)
1010#define TRANSPOSE4l(to,from) TRANSPOSE4safe(long,to,from)
1011#define TRANSPOSE4r(to,from) TRANSPOSE4safe(real,to,from)
1012#define MXM4safe(type,to,m1,m2) \
1013 do {type _vec_h_temp_[4][4]; \
1014 MXM4(_vec_h_temp_,m1,m2); \
1015 SETMAT4(to, _vec_h_temp_); \
1016 } while (0)
1017#define MXM4d(to,m1,m2) MXM4safe(double,to,m1,m2)
1018#define MXM4i(to,m1,m2) MXM4safe(int,to,m1,m2)
1019#define MXM4l(to,m1,m2) MXM4safe(long,to,m1,m2)
1020#define MXM4r(to,m1,m2) MXM4safe(real,to,m1,m2)
1021#define VXM4safe(type,to,v,m) \
1022 do {type _vec_h_temp_[4]; \
1023 VXM4(_vec_h_temp_,v,m); \
1024 SET4(to, _vec_h_temp_); \
1025 } while (0)
1026#define VXM4d(to,v,m) VXM4safe(double,to,v,m)
1027#define VXM4i(to,v,m) VXM4safe(int,to,v,m)
1028#define VXM4l(to,v,m) VXM4safe(long,to,v,m)
1029#define VXM4r(to,v,m) VXM4safe(real,to,v,m)
1030#define MXV4safe(type,to,m,v) \
1031 do {type _vec_h_temp_[4]; \
1032 MXV4(_vec_h_temp_,m,v); \
1033 SET4(to, _vec_h_temp_); \
1034 } while (0)
1035#define MXV4d(to,m,v) MXV4safe(double,to,m,v)
1036#define MXV4i(to,m,v) MXV4safe(int,to,m,v)
1037#define MXV4l(to,m,v) MXV4safe(long,to,m,v)
1038#define MXV4r(to,m,v) MXV4safe(real,to,m,v)
1039#define VXVXV4safe(type,to,v1,v2,v3) \
1040 do {type _vec_h_temp_[4]; \
1041 VXVXV4(_vec_h_temp_,v1,v2,v3); \
1042 SET4(to, _vec_h_temp_); \
1043 } while (0)
1044#define VXVXV4d(to,v1,v2,v3) VXVXV4safe(double,to,v1,v2,v3)
1045#define VXVXV4i(to,v1,v2,v3) VXVXV4safe(int,to,v1,v2,v3)
1046#define VXVXV4l(to,v1,v2,v3) VXVXV4safe(long,to,v1,v2,v3)
1047#define VXVXV4r(to,v1,v2,v3) VXVXV4safe(real,to,v1,v2,v3)
1048#define M3XM4safe(type,to4,m3,m4) \
1049 do {type _vec_h_temp_[4][4]; \
1050 M3XM4(_vec_h_temp_,m3,m4); \
1051 SETMAT4(to4, _vec_h_temp_); \
1052 } while (0)
1053#define M3XM4d(to4,m3,m4) M3XM4safe(double,to4,m3,m4)
1054#define M3XM4i(to4,m3,m4) M3XM4safe(int,to4,m3,m4)
1055#define M3XM4l(to4,m3,m4) M3XM4safe(long,to4,m3,m4)
1056#define M3XM4r(to4,m3,m4) M3XM4safe(real,to4,m3,m4)
1057#define M4XM3safe(type,to4,m4,m3) \
1058 do {type _vec_h_temp_[4][4]; \
1059 M4XM3(_vec_h_temp_,m4,m3); \
1060 SETMAT4(to4, _vec_h_temp_); \
1061 } while (0)
1062#define M4XM3d(to4,m4,m3) M4XM3safe(double,to4,m4,m3)
1063#define M4XM3i(to4,m4,m3) M4XM3safe(int,to4,m4,m3)
1064#define M4XM3l(to4,m4,m3) M4XM3safe(long,to4,m4,m3)
1065#define M4XM3r(to4,m4,m3) M4XM3safe(real,to4,m4,m3)
1066#define ADJOINT4safe(type,to,m) \
1067 do {type _vec_h_temp_[4][4]; \
1068 ADJOINT4(_vec_h_temp_,m); \
1069 SETMAT4(to, _vec_h_temp_); \
1070 } while (0)
1071#define ADJOINT4d(to,m) ADJOINT4safe(double,to,m)
1072#define ADJOINT4i(to,m) ADJOINT4safe(int,to,m)
1073#define ADJOINT4l(to,m) ADJOINT4safe(long,to,m)
1074#define ADJOINT4r(to,m) ADJOINT4safe(real,to,m)
1075#define INVERTMAT4safe(type,to,from) \
1076 do {type _vec_h_temp_[4][4]; \
1077 ADJOINT4(_vec_h_temp_, from); \
1078 type _vec_h_temp_invdet_ = (type)1/(type)DET4(from); \
1079 SXM4(to, _vec_h_temp_invdet_, _vec_h_temp_); \
1080 } while (0)
1081#define INVERTMAT4d(to,from) INVERTMAT4safe(double,to,from)
1082#define INVERTMAT4i(to,from) INVERTMAT4safe(int,to,from)
1083#define INVERTMAT4l(to,from) INVERTMAT4safe(long,to,from)
1084#define INVERTMAT4r(to,from) INVERTMAT4safe(real,to,from)
1085#endif /* VEC_H */