vec.h

Go to the documentation of this file.
00001 /******************************************************************************
00002 *       SOFA, Simulation Open-Framework Architecture, version 1.0 beta 3      *
00003 *                (c) 2006-2008 MGH, INRIA, USTL, UJF, CNRS                    *
00004 *                                                                             *
00005 * This library is free software; you can redistribute it and/or modify it     *
00006 * under the terms of the GNU Lesser General Public License as published by    *
00007 * the Free Software Foundation; either version 2.1 of the License, or (at     *
00008 * your option) any later version.                                             *
00009 *                                                                             *
00010 * This library is distributed in the hope that it will be useful, but WITHOUT *
00011 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
00012 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License *
00013 * for more details.                                                           *
00014 *                                                                             *
00015 * You should have received a copy of the GNU Lesser General Public License    *
00016 * along with this library; if not, write to the Free Software Foundation,     *
00017 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.          *
00018 *******************************************************************************
00019 *                              SOFA :: Framework                              *
00020 *                                                                             *
00021 * Authors: M. Adam, J. Allard, B. Andre, P-J. Bensoussan, S. Cotin, C. Duriez,*
00022 * H. Delingette, F. Falipou, F. Faure, S. Fonteneau, L. Heigeas, C. Mendoza,  *
00023 * M. Nesme, P. Neumann, J-P. de la Plata Alcade, F. Poyer and F. Roy          *
00024 *                                                                             *
00025 * Contact information: contact@sofa-framework.org                             *
00026 ******************************************************************************/
00027 /*
00028  * vec.h --  Vector macros for 2,3, and 4 dimensions,
00029  *           for any  combination of C scalar types.
00030  *
00031  * Author:      Don Hatch (hatch@sgi.com)
00032  * Last modified:   Fri Sep 30 03:23:02 PDT 1994
00033  *
00034  * General description:
00035  *
00036  *  The macro name describes its arguments; e.g.
00037  *          MXS3 is "matrix times scalar in 3 dimensions";
00038  *          VMV2 is "vector minus vector in 2 dimensions".
00039  *
00040  *  If the result of an operation is a scalar, then the macro "returns"
00041  *  the value; e.g.
00042  *          result = DOT3(v,w);
00043  *          result = DET4(m);
00044  *
00045  *  If the result of an operation is a vector or matrix, then
00046  *  the first argument is the destination; e.g.
00047  *          SET2(tovec, fromvec);
00048  *          MXM3(result, m1, m2);
00049  *
00050  *  WARNING: For the operations that are not done "componentwise"
00051  *      (e.g. vector cross products and matrix multiplies)
00052  *      the destination should not be either of the arguments,
00053  *      for obvious reasons.  For example, the following is wrong:
00054  *      VXM2(v,v,m);
00055  *          For such "unsafe" macros, there are safe versions provided,
00056  *          but you have to specify a type for the temporary
00057  *      result vector or matrix.  For example, the safe versions
00058  *      of VXM2 are:
00059  *              VXM2d(v,v,m)    if v's scalar type is double or float
00060  *              VXM2i(v,v,m)    if v's scalar type is int or char
00061  *              VXM2l(v,v,m)    if v's scalar type is long
00062  *              VXM2r(v,v,m)    if v's scalar type is real
00063  *              VXM2safe(type,v,v,m) for other scalar types.
00064  *      These "safe" macros do not evaluate to C expressions
00065  *      (so, for example, they can't be used inside the parentheses of
00066  *      a for(...)).
00067  *
00068  *  Specific descriptions:
00069  *
00070  *  The "?"'s in the following can be 2, 3, or 4.
00071  *
00072  *  SET?(to,from)           to = from
00073  *  SETMAT?(to,from)        to = from
00074  *  ROUNDVEC?(to,from)      to = from with entries rounded
00075  *                          to nearest integer
00076  *  ROUNDMAT?(to,from)      to = from with entries rounded
00077  *                          to nearest integer
00078  *  FILLVEC?(v,s)           set each entry of vector v to be s
00079  *  FILLMAT?(m,s)           set each entry of matrix m to be s
00080  *  ZEROVEC?(v)         v = 0
00081  *  ISZEROVEC?(v)           v == 0
00082  *  EQVEC?(v,w)         v == w
00083  *  EQMAT?(m1,m2)           m1 == m2
00084  *  ZEROMAT?(m)         m = 0
00085  *  IDENTMAT?(m)            m = 1
00086  *  TRANSPOSE?(to,from)     (matrix to) = (transpose of matrix from)
00087  *  ADJOINT?(to,from)       (matrix to) = (adjoint of matrix from)
00088  *                   i.e. its determinant times its inverse
00089  *
00090  *  V{P,M}V?(to,v,w)        to = v {+,-} w
00091  *  M{P,M}M?(to,m1,m2)      to = m1 {+,-} m2
00092  *  SX{V,M}?(to,s,from)     to = s * from
00093  *  M{V,M}?(to,from)        to = -from
00094  *  {V,M}{X,D}S?(to,from,s)     to = from {*,/} s
00095  *  MXM?(to,m1,m2)          to = m1 * m2
00096  *  VXM?(to,v,m)            (row vec to) = (row vec v) * m
00097  *  MXV?(to,m,v)            (column vec to) = m * (column vec v)
00098  *  LERP?(to,v0,v1,t)       to = v0 + t*(v1-v0)
00099  *
00100  *  DET?(m)             determinant of m
00101  *  TRACE?(m)           trace (sum of diagonal entries) of m
00102  *  DOT?(v,w)           dot (scalar) product of v and w
00103  *  NORMSQRD?(v)            square of |v|
00104  *  DISTSQRD?(v,w)          square of |v-w|
00105  *
00106  *  XV2(to,v)           to = v rotated by 90 degrees
00107  *  VXV3(to,v1,v2)          to = cross (vector) product of v1 and v2
00108  *  VXVXV4(to,v1,v2,v3)     to = 4-dimensional vector cross product
00109  *                   of v1,v2,v3 (a vector orthogonal to
00110  *                   v1,v2,v3 whose length equals the
00111  *                   volume of the spanned parallelotope)
00112  *  VXV2(v0,v1)         determinant of matrix with rows v0,v1
00113  *  VXVXV3(v0,v1,v2)        determinant of matrix with rows v0,v1,v2
00114  *  VXVXVXV4(v0,v1,v2,v3)       determinant of matrix with rows v0,..,v3
00115  *
00116  *   The following macros mix objects from different dimensions.
00117  *   For example, V3XM4 would be used to apply a composite
00118  *   4x4 rotation-and-translation matrix to a 3d vector.
00119  *
00120  *  SET3from2(to,from,pad)      (3d vec to) = (2d vec from) with pad
00121  *  SET4from3(to,from,pad)      (4d vec to) = (3d vec from) with pad
00122  *  SETMAT3from2(to,from,pad0,pad1) (3x3 mat to) = (2x2 mat from)
00123  *                   padded with pad0 on the sides
00124  *                   and pad1 in the corner
00125  *  SETMAT4from3(to,from,pad0,pad1) (4x4 mat to) = (3x3 mat from)
00126  *                   padded with pad0 on the sides
00127  *                   and pad1 in the corner
00128  *  V2XM3(to2,v2,m3)       (2d row vec to2) = (2d row vec v2) * (3x3 mat m3)
00129  *  V3XM4(to3,v3,m4)       (3d row vec to3) = (3d row vec v2) * (4x4 mat m4)
00130  *  M3XV2(to2,m3,v2)       (2d col vec to2) = (3x3 mat m3) * (2d col vec v2)
00131  *  M4XV3(to3,m4,v3)       (3d col vec to3) = (4x4 mat m4) * (3d col vec v3)
00132  *  M2XM3(to3,m2,m3)       (3x3 mat to3) = (2x2 mat m2) * (3x3 mat m3)
00133  *  M3XM4(to4,m3,m4)       (4x4 mat to4) = (3x3 mat m3) * (4x4 mat m4)
00134  *  M3XM2(to3,m3,m2)       (3x3 mat to3) = (3x3 mat m3) * (2x2 mat m2)
00135  *  M4XM3(to4,m4,m3)       (4x4 mat to4) = (4x4 mat m4) * (3x3 mat m3)
00136  *
00137  *
00138  *   This file is machine-generated and can be regenerated
00139  *   for any number of dimensions.
00140  *   The program that generated it is available upon request.
00141  */
00142 
00143 #ifndef VEC_H
00144 #define VEC_H 4
00145 #include <math.h>   /* for definition of floor() */
00146 
00147 namespace sofa
00148 {
00149 
00150 namespace helper
00151 {
00152 
00153 namespace polygon_cube_intersection
00154 {
00155 
00156 #define SET2(to,from)   \
00157         ((to)[0] = (from)[0], \
00158          (to)[1] = (from)[1])
00159 #define SETMAT2(to,from)    \
00160         (SET2((to)[0], (from)[0]), \
00161          SET2((to)[1], (from)[1]))
00162 #define ROUNDVEC2(to,from)  \
00163         ((to)[0] = floor((from)[0]+.5), \
00164          (to)[1] = floor((from)[1]+.5))
00165 #define ROUNDMAT2(to,from)  \
00166         (ROUNDVEC2((to)[0], (from)[0]), \
00167          ROUNDVEC2((to)[1], (from)[1]))
00168 #define FILLVEC2(v,s)   \
00169         ((v)[0] = (s), \
00170          (v)[1] = (s))
00171 #define FILLMAT2(m,s)   \
00172         (FILLVEC2((m)[0], s), \
00173          FILLVEC2((m)[1], s))
00174 #define ZEROVEC2(v) \
00175         ((v)[0] = 0, \
00176          (v)[1] = 0)
00177 #define ISZEROVEC2(v)   \
00178         ((v)[0] == 0 && \
00179          (v)[1] == 0)
00180 #define EQVEC2(v,w) \
00181         ((v)[0] == (w)[0] && \
00182          (v)[1] == (w)[1])
00183 #define EQMAT2(m1,m2)   \
00184         (EQVEC2((m1)[0], (m2)[0]) && \
00185          EQVEC2((m1)[1], (m2)[1]))
00186 #define ZEROMAT2(m) \
00187         (ZEROVEC2((m)[0]), \
00188          ZEROVEC2((m)[1]))
00189 #define IDENTMAT2(m)    \
00190         (ZEROVEC2((m)[0]), (m)[0][0]=1, \
00191          ZEROVEC2((m)[1]), (m)[1][1]=1)
00192 #define TRANSPOSE2(to,from) \
00193         (_SETcol2((to)[0], from, 0), \
00194          _SETcol2((to)[1], from, 1))
00195 #define VPV2(to,v,w)    \
00196         ((to)[0] = (v)[0] + (w)[0], \
00197          (to)[1] = (v)[1] + (w)[1])
00198 #define VMV2(to,v,w)    \
00199         ((to)[0] = (v)[0] - (w)[0], \
00200          (to)[1] = (v)[1] - (w)[1])
00201 #define MPM2(to,m1,m2)  \
00202         (VPV2((to)[0], (m1)[0], (m2)[0]), \
00203          VPV2((to)[1], (m1)[1], (m2)[1]))
00204 #define MMM2(to,m1,m2)  \
00205         (VMV2((to)[0], (m1)[0], (m2)[0]), \
00206          VMV2((to)[1], (m1)[1], (m2)[1]))
00207 #define SXV2(to,s,from) \
00208         ((to)[0] = (s) * (from)[0], \
00209          (to)[1] = (s) * (from)[1])
00210 #define SXM2(to,s,from) \
00211         (SXV2((to)[0], s, (from)[0]), \
00212          SXV2((to)[1], s, (from)[1]))
00213 #define MV2(to,from)    \
00214         ((to)[0] = -(from)[0], \
00215          (to)[1] = -(from)[1])
00216 #define MM2(to,from)    \
00217         (MV2((to)[0], (from)[0]), \
00218          MV2((to)[1], (from)[1]))
00219 #define VXS2(to,from,s) \
00220         ((to)[0] = (from)[0] * (s), \
00221          (to)[1] = (from)[1] * (s))
00222 #define VDS2(to,from,s) \
00223         ((to)[0] = (from)[0] / (s), \
00224          (to)[1] = (from)[1] / (s))
00225 #define MXS2(to,from,s) \
00226         (VXS2((to)[0], (from)[0], s), \
00227          VXS2((to)[1], (from)[1], s))
00228 #define MDS2(to,from,s) \
00229         (VDS2((to)[0], (from)[0], s), \
00230          VDS2((to)[1], (from)[1], s))
00231 #define MXM2(to,m1,m2)  \
00232         (VXM2((to)[0], (m1)[0], m2), \
00233          VXM2((to)[1], (m1)[1], m2))
00234 #define VXM2(to,v,m)    \
00235         ((to)[0] = _DOTcol2(v, m, 0), \
00236          (to)[1] = _DOTcol2(v, m, 1))
00237 #define MXV2(to,m,v)    \
00238         ((to)[0] = DOT2((m)[0], v), \
00239          (to)[1] = DOT2((m)[1], v))
00240 #define LERP2(to,v0,v1,t)   \
00241         ((to)[0]=(v0)[0]+(t)*((v1)[0]-(v0)[0]), \
00242          (to)[1]=(v0)[1]+(t)*((v1)[1]-(v0)[1]))
00243 #define TRACE2(m)   \
00244         ((m)[0][0] + \
00245          (m)[1][1])
00246 #define DOT2(v,w)   \
00247         ((v)[0] * (w)[0] + \
00248          (v)[1] * (w)[1])
00249 #define NORMSQRD2(v)    \
00250         ((v)[0] * (v)[0] + \
00251          (v)[1] * (v)[1])
00252 #define DISTSQRD2(v,w)  \
00253         (((v)[0]-(w)[0])*((v)[0]-(w)[0]) + \
00254          ((v)[1]-(w)[1])*((v)[1]-(w)[1]))
00255 #define _DOTcol2(v,m,j) \
00256         ((v)[0] * (m)[0][j] + \
00257          (v)[1] * (m)[1][j])
00258 #define _SETcol2(v,m,j) \
00259         ((v)[0] = (m)[0][j], \
00260          (v)[1] = (m)[1][j])
00261 #define _MXVcol2(to,m,M,j)  \
00262         ((to)[0][j] = _DOTcol2((m)[0],M,j), \
00263          (to)[1][j] = _DOTcol2((m)[1],M,j))
00264 #define _DET2(v0,v1,i0,i1)  \
00265         ((v0)[i0]* _DET1(v1,i1) + \
00266          (v0)[i1]*-_DET1(v1,i0))
00267 #define XV2(to,v1)  \
00268         ((to)[0] = -_DET1(v1, 1), \
00269          (to)[1] =  _DET1(v1, 0))
00270 #define V2XM3(to2,v2,m3)    \
00271         ((to2)[0] = _DOTcol2(v2,m3,0) + (m3)[2][0], \
00272          (to2)[1] = _DOTcol2(v2,m3,1) + (m3)[2][1])
00273 #define M3XV2(to2,m3,v2)    \
00274         ((to2)[0] = DOT2((m3)[0],v2) + (m3)[0][2], \
00275          (to2)[1] = DOT2((m3)[1],v2) + (m3)[1][2])
00276 #define _DET1(v0,i0)    \
00277         ((v0)[i0])
00278 #define VXV2(v0,v1) \
00279         (_DET2(v0,v1,0,1))
00280 #define DET2(m) \
00281         (VXV2((m)[0],(m)[1]))
00282 #define ADJOINT2(to,m)  \
00283         ( _ADJOINTcol2(to,0,m,1), \
00284          __ADJOINTcol2(to,1,m,0))
00285 #define _ADJOINTcol2(to,col,m,i1)   \
00286         ((to)[0][col] =  _DET1(m[i1], 1), \
00287          (to)[1][col] = -_DET1(m[i1], 0))
00288 #define __ADJOINTcol2(to,col,m,i1)  \
00289         ((to)[0][col] = -_DET1(m[i1], 1), \
00290          (to)[1][col] =  _DET1(m[i1], 0))
00291 #define SET3(to,from)   \
00292         ((to)[0] = (from)[0], \
00293          (to)[1] = (from)[1], \
00294          (to)[2] = (from)[2])
00295 #define SETMAT3(to,from)    \
00296         (SET3((to)[0], (from)[0]), \
00297          SET3((to)[1], (from)[1]), \
00298          SET3((to)[2], (from)[2]))
00299 #define ROUNDVEC3(to,from)  \
00300         ((to)[0] = floor((from)[0]+.5), \
00301          (to)[1] = floor((from)[1]+.5), \
00302          (to)[2] = floor((from)[2]+.5))
00303 #define ROUNDMAT3(to,from)  \
00304         (ROUNDVEC3((to)[0], (from)[0]), \
00305          ROUNDVEC3((to)[1], (from)[1]), \
00306          ROUNDVEC3((to)[2], (from)[2]))
00307 #define FILLVEC3(v,s)   \
00308         ((v)[0] = (s), \
00309          (v)[1] = (s), \
00310          (v)[2] = (s))
00311 #define FILLMAT3(m,s)   \
00312         (FILLVEC3((m)[0], s), \
00313          FILLVEC3((m)[1], s), \
00314          FILLVEC3((m)[2], s))
00315 #define ZEROVEC3(v) \
00316         ((v)[0] = 0, \
00317          (v)[1] = 0, \
00318          (v)[2] = 0)
00319 #define ISZEROVEC3(v)   \
00320         ((v)[0] == 0 && \
00321          (v)[1] == 0 && \
00322          (v)[2] == 0)
00323 #define EQVEC3(v,w) \
00324         ((v)[0] == (w)[0] && \
00325          (v)[1] == (w)[1] && \
00326          (v)[2] == (w)[2])
00327 #define EQMAT3(m1,m2)   \
00328         (EQVEC3((m1)[0], (m2)[0]) && \
00329          EQVEC3((m1)[1], (m2)[1]) && \
00330          EQVEC3((m1)[2], (m2)[2]))
00331 #define ZEROMAT3(m) \
00332         (ZEROVEC3((m)[0]), \
00333          ZEROVEC3((m)[1]), \
00334          ZEROVEC3((m)[2]))
00335 #define IDENTMAT3(m)    \
00336         (ZEROVEC3((m)[0]), (m)[0][0]=1, \
00337          ZEROVEC3((m)[1]), (m)[1][1]=1, \
00338          ZEROVEC3((m)[2]), (m)[2][2]=1)
00339 #define TRANSPOSE3(to,from) \
00340         (_SETcol3((to)[0], from, 0), \
00341          _SETcol3((to)[1], from, 1), \
00342          _SETcol3((to)[2], from, 2))
00343 #define VPV3(to,v,w)    \
00344         ((to)[0] = (v)[0] + (w)[0], \
00345          (to)[1] = (v)[1] + (w)[1], \
00346          (to)[2] = (v)[2] + (w)[2])
00347 #define VMV3(to,v,w)    \
00348         ((to)[0] = (v)[0] - (w)[0], \
00349          (to)[1] = (v)[1] - (w)[1], \
00350          (to)[2] = (v)[2] - (w)[2])
00351 #define MPM3(to,m1,m2)  \
00352         (VPV3((to)[0], (m1)[0], (m2)[0]), \
00353          VPV3((to)[1], (m1)[1], (m2)[1]), \
00354          VPV3((to)[2], (m1)[2], (m2)[2]))
00355 #define MMM3(to,m1,m2)  \
00356         (VMV3((to)[0], (m1)[0], (m2)[0]), \
00357          VMV3((to)[1], (m1)[1], (m2)[1]), \
00358          VMV3((to)[2], (m1)[2], (m2)[2]))
00359 #define SXV3(to,s,from) \
00360         ((to)[0] = (s) * (from)[0], \
00361          (to)[1] = (s) * (from)[1], \
00362          (to)[2] = (s) * (from)[2])
00363 #define SXM3(to,s,from) \
00364         (SXV3((to)[0], s, (from)[0]), \
00365          SXV3((to)[1], s, (from)[1]), \
00366          SXV3((to)[2], s, (from)[2]))
00367 #define MV3(to,from)    \
00368         ((to)[0] = -(from)[0], \
00369          (to)[1] = -(from)[1], \
00370          (to)[2] = -(from)[2])
00371 #define MM3(to,from)    \
00372         (MV3((to)[0], (from)[0]), \
00373          MV3((to)[1], (from)[1]), \
00374          MV3((to)[2], (from)[2]))
00375 #define VXS3(to,from,s) \
00376         ((to)[0] = (from)[0] * (s), \
00377          (to)[1] = (from)[1] * (s), \
00378          (to)[2] = (from)[2] * (s))
00379 #define VDS3(to,from,s) \
00380         ((to)[0] = (from)[0] / (s), \
00381          (to)[1] = (from)[1] / (s), \
00382          (to)[2] = (from)[2] / (s))
00383 #define MXS3(to,from,s) \
00384         (VXS3((to)[0], (from)[0], s), \
00385          VXS3((to)[1], (from)[1], s), \
00386          VXS3((to)[2], (from)[2], s))
00387 #define MDS3(to,from,s) \
00388         (VDS3((to)[0], (from)[0], s), \
00389          VDS3((to)[1], (from)[1], s), \
00390          VDS3((to)[2], (from)[2], s))
00391 #define MXM3(to,m1,m2)  \
00392         (VXM3((to)[0], (m1)[0], m2), \
00393          VXM3((to)[1], (m1)[1], m2), \
00394          VXM3((to)[2], (m1)[2], m2))
00395 #define VXM3(to,v,m)    \
00396         ((to)[0] = _DOTcol3(v, m, 0), \
00397          (to)[1] = _DOTcol3(v, m, 1), \
00398          (to)[2] = _DOTcol3(v, m, 2))
00399 #define MXV3(to,m,v)    \
00400         ((to)[0] = DOT3((m)[0], v), \
00401          (to)[1] = DOT3((m)[1], v), \
00402          (to)[2] = DOT3((m)[2], v))
00403 #define LERP3(to,v0,v1,t)   \
00404         ((to)[0]=(v0)[0]+(t)*((v1)[0]-(v0)[0]), \
00405          (to)[1]=(v0)[1]+(t)*((v1)[1]-(v0)[1]), \
00406          (to)[2]=(v0)[2]+(t)*((v1)[2]-(v0)[2]))
00407 #define TRACE3(m)   \
00408         ((m)[0][0] + \
00409          (m)[1][1] + \
00410          (m)[2][2])
00411 #define DOT3(v,w)   \
00412         ((v)[0] * (w)[0] + \
00413          (v)[1] * (w)[1] + \
00414          (v)[2] * (w)[2])
00415 #define NORMSQRD3(v)    \
00416         ((v)[0] * (v)[0] + \
00417          (v)[1] * (v)[1] + \
00418          (v)[2] * (v)[2])
00419 #define DISTSQRD3(v,w)  \
00420         (((v)[0]-(w)[0])*((v)[0]-(w)[0]) + \
00421          ((v)[1]-(w)[1])*((v)[1]-(w)[1]) + \
00422          ((v)[2]-(w)[2])*((v)[2]-(w)[2]))
00423 #define _DOTcol3(v,m,j) \
00424         ((v)[0] * (m)[0][j] + \
00425          (v)[1] * (m)[1][j] + \
00426          (v)[2] * (m)[2][j])
00427 #define _SETcol3(v,m,j) \
00428         ((v)[0] = (m)[0][j], \
00429          (v)[1] = (m)[1][j], \
00430          (v)[2] = (m)[2][j])
00431 #define _MXVcol3(to,m,M,j)  \
00432         ((to)[0][j] = _DOTcol3((m)[0],M,j), \
00433          (to)[1][j] = _DOTcol3((m)[1],M,j), \
00434          (to)[2][j] = _DOTcol3((m)[2],M,j))
00435 #define _DET3(v0,v1,v2,i0,i1,i2)    \
00436         ((v0)[i0]* _DET2(v1,v2,i1,i2) + \
00437          (v0)[i1]*-_DET2(v1,v2,i0,i2) + \
00438          (v0)[i2]* _DET2(v1,v2,i0,i1))
00439 #define VXV3(to,v1,v2)  \
00440         ((to)[0] =  _DET2(v1,v2, 1,2), \
00441          (to)[1] = -_DET2(v1,v2, 0,2), \
00442          (to)[2] =  _DET2(v1,v2, 0,1))
00443 #define SET3from2(to,from,pad)  \
00444         ((to)[0] = (from)[0], \
00445          (to)[1] = (from)[1], \
00446          (to)[2] = (pad))
00447 #define SETMAT3from2(to,from,pad0,pad1) \
00448         (SET3from2((to)[0], (from)[0], pad0), \
00449          SET3from2((to)[1], (from)[1], pad0), \
00450          FILLVEC2((to)[2], (pad0)), (to)[2][2] = (pad1))
00451 #define M2XM3(to3,m2,m3)    \
00452         (_MXVcol2(to3,m2,m3,0), (to3)[2][0]=(m3)[2][0], \
00453          _MXVcol2(to3,m2,m3,1), (to3)[2][1]=(m3)[2][1], \
00454          _MXVcol2(to3,m2,m3,2), (to3)[2][2]=(m3)[2][2])
00455 #define M3XM2(to3,m3,m2)    \
00456         (VXM2((to3)[0],(m3)[0],m2), (to3)[0][2]=(m3)[0][2], \
00457          VXM2((to3)[1],(m3)[1],m2), (to3)[1][2]=(m3)[1][2], \
00458          VXM2((to3)[2],(m3)[2],m2), (to3)[2][2]=(m3)[2][2])
00459 #define V3XM4(to3,v3,m4)    \
00460         ((to3)[0] = _DOTcol3(v3,m4,0) + (m4)[3][0], \
00461          (to3)[1] = _DOTcol3(v3,m4,1) + (m4)[3][1], \
00462          (to3)[2] = _DOTcol3(v3,m4,2) + (m4)[3][2])
00463 #define M4XV3(to3,m4,v3)    \
00464         ((to3)[0] = DOT3((m4)[0],v3) + (m4)[0][3], \
00465          (to3)[1] = DOT3((m4)[1],v3) + (m4)[1][3], \
00466          (to3)[2] = DOT3((m4)[2],v3) + (m4)[2][3])
00467 #define VXVXV3(v0,v1,v2)    \
00468         (_DET3(v0,v1,v2,0,1,2))
00469 #define DET3(m) \
00470         (VXVXV3((m)[0],(m)[1],(m)[2]))
00471 #define ADJOINT3(to,m)  \
00472         ( _ADJOINTcol3(to,0,m,1,2), \
00473          __ADJOINTcol3(to,1,m,0,2), \
00474           _ADJOINTcol3(to,2,m,0,1))
00475 #define _ADJOINTcol3(to,col,m,i1,i2)    \
00476         ((to)[0][col] =  _DET2(m[i1],m[i2], 1,2), \
00477          (to)[1][col] = -_DET2(m[i1],m[i2], 0,2), \
00478          (to)[2][col] =  _DET2(m[i1],m[i2], 0,1))
00479 #define __ADJOINTcol3(to,col,m,i1,i2)   \
00480         ((to)[0][col] = -_DET2(m[i1],m[i2], 1,2), \
00481          (to)[1][col] =  _DET2(m[i1],m[i2], 0,2), \
00482          (to)[2][col] = -_DET2(m[i1],m[i2], 0,1))
00483 #define SET4(to,from)   \
00484         ((to)[0] = (from)[0], \
00485          (to)[1] = (from)[1], \
00486          (to)[2] = (from)[2], \
00487          (to)[3] = (from)[3])
00488 #define SETMAT4(to,from)    \
00489         (SET4((to)[0], (from)[0]), \
00490          SET4((to)[1], (from)[1]), \
00491          SET4((to)[2], (from)[2]), \
00492          SET4((to)[3], (from)[3]))
00493 #define ROUNDVEC4(to,from)  \
00494         ((to)[0] = floor((from)[0]+.5), \
00495          (to)[1] = floor((from)[1]+.5), \
00496          (to)[2] = floor((from)[2]+.5), \
00497          (to)[3] = floor((from)[3]+.5))
00498 #define ROUNDMAT4(to,from)  \
00499         (ROUNDVEC4((to)[0], (from)[0]), \
00500          ROUNDVEC4((to)[1], (from)[1]), \
00501          ROUNDVEC4((to)[2], (from)[2]), \
00502          ROUNDVEC4((to)[3], (from)[3]))
00503 #define FILLVEC4(v,s)   \
00504         ((v)[0] = (s), \
00505          (v)[1] = (s), \
00506          (v)[2] = (s), \
00507          (v)[3] = (s))
00508 #define FILLMAT4(m,s)   \
00509         (FILLVEC4((m)[0], s), \
00510          FILLVEC4((m)[1], s), \
00511          FILLVEC4((m)[2], s), \
00512          FILLVEC4((m)[3], s))
00513 #define ZEROVEC4(v) \
00514         ((v)[0] = 0, \
00515          (v)[1] = 0, \
00516          (v)[2] = 0, \
00517          (v)[3] = 0)
00518 #define ISZEROVEC4(v)   \
00519         ((v)[0] == 0 && \
00520          (v)[1] == 0 && \
00521          (v)[2] == 0 && \
00522          (v)[3] == 0)
00523 #define EQVEC4(v,w) \
00524         ((v)[0] == (w)[0] && \
00525          (v)[1] == (w)[1] && \
00526          (v)[2] == (w)[2] && \
00527          (v)[3] == (w)[3])
00528 #define EQMAT4(m1,m2)   \
00529         (EQVEC4((m1)[0], (m2)[0]) && \
00530          EQVEC4((m1)[1], (m2)[1]) && \
00531          EQVEC4((m1)[2], (m2)[2]) && \
00532          EQVEC4((m1)[3], (m2)[3]))
00533 #define ZEROMAT4(m) \
00534         (ZEROVEC4((m)[0]), \
00535          ZEROVEC4((m)[1]), \
00536          ZEROVEC4((m)[2]), \
00537          ZEROVEC4((m)[3]))
00538 #define IDENTMAT4(m)    \
00539         (ZEROVEC4((m)[0]), (m)[0][0]=1, \
00540          ZEROVEC4((m)[1]), (m)[1][1]=1, \
00541          ZEROVEC4((m)[2]), (m)[2][2]=1, \
00542          ZEROVEC4((m)[3]), (m)[3][3]=1)
00543 #define TRANSPOSE4(to,from) \
00544         (_SETcol4((to)[0], from, 0), \
00545          _SETcol4((to)[1], from, 1), \
00546          _SETcol4((to)[2], from, 2), \
00547          _SETcol4((to)[3], from, 3))
00548 #define VPV4(to,v,w)    \
00549         ((to)[0] = (v)[0] + (w)[0], \
00550          (to)[1] = (v)[1] + (w)[1], \
00551          (to)[2] = (v)[2] + (w)[2], \
00552          (to)[3] = (v)[3] + (w)[3])
00553 #define VMV4(to,v,w)    \
00554         ((to)[0] = (v)[0] - (w)[0], \
00555          (to)[1] = (v)[1] - (w)[1], \
00556          (to)[2] = (v)[2] - (w)[2], \
00557          (to)[3] = (v)[3] - (w)[3])
00558 #define MPM4(to,m1,m2)  \
00559         (VPV4((to)[0], (m1)[0], (m2)[0]), \
00560          VPV4((to)[1], (m1)[1], (m2)[1]), \
00561          VPV4((to)[2], (m1)[2], (m2)[2]), \
00562          VPV4((to)[3], (m1)[3], (m2)[3]))
00563 #define MMM4(to,m1,m2)  \
00564         (VMV4((to)[0], (m1)[0], (m2)[0]), \
00565          VMV4((to)[1], (m1)[1], (m2)[1]), \
00566          VMV4((to)[2], (m1)[2], (m2)[2]), \
00567          VMV4((to)[3], (m1)[3], (m2)[3]))
00568 #define SXV4(to,s,from) \
00569         ((to)[0] = (s) * (from)[0], \
00570          (to)[1] = (s) * (from)[1], \
00571          (to)[2] = (s) * (from)[2], \
00572          (to)[3] = (s) * (from)[3])
00573 #define SXM4(to,s,from) \
00574         (SXV4((to)[0], s, (from)[0]), \
00575          SXV4((to)[1], s, (from)[1]), \
00576          SXV4((to)[2], s, (from)[2]), \
00577          SXV4((to)[3], s, (from)[3]))
00578 #define MV4(to,from)    \
00579         ((to)[0] = -(from)[0], \
00580          (to)[1] = -(from)[1], \
00581          (to)[2] = -(from)[2], \
00582          (to)[3] = -(from)[3])
00583 #define MM4(to,from)    \
00584         (MV4((to)[0], (from)[0]), \
00585          MV4((to)[1], (from)[1]), \
00586          MV4((to)[2], (from)[2]), \
00587          MV4((to)[3], (from)[3]))
00588 #define VXS4(to,from,s) \
00589         ((to)[0] = (from)[0] * (s), \
00590          (to)[1] = (from)[1] * (s), \
00591          (to)[2] = (from)[2] * (s), \
00592          (to)[3] = (from)[3] * (s))
00593 #define VDS4(to,from,s) \
00594         ((to)[0] = (from)[0] / (s), \
00595          (to)[1] = (from)[1] / (s), \
00596          (to)[2] = (from)[2] / (s), \
00597          (to)[3] = (from)[3] / (s))
00598 #define MXS4(to,from,s) \
00599         (VXS4((to)[0], (from)[0], s), \
00600          VXS4((to)[1], (from)[1], s), \
00601          VXS4((to)[2], (from)[2], s), \
00602          VXS4((to)[3], (from)[3], s))
00603 #define MDS4(to,from,s) \
00604         (VDS4((to)[0], (from)[0], s), \
00605          VDS4((to)[1], (from)[1], s), \
00606          VDS4((to)[2], (from)[2], s), \
00607          VDS4((to)[3], (from)[3], s))
00608 #define MXM4(to,m1,m2)  \
00609         (VXM4((to)[0], (m1)[0], m2), \
00610          VXM4((to)[1], (m1)[1], m2), \
00611          VXM4((to)[2], (m1)[2], m2), \
00612          VXM4((to)[3], (m1)[3], m2))
00613 #define VXM4(to,v,m)    \
00614         ((to)[0] = _DOTcol4(v, m, 0), \
00615          (to)[1] = _DOTcol4(v, m, 1), \
00616          (to)[2] = _DOTcol4(v, m, 2), \
00617          (to)[3] = _DOTcol4(v, m, 3))
00618 #define MXV4(to,m,v)    \
00619         ((to)[0] = DOT4((m)[0], v), \
00620          (to)[1] = DOT4((m)[1], v), \
00621          (to)[2] = DOT4((m)[2], v), \
00622          (to)[3] = DOT4((m)[3], v))
00623 #define LERP4(to,v0,v1,t)   \
00624         ((to)[0]=(v0)[0]+(t)*((v1)[0]-(v0)[0]), \
00625          (to)[1]=(v0)[1]+(t)*((v1)[1]-(v0)[1]), \
00626          (to)[2]=(v0)[2]+(t)*((v1)[2]-(v0)[2]), \
00627          (to)[3]=(v0)[3]+(t)*((v1)[3]-(v0)[3]))
00628 #define TRACE4(m)   \
00629         ((m)[0][0] + \
00630          (m)[1][1] + \
00631          (m)[2][2] + \
00632          (m)[3][3])
00633 #define DOT4(v,w)   \
00634         ((v)[0] * (w)[0] + \
00635          (v)[1] * (w)[1] + \
00636          (v)[2] * (w)[2] + \
00637          (v)[3] * (w)[3])
00638 #define NORMSQRD4(v)    \
00639         ((v)[0] * (v)[0] + \
00640          (v)[1] * (v)[1] + \
00641          (v)[2] * (v)[2] + \
00642          (v)[3] * (v)[3])
00643 #define DISTSQRD4(v,w)  \
00644         (((v)[0]-(w)[0])*((v)[0]-(w)[0]) + \
00645          ((v)[1]-(w)[1])*((v)[1]-(w)[1]) + \
00646          ((v)[2]-(w)[2])*((v)[2]-(w)[2]) + \
00647          ((v)[3]-(w)[3])*((v)[3]-(w)[3]))
00648 #define _DOTcol4(v,m,j) \
00649         ((v)[0] * (m)[0][j] + \
00650          (v)[1] * (m)[1][j] + \
00651          (v)[2] * (m)[2][j] + \
00652          (v)[3] * (m)[3][j])
00653 #define _SETcol4(v,m,j) \
00654         ((v)[0] = (m)[0][j], \
00655          (v)[1] = (m)[1][j], \
00656          (v)[2] = (m)[2][j], \
00657          (v)[3] = (m)[3][j])
00658 #define _MXVcol4(to,m,M,j)  \
00659         ((to)[0][j] = _DOTcol4((m)[0],M,j), \
00660          (to)[1][j] = _DOTcol4((m)[1],M,j), \
00661          (to)[2][j] = _DOTcol4((m)[2],M,j), \
00662          (to)[3][j] = _DOTcol4((m)[3],M,j))
00663 #define _DET4(v0,v1,v2,v3,i0,i1,i2,i3)  \
00664         ((v0)[i0]* _DET3(v1,v2,v3,i1,i2,i3) + \
00665          (v0)[i1]*-_DET3(v1,v2,v3,i0,i2,i3) + \
00666          (v0)[i2]* _DET3(v1,v2,v3,i0,i1,i3) + \
00667          (v0)[i3]*-_DET3(v1,v2,v3,i0,i1,i2))
00668 #define VXVXV4(to,v1,v2,v3) \
00669         ((to)[0] = -_DET3(v1,v2,v3, 1,2,3), \
00670          (to)[1] =  _DET3(v1,v2,v3, 0,2,3), \
00671          (to)[2] = -_DET3(v1,v2,v3, 0,1,3), \
00672          (to)[3] =  _DET3(v1,v2,v3, 0,1,2))
00673 #define SET4from3(to,from,pad)  \
00674         ((to)[0] = (from)[0], \
00675          (to)[1] = (from)[1], \
00676          (to)[2] = (from)[2], \
00677          (to)[3] = (pad))
00678 #define SETMAT4from3(to,from,pad0,pad1) \
00679         (SET4from3((to)[0], (from)[0], pad0), \
00680          SET4from3((to)[1], (from)[1], pad0), \
00681          SET4from3((to)[2], (from)[2], pad0), \
00682          FILLVEC3((to)[3], (pad0)), (to)[3][3] = (pad1))
00683 #define M3XM4(to4,m3,m4)    \
00684         (_MXVcol3(to4,m3,m4,0), (to4)[3][0]=(m4)[3][0], \
00685          _MXVcol3(to4,m3,m4,1), (to4)[3][1]=(m4)[3][1], \
00686          _MXVcol3(to4,m3,m4,2), (to4)[3][2]=(m4)[3][2], \
00687          _MXVcol3(to4,m3,m4,3), (to4)[3][3]=(m4)[3][3])
00688 #define M4XM3(to4,m4,m3)    \
00689         (VXM3((to4)[0],(m4)[0],m3), (to4)[0][3]=(m4)[0][3], \
00690          VXM3((to4)[1],(m4)[1],m3), (to4)[1][3]=(m4)[1][3], \
00691          VXM3((to4)[2],(m4)[2],m3), (to4)[2][3]=(m4)[2][3], \
00692          VXM3((to4)[3],(m4)[3],m3), (to4)[3][3]=(m4)[3][3])
00693 #define VXVXVXV4(v0,v1,v2,v3)   \
00694         (_DET4(v0,v1,v2,v3,0,1,2,3))
00695 #define DET4(m) \
00696         (VXVXVXV4((m)[0],(m)[1],(m)[2],(m)[3]))
00697 #define ADJOINT4(to,m)  \
00698         ( _ADJOINTcol4(to,0,m,1,2,3), \
00699          __ADJOINTcol4(to,1,m,0,2,3), \
00700           _ADJOINTcol4(to,2,m,0,1,3), \
00701          __ADJOINTcol4(to,3,m,0,1,2))
00702 #define _ADJOINTcol4(to,col,m,i1,i2,i3) \
00703         ((to)[0][col] =  _DET3(m[i1],m[i2],m[i3], 1,2,3), \
00704          (to)[1][col] = -_DET3(m[i1],m[i2],m[i3], 0,2,3), \
00705          (to)[2][col] =  _DET3(m[i1],m[i2],m[i3], 0,1,3), \
00706          (to)[3][col] = -_DET3(m[i1],m[i2],m[i3], 0,1,2))
00707 #define __ADJOINTcol4(to,col,m,i1,i2,i3)    \
00708         ((to)[0][col] = -_DET3(m[i1],m[i2],m[i3], 1,2,3), \
00709          (to)[1][col] =  _DET3(m[i1],m[i2],m[i3], 0,2,3), \
00710          (to)[2][col] = -_DET3(m[i1],m[i2],m[i3], 0,1,3), \
00711          (to)[3][col] =  _DET3(m[i1],m[i2],m[i3], 0,1,2))
00712 #define TRANSPOSE2safe(type,to,from) \
00713         do {type _vec_h_temp_[2][2]; \
00714             TRANSPOSE2(_vec_h_temp_,from); \
00715             SETMAT2(to, _vec_h_temp_); \
00716         } while (0)
00717 #define TRANSPOSE2d(to,from) TRANSPOSE2safe(double,to,from)
00718 #define TRANSPOSE2i(to,from) TRANSPOSE2safe(int,to,from)
00719 #define TRANSPOSE2l(to,from) TRANSPOSE2safe(long,to,from)
00720 #define TRANSPOSE2r(to,from) TRANSPOSE2safe(real,to,from)
00721 #define MXM2safe(type,to,m1,m2) \
00722         do {type _vec_h_temp_[2][2]; \
00723             MXM2(_vec_h_temp_,m1,m2); \
00724             SETMAT2(to, _vec_h_temp_); \
00725         } while (0)
00726 #define MXM2d(to,m1,m2) MXM2safe(double,to,m1,m2)
00727 #define MXM2i(to,m1,m2) MXM2safe(int,to,m1,m2)
00728 #define MXM2l(to,m1,m2) MXM2safe(long,to,m1,m2)
00729 #define MXM2r(to,m1,m2) MXM2safe(real,to,m1,m2)
00730 #define VXM2safe(type,to,v,m) \
00731         do {type _vec_h_temp_[2]; \
00732             VXM2(_vec_h_temp_,v,m); \
00733             SET2(to, _vec_h_temp_); \
00734         } while (0)
00735 #define VXM2d(to,v,m) VXM2safe(double,to,v,m)
00736 #define VXM2i(to,v,m) VXM2safe(int,to,v,m)
00737 #define VXM2l(to,v,m) VXM2safe(long,to,v,m)
00738 #define VXM2r(to,v,m) VXM2safe(real,to,v,m)
00739 #define MXV2safe(type,to,m,v) \
00740         do {type _vec_h_temp_[2]; \
00741             MXV2(_vec_h_temp_,m,v); \
00742             SET2(to, _vec_h_temp_); \
00743         } while (0)
00744 #define MXV2d(to,m,v) MXV2safe(double,to,m,v)
00745 #define MXV2i(to,m,v) MXV2safe(int,to,m,v)
00746 #define MXV2l(to,m,v) MXV2safe(long,to,m,v)
00747 #define MXV2r(to,m,v) MXV2safe(real,to,m,v)
00748 #define XV2safe(type,to,v1) \
00749         do {type _vec_h_temp_[2]; \
00750             XV2(_vec_h_temp_,v1); \
00751             SET2(to, _vec_h_temp_); \
00752         } while (0)
00753 #define XV2d(to,v1) XV2safe(double,to,v1)
00754 #define XV2i(to,v1) XV2safe(int,to,v1)
00755 #define XV2l(to,v1) XV2safe(long,to,v1)
00756 #define XV2r(to,v1) XV2safe(real,to,v1)
00757 #define V2XM3safe(type,to2,v2,m3) \
00758         do {type _vec_h_temp_[2]; \
00759             V2XM3(_vec_h_temp_,v2,m3); \
00760             SET2(to2, _vec_h_temp_); \
00761         } while (0)
00762 #define V2XM3d(to2,v2,m3) V2XM3safe(double,to2,v2,m3)
00763 #define V2XM3i(to2,v2,m3) V2XM3safe(int,to2,v2,m3)
00764 #define V2XM3l(to2,v2,m3) V2XM3safe(long,to2,v2,m3)
00765 #define V2XM3r(to2,v2,m3) V2XM3safe(real,to2,v2,m3)
00766 #define M3XV2safe(type,to2,m3,v2) \
00767         do {type _vec_h_temp_[2]; \
00768             M3XV2(_vec_h_temp_,m3,v2); \
00769             SET2(to2, _vec_h_temp_); \
00770         } while (0)
00771 #define M3XV2d(to2,m3,v2) M3XV2safe(double,to2,m3,v2)
00772 #define M3XV2i(to2,m3,v2) M3XV2safe(int,to2,m3,v2)
00773 #define M3XV2l(to2,m3,v2) M3XV2safe(long,to2,m3,v2)
00774 #define M3XV2r(to2,m3,v2) M3XV2safe(real,to2,m3,v2)
00775 #define ADJOINT2safe(type,to,m) \
00776         do {type _vec_h_temp_[2][2]; \
00777             ADJOINT2(_vec_h_temp_,m); \
00778             SETMAT2(to, _vec_h_temp_); \
00779         } while (0)
00780 #define ADJOINT2d(to,m) ADJOINT2safe(double,to,m)
00781 #define ADJOINT2i(to,m) ADJOINT2safe(int,to,m)
00782 #define ADJOINT2l(to,m) ADJOINT2safe(long,to,m)
00783 #define ADJOINT2r(to,m) ADJOINT2safe(real,to,m)
00784 #define TRANSPOSE3safe(type,to,from) \
00785         do {type _vec_h_temp_[3][3]; \
00786             TRANSPOSE3(_vec_h_temp_,from); \
00787             SETMAT3(to, _vec_h_temp_); \
00788         } while (0)
00789 #define TRANSPOSE3d(to,from) TRANSPOSE3safe(double,to,from)
00790 #define TRANSPOSE3i(to,from) TRANSPOSE3safe(int,to,from)
00791 #define TRANSPOSE3l(to,from) TRANSPOSE3safe(long,to,from)
00792 #define TRANSPOSE3r(to,from) TRANSPOSE3safe(real,to,from)
00793 #define MXM3safe(type,to,m1,m2) \
00794         do {type _vec_h_temp_[3][3]; \
00795             MXM3(_vec_h_temp_,m1,m2); \
00796             SETMAT3(to, _vec_h_temp_); \
00797         } while (0)
00798 #define MXM3d(to,m1,m2) MXM3safe(double,to,m1,m2)
00799 #define MXM3i(to,m1,m2) MXM3safe(int,to,m1,m2)
00800 #define MXM3l(to,m1,m2) MXM3safe(long,to,m1,m2)
00801 #define MXM3r(to,m1,m2) MXM3safe(real,to,m1,m2)
00802 #define VXM3safe(type,to,v,m) \
00803         do {type _vec_h_temp_[3]; \
00804             VXM3(_vec_h_temp_,v,m); \
00805             SET3(to, _vec_h_temp_); \
00806         } while (0)
00807 #define VXM3d(to,v,m) VXM3safe(double,to,v,m)
00808 #define VXM3i(to,v,m) VXM3safe(int,to,v,m)
00809 #define VXM3l(to,v,m) VXM3safe(long,to,v,m)
00810 #define VXM3r(to,v,m) VXM3safe(real,to,v,m)
00811 #define MXV3safe(type,to,m,v) \
00812         do {type _vec_h_temp_[3]; \
00813             MXV3(_vec_h_temp_,m,v); \
00814             SET3(to, _vec_h_temp_); \
00815         } while (0)
00816 #define MXV3d(to,m,v) MXV3safe(double,to,m,v)
00817 #define MXV3i(to,m,v) MXV3safe(int,to,m,v)
00818 #define MXV3l(to,m,v) MXV3safe(long,to,m,v)
00819 #define MXV3r(to,m,v) MXV3safe(real,to,m,v)
00820 #define VXV3safe(type,to,v1,v2) \
00821         do {type _vec_h_temp_[3]; \
00822             VXV3(_vec_h_temp_,v1,v2); \
00823             SET3(to, _vec_h_temp_); \
00824         } while (0)
00825 #define VXV3d(to,v1,v2) VXV3safe(double,to,v1,v2)
00826 #define VXV3i(to,v1,v2) VXV3safe(int,to,v1,v2)
00827 #define VXV3l(to,v1,v2) VXV3safe(long,to,v1,v2)
00828 #define VXV3r(to,v1,v2) VXV3safe(real,to,v1,v2)
00829 #define M2XM3safe(type,to3,m2,m3) \
00830         do {type _vec_h_temp_[3][3]; \
00831             M2XM3(_vec_h_temp_,m2,m3); \
00832             SETMAT3(to3, _vec_h_temp_); \
00833         } while (0)
00834 #define M2XM3d(to3,m2,m3) M2XM3safe(double,to3,m2,m3)
00835 #define M2XM3i(to3,m2,m3) M2XM3safe(int,to3,m2,m3)
00836 #define M2XM3l(to3,m2,m3) M2XM3safe(long,to3,m2,m3)
00837 #define M2XM3r(to3,m2,m3) M2XM3safe(real,to3,m2,m3)
00838 #define M3XM2safe(type,to3,m3,m2) \
00839         do {type _vec_h_temp_[3][3]; \
00840             M3XM2(_vec_h_temp_,m3,m2); \
00841             SETMAT3(to3, _vec_h_temp_); \
00842         } while (0)
00843 #define M3XM2d(to3,m3,m2) M3XM2safe(double,to3,m3,m2)
00844 #define M3XM2i(to3,m3,m2) M3XM2safe(int,to3,m3,m2)
00845 #define M3XM2l(to3,m3,m2) M3XM2safe(long,to3,m3,m2)
00846 #define M3XM2r(to3,m3,m2) M3XM2safe(real,to3,m3,m2)
00847 #define V3XM4safe(type,to3,v3,m4) \
00848         do {type _vec_h_temp_[3]; \
00849             V3XM4(_vec_h_temp_,v3,m4); \
00850             SET3(to3, _vec_h_temp_); \
00851         } while (0)
00852 #define V3XM4d(to3,v3,m4) V3XM4safe(double,to3,v3,m4)
00853 #define V3XM4i(to3,v3,m4) V3XM4safe(int,to3,v3,m4)
00854 #define V3XM4l(to3,v3,m4) V3XM4safe(long,to3,v3,m4)
00855 #define V3XM4r(to3,v3,m4) V3XM4safe(real,to3,v3,m4)
00856 #define M4XV3safe(type,to3,m4,v3) \
00857         do {type _vec_h_temp_[3]; \
00858             M4XV3(_vec_h_temp_,m4,v3); \
00859             SET3(to3, _vec_h_temp_); \
00860         } while (0)
00861 #define M4XV3d(to3,m4,v3) M4XV3safe(double,to3,m4,v3)
00862 #define M4XV3i(to3,m4,v3) M4XV3safe(int,to3,m4,v3)
00863 #define M4XV3l(to3,m4,v3) M4XV3safe(long,to3,m4,v3)
00864 #define M4XV3r(to3,m4,v3) M4XV3safe(real,to3,m4,v3)
00865 #define ADJOINT3safe(type,to,m) \
00866         do {type _vec_h_temp_[3][3]; \
00867             ADJOINT3(_vec_h_temp_,m); \
00868             SETMAT3(to, _vec_h_temp_); \
00869         } while (0)
00870 #define ADJOINT3d(to,m) ADJOINT3safe(double,to,m)
00871 #define ADJOINT3i(to,m) ADJOINT3safe(int,to,m)
00872 #define ADJOINT3l(to,m) ADJOINT3safe(long,to,m)
00873 #define ADJOINT3r(to,m) ADJOINT3safe(real,to,m)
00874 #define TRANSPOSE4safe(type,to,from) \
00875         do {type _vec_h_temp_[4][4]; \
00876             TRANSPOSE4(_vec_h_temp_,from); \
00877             SETMAT4(to, _vec_h_temp_); \
00878         } while (0)
00879 #define TRANSPOSE4d(to,from) TRANSPOSE4safe(double,to,from)
00880 #define TRANSPOSE4i(to,from) TRANSPOSE4safe(int,to,from)
00881 #define TRANSPOSE4l(to,from) TRANSPOSE4safe(long,to,from)
00882 #define TRANSPOSE4r(to,from) TRANSPOSE4safe(real,to,from)
00883 #define MXM4safe(type,to,m1,m2) \
00884         do {type _vec_h_temp_[4][4]; \
00885             MXM4(_vec_h_temp_,m1,m2); \
00886             SETMAT4(to, _vec_h_temp_); \
00887         } while (0)
00888 #define MXM4d(to,m1,m2) MXM4safe(double,to,m1,m2)
00889 #define MXM4i(to,m1,m2) MXM4safe(int,to,m1,m2)
00890 #define MXM4l(to,m1,m2) MXM4safe(long,to,m1,m2)
00891 #define MXM4r(to,m1,m2) MXM4safe(real,to,m1,m2)
00892 #define VXM4safe(type,to,v,m) \
00893         do {type _vec_h_temp_[4]; \
00894             VXM4(_vec_h_temp_,v,m); \
00895             SET4(to, _vec_h_temp_); \
00896         } while (0)
00897 #define VXM4d(to,v,m) VXM4safe(double,to,v,m)
00898 #define VXM4i(to,v,m) VXM4safe(int,to,v,m)
00899 #define VXM4l(to,v,m) VXM4safe(long,to,v,m)
00900 #define VXM4r(to,v,m) VXM4safe(real,to,v,m)
00901 #define MXV4safe(type,to,m,v) \
00902         do {type _vec_h_temp_[4]; \
00903             MXV4(_vec_h_temp_,m,v); \
00904             SET4(to, _vec_h_temp_); \
00905         } while (0)
00906 #define MXV4d(to,m,v) MXV4safe(double,to,m,v)
00907 #define MXV4i(to,m,v) MXV4safe(int,to,m,v)
00908 #define MXV4l(to,m,v) MXV4safe(long,to,m,v)
00909 #define MXV4r(to,m,v) MXV4safe(real,to,m,v)
00910 #define VXVXV4safe(type,to,v1,v2,v3) \
00911         do {type _vec_h_temp_[4]; \
00912             VXVXV4(_vec_h_temp_,v1,v2,v3); \
00913             SET4(to, _vec_h_temp_); \
00914         } while (0)
00915 #define VXVXV4d(to,v1,v2,v3) VXVXV4safe(double,to,v1,v2,v3)
00916 #define VXVXV4i(to,v1,v2,v3) VXVXV4safe(int,to,v1,v2,v3)
00917 #define VXVXV4l(to,v1,v2,v3) VXVXV4safe(long,to,v1,v2,v3)
00918 #define VXVXV4r(to,v1,v2,v3) VXVXV4safe(real,to,v1,v2,v3)
00919 #define M3XM4safe(type,to4,m3,m4) \
00920         do {type _vec_h_temp_[4][4]; \
00921             M3XM4(_vec_h_temp_,m3,m4); \
00922             SETMAT4(to4, _vec_h_temp_); \
00923         } while (0)
00924 #define M3XM4d(to4,m3,m4) M3XM4safe(double,to4,m3,m4)
00925 #define M3XM4i(to4,m3,m4) M3XM4safe(int,to4,m3,m4)
00926 #define M3XM4l(to4,m3,m4) M3XM4safe(long,to4,m3,m4)
00927 #define M3XM4r(to4,m3,m4) M3XM4safe(real,to4,m3,m4)
00928 #define M4XM3safe(type,to4,m4,m3) \
00929         do {type _vec_h_temp_[4][4]; \
00930             M4XM3(_vec_h_temp_,m4,m3); \
00931             SETMAT4(to4, _vec_h_temp_); \
00932         } while (0)
00933 #define M4XM3d(to4,m4,m3) M4XM3safe(double,to4,m4,m3)
00934 #define M4XM3i(to4,m4,m3) M4XM3safe(int,to4,m4,m3)
00935 #define M4XM3l(to4,m4,m3) M4XM3safe(long,to4,m4,m3)
00936 #define M4XM3r(to4,m4,m3) M4XM3safe(real,to4,m4,m3)
00937 #define ADJOINT4safe(type,to,m) \
00938         do {type _vec_h_temp_[4][4]; \
00939             ADJOINT4(_vec_h_temp_,m); \
00940             SETMAT4(to, _vec_h_temp_); \
00941         } while (0)
00942 #define ADJOINT4d(to,m) ADJOINT4safe(double,to,m)
00943 #define ADJOINT4i(to,m) ADJOINT4safe(int,to,m)
00944 #define ADJOINT4l(to,m) ADJOINT4safe(long,to,m)
00945 #define ADJOINT4r(to,m) ADJOINT4safe(real,to,m)
00946 
00947 }
00948 }
00949 }
00950 
00951 #endif /* VEC_H */

Generated on Sun Nov 23 02:29:30 2008 for Sofa by  doxygen 1.5.7.1