109#ifndef _USE_MATH_DEFINES
110# define _USE_MATH_DEFINES 1
130# define M_1_2PI 0.159154943091895335768883763372514362
133# define M_1_PI 0.318309886183790671537767526745028724
136# define M_2_PI 0.636619772367581343075535053490057448
139# define M_2_SQRTPI 1.12837916709551257389615890312154517
142# define M_E 2.71828182845904523536028747135266250
145# define M_EULER 0.577215664901532860606512090082402431
148# define M_LOG2E 1.44269504088896340735992468100189214
151# define M_LOG10E 0.434294481903251827651128918916605082
154# define M_LN2 0.693147180559945309417232121458176568
157# define M_LN10 2.30258509299404568401799145468436421
160# define M_LNPI 1.14472988584940017414342735135305871
163# define M_PI 3.14159265358979323846264338327950288
166# define M_2PI 6.28318530717958647692528676655900576
169# define M_PI_2 1.57079632679489661923132169163975144
172# define M_PI_3 1.04719755119659774615421446109316763
175# define M_PI_4 0.785398163397448309615660845819875721
178# define M_SQRT1_2 0.707106781186547524400844362104849039
181# define M_SQRT2 1.41421356237309504880168872420969808
184# define M_SQRT3 1.73205080756887729352744634150587237
187# define M_SQRTPI 1.77245385090551602729816748334114518
191# define DEG2RAD 0.0174532925199432957692369076848861271
194# define RAD2DEG 57.2957795130823208767981548141051703
230# define MAX_FASTF 1.0e37
231# define SQRT_MAX_FASTF 1.0e18
232# define SMALL_FASTF 1.0e-37
233# define SQRT_SMALL_FASTF 1.0e-18
236# define MAX_FASTF 1.0e73
237# define SQRT_MAX_FASTF 1.0e36
238# define SMALL_FASTF 1.0e-77
240# define SQRT_SMALL_FASTF 1.0e-40
242# define SQRT_SMALL_FASTF 1.0e-39
258# define INFINITY ((fastf_t)DBL_MAX)
259# elif defined(HUGE_VAL)
260# define INFINITY ((fastf_t)HUGE_VAL)
261# elif defined(MAXDOUBLE)
262# define INFINITY ((fastf_t)MAXDOUBLE)
264# define INFINITY ((fastf_t)HUGE)
266# elif defined(FLT_MAX)
267# define INFINITY ((fastf_t)FLT_MAX)
268# elif defined(HUGE_VALF)
269# define INFINITY ((fastf_t)HUGE_VALF)
270# elif defined(MAXFLOAT)
271# define INFINITY ((fastf_t)MAXFLOAT)
276# define INFINITY ((fastf_t)1.0e38)
283# define VDIVIDE_TOL (1.0e-10)
284# define VUNITIZE_TOL (1.0e-7)
287# define VDIVIDE_TOL (DBL_EPSILON)
289# define VDIVIDE_TOL (1.0e-20)
292# define VUNITIZE_TOL (FLT_EPSILON)
294# define VUNITIZE_TOL (1.0e-15)
300#define ELEMENTS_PER_VECT2D 2
303#define ELEMENTS_PER_POINT2D 2
306#define ELEMENTS_PER_VECT 3
309#define ELEMENTS_PER_POINT 3
312#define ELEMENTS_PER_HVECT 4
315#define ELEMENTS_PER_HPOINT 4
318#define ELEMENTS_PER_PLANE 4
321#define ELEMENTS_PER_QUAT 4
324#define ELEMENTS_PER_MAT (ELEMENTS_PER_PLANE*ELEMENTS_PER_PLANE)
424#define INVALID(n) (!((n) > -INFINITY && (n) < INFINITY))
430#define VINVALID(v) (INVALID((v)[X]) || INVALID((v)[Y]) || INVALID((v)[Z]))
436#define V2INVALID(v) (INVALID((v)[X]) || INVALID((v)[Y]))
442#define HINVALID(v) (INVALID((v)[X]) || INVALID((v)[Y]) || INVALID((v)[Z]) || INVALID((v)[W]))
448#ifdef KEITH_WANTS_THIS
460# define NEAR_ZERO(val, epsilon) (!(((val) < -(epsilon)) || ((val) > (epsilon))))
461# define NEAR_ZERO(val, epsilon) (!(((val) < -(epsilon))) && !(((val) > (epsilon))))
463# define NEAR_ZERO(val, epsilon) (((val) > -(epsilon)) && ((val) < (epsilon)))
470#define VNEAR_ZERO(v, tol) \
471 (NEAR_ZERO(v[X], (tol)) \
472 && NEAR_ZERO(v[Y], (tol)) \
473 && NEAR_ZERO(v[Z], (tol)))
479#define V2NEAR_ZERO(v, tol) (NEAR_ZERO(v[X], tol) && NEAR_ZERO(v[Y], tol))
485#define HNEAR_ZERO(v, tol) \
486 (NEAR_ZERO(v[X], (tol)) \
487 && NEAR_ZERO(v[Y], (tol)) \
488 && NEAR_ZERO(v[Z], (tol)) \
489 && NEAR_ZERO(v[W], (tol)))
496#define ZERO(_a) NEAR_ZERO((_a), SMALL_FASTF)
502#define VZERO(_a) VNEAR_ZERO((_a), SMALL_FASTF)
508#define V2ZERO(_a) V2NEAR_ZERO((_a), SMALL_FASTF)
514#define HZERO(_a) HNEAR_ZERO((_a), SMALL_FASTF)
521#define NEAR_EQUAL(_a, _b, _tol) NEAR_ZERO((_a) - (_b), (_tol))
527#define VNEAR_EQUAL(_a, _b, _tol) \
528 (NEAR_EQUAL((_a)[X], (_b)[X], (_tol)) \
529 && NEAR_EQUAL((_a)[Y], (_b)[Y], (_tol)) \
530 && NEAR_EQUAL((_a)[Z], (_b)[Z], (_tol)))
536#define V2NEAR_EQUAL(a, b, tol) \
537 (NEAR_EQUAL((a)[X], (b)[X], tol) \
538 && NEAR_EQUAL((a)[Y], (b)[Y], tol))
544#define HNEAR_EQUAL(_a, _b, _tol) \
545 (NEAR_EQUAL((_a)[X], (_b)[X], (_tol)) \
546 && NEAR_EQUAL((_a)[Y], (_b)[Y], (_tol)) \
547 && NEAR_EQUAL((_a)[Z], (_b)[Z], (_tol)) \
548 && NEAR_EQUAL((_a)[W], (_b)[W], (_tol)))
554#define EQUAL(_a, _b) NEAR_EQUAL((_a), (_b), SMALL_FASTF)
561#define VEQUAL(_a, _b) VNEAR_EQUAL((_a), (_b), SMALL_FASTF)
567#define V2EQUAL(_a, _b) V2NEAR_EQUAL((_a), (_b), SMALL_FASTF)
573#define HEQUAL(_a, _b) HNEAR_EQUAL((_a), (_b), SMALL_FASTF)
577#define DIST_PNT_PLANE(_pt, _pl) (VDOT(_pt, _pl) - (_pl)[W])
580#define DIST_PNT_PNT_SQ(_a, _b) \
581 (((_a)[X]-(_b)[X])*((_a)[X]-(_b)[X]) + \
582 ((_a)[Y]-(_b)[Y])*((_a)[Y]-(_b)[Y]) + \
583 ((_a)[Z]-(_b)[Z])*((_a)[Z]-(_b)[Z]))
586#define DIST_PNT_PNT(_a, _b) sqrt(DIST_PNT_PNT_SQ(_a, _b))
589#define DIST_PNT2_PNT2_SQ(_a, _b) \
590 (((_a)[X]-(_b)[X])*((_a)[X]-(_b)[X]) + \
591 ((_a)[Y]-(_b)[Y])*((_a)[Y]-(_b)[Y]))
594#define DIST_PNT2_PNT2(_a, _b) sqrt(DIST_PNT2_PNT2_SQ(_a, _b))
598#define MAT_DELTAS(_m, _x, _y, _z) do { \
605#define MAT_DELTAS_VEC(_m, _v) \
606 MAT_DELTAS(_m, (_v)[X], (_v)[Y], (_v)[Z])
612#define MAT_DELTAS_VEC_NEG(_m, _v) \
613 MAT_DELTAS(_m, -(_v)[X], -(_v)[Y], -(_v)[Z])
616#define MAT_DELTAS_GET(_v, _m) do { \
617 (_v)[X] = (_m)[MDX]; \
618 (_v)[Y] = (_m)[MDY]; \
619 (_v)[Z] = (_m)[MDZ]; \
626#define MAT_DELTAS_GET_NEG(_v, _m) do { \
627 (_v)[X] = -(_m)[MDX]; \
628 (_v)[Y] = -(_m)[MDY]; \
629 (_v)[Z] = -(_m)[MDZ]; \
636#define MAT_DELTAS_ADD(_m, _x, _y, _z) do { \
646#define MAT_DELTAS_ADD_VEC(_m, _v) do { \
647 (_m)[MDX] += (_v)[X]; \
648 (_m)[MDY] += (_v)[Y]; \
649 (_m)[MDZ] += (_v)[Z]; \
656#define MAT_DELTAS_SUB(_m, _x, _y, _z) do { \
666#define MAT_DELTAS_SUB_VEC(_m, _v) do { \
667 (_m)[MDX] -= (_v)[X]; \
668 (_m)[MDY] -= (_v)[Y]; \
669 (_m)[MDZ] -= (_v)[Z]; \
676#define MAT_DELTAS_MUL(_m, _x, _y, _z) do { \
686#define MAT_DELTAS_MUL_VEC(_m, _v) do { \
687 (_m)[MDX] *= (_v)[X]; \
688 (_m)[MDY] *= (_v)[Y]; \
689 (_m)[MDZ] *= (_v)[Z]; \
693#define MAT_SCALE(_m, _x, _y, _z) do { \
700#define MAT_SCALE_VEC(_m, _v) do { \
701 (_m)[MSX] = (_v)[X]; \
702 (_m)[MSY] = (_v)[Y]; \
703 (_m)[MSZ] = (_v)[Z]; \
707#define MAT_SCALE_ALL(_m, _s) (_m)[MSA] = (_s)
710#define MAT_SCALE_ADD(_m, _x, _y, _z) do { \
717#define MAT_SCALE_ADD_VEC(_m, _v) do { \
718 (_m)[MSX] += (_v)[X]; \
719 (_m)[MSY] += (_v)[Y]; \
720 (_m)[MSZ] += (_v)[Z]; \
724#define MAT_SCALE_SUB(_m, _x, _y, _z) do { \
734#define MAT_SCALE_SUB_VEC(_m, _v) do { \
735 (_m)[MSX] -= (_v)[X]; \
736 (_m)[MSY] -= (_v)[Y]; \
737 (_m)[MSZ] -= (_v)[Z]; \
741#define MAT_SCALE_MUL(_m, _x, _y, _z) do { \
748#define MAT_SCALE_MUL_VEC(_m, _v) do { \
749 (_m)[MSX] *= (_v)[X]; \
750 (_m)[MSY] *= (_v)[Y]; \
751 (_m)[MSZ] *= (_v)[Z]; \
762#define MAT_ZERO(m) do { \
763 (m)[0] = (m)[1] = (m)[2] = (m)[3] = \
764 (m)[4] = (m)[5] = (m)[6] = (m)[7] = \
765 (m)[8] = (m)[9] = (m)[10] = (m)[11] = \
766 (m)[12] = (m)[13] = (m)[14] = (m)[15] = 0.0; \
770#define MAT_IDN(m) do { \
771 (m)[1] = (m)[2] = (m)[3] = (m)[4] = \
772 (m)[6] = (m)[7] = (m)[8] = (m)[9] = \
773 (m)[11] = (m)[12] = (m)[13] = (m)[14] = 0.0; \
774 (m)[0] = (m)[5] = (m)[10] = (m)[15] = 1.0; \
783#define MAT_TRANSPOSE(t, m) do { \
803#define MAT_COPY(c, m) do { \
823#define VSET(o, a, b, c) do { \
830#define V2SET(o, a, b) do { \
836#define HSET(o, a, b, c, d) do { \
845#define VSETALL(v, s) do { \
846 (v)[X] = (v)[Y] = (v)[Z] = (s); \
850#define V2SETALL(v, s) do { \
851 (v)[X] = (v)[Y] = (s); \
855#define HSETALL(v, s) do { \
856 (v)[X] = (v)[Y] = (v)[Z] = (v)[W] = (s); \
861#define VSETALLN(v, s, n) do { \
863 for (_j=0; _j < (int)(n); _j++) v[_j]=(s); \
868#define VMOVE(o, v) do { \
875#define V2MOVE(o, v) do { \
881#define HMOVE(o, v) do { \
889#define VMOVEN(o, v, n) do { \
891 for (_vmove = 0; _vmove < (int)(n); _vmove++) { \
892 (o)[_vmove] = (v)[_vmove]; \
902#define VREVERSE(o, v) do { \
913#define V2REVERSE(o, v) do { \
924#define HREVERSE(o, v) do { \
932#define VADD2(o, a, b) do { \
933 (o)[X] = (a)[X] + (b)[X]; \
934 (o)[Y] = (a)[Y] + (b)[Y]; \
935 (o)[Z] = (a)[Z] + (b)[Z]; \
939#define V2ADD2(o, a, b) do { \
940 (o)[X] = (a)[X] + (b)[X]; \
941 (o)[Y] = (a)[Y] + (b)[Y]; \
945#define HADD2(o, a, b) do { \
946 (o)[X] = (a)[X] + (b)[X]; \
947 (o)[Y] = (a)[Y] + (b)[Y]; \
948 (o)[Z] = (a)[Z] + (b)[Z]; \
949 (o)[W] = (a)[W] + (b)[W]; \
956#define VADD2N(o, a, b, n) do { \
958 for (_vadd2 = 0; _vadd2 < (int)(n); _vadd2++) { \
959 (o)[_vadd2] = (a)[_vadd2] + (b)[_vadd2]; \
968#define VSUB2(o, a, b) do { \
969 (o)[X] = (a)[X] - (b)[X]; \
970 (o)[Y] = (a)[Y] - (b)[Y]; \
971 (o)[Z] = (a)[Z] - (b)[Z]; \
978#define V2SUB2(o, a, b) do { \
979 (o)[X] = (a)[X] - (b)[X]; \
980 (o)[Y] = (a)[Y] - (b)[Y]; \
987#define HSUB2(o, a, b) do { \
988 (o)[X] = (a)[X] - (b)[X]; \
989 (o)[Y] = (a)[Y] - (b)[Y]; \
990 (o)[Z] = (a)[Z] - (b)[Z]; \
991 (o)[W] = (a)[W] - (b)[W]; \
998#define VSUB2N(o, a, b, n) do { \
1000 for (_vsub2 = 0; _vsub2 < (int)(n); _vsub2++) { \
1001 (o)[_vsub2] = (a)[_vsub2] - (b)[_vsub2]; \
1007#define VSUB3(o, a, b, c) do { \
1008 (o)[X] = (a)[X] - (b)[X] - (c)[X]; \
1009 (o)[Y] = (a)[Y] - (b)[Y] - (c)[Y]; \
1010 (o)[Z] = (a)[Z] - (b)[Z] - (c)[Z]; \
1014#define V2SUB3(o, a, b, c) do { \
1015 (o)[X] = (a)[X] - (b)[X] - (c)[X]; \
1016 (o)[Y] = (a)[Y] - (b)[Y] - (c)[Y]; \
1020#define HSUB3(o, a, b, c) do { \
1021 (o)[X] = (a)[X] - (b)[X] - (c)[X]; \
1022 (o)[Y] = (a)[Y] - (b)[Y] - (c)[Y]; \
1023 (o)[Z] = (a)[Z] - (b)[Z] - (c)[Z]; \
1024 (o)[W] = (a)[W] - (b)[W] - (c)[W]; \
1028#define VSUB3N(o, a, b, c, n) do { \
1030 for (_vsub3 = 0; _vsub3 < (int)(n); _vsub3++) { \
1031 (o)[_vsub3] = (a)[_vsub3] - (b)[_vsub3] - (c)[_vsub3]; \
1037#define VADD3(o, a, b, c) do { \
1038 (o)[X] = (a)[X] + (b)[X] + (c)[X]; \
1039 (o)[Y] = (a)[Y] + (b)[Y] + (c)[Y]; \
1040 (o)[Z] = (a)[Z] + (b)[Z] + (c)[Z]; \
1044#define V2ADD3(o, a, b, c) do { \
1045 (o)[X] = (a)[X] + (b)[X] + (c)[X]; \
1046 (o)[Y] = (a)[Y] + (b)[Y] + (c)[Y]; \
1050#define HADD3(o, a, b, c) do { \
1051 (o)[X] = (a)[X] + (b)[X] + (c)[X]; \
1052 (o)[Y] = (a)[Y] + (b)[Y] + (c)[Y]; \
1053 (o)[Z] = (a)[Z] + (b)[Z] + (c)[Z]; \
1054 (o)[W] = (a)[W] + (b)[W] + (c)[W]; \
1061#define VADD3N(o, a, b, c, n) do { \
1063 for (_vadd3 = 0; _vadd3 < (int)(n); _vadd3++) { \
1064 (o)[_vadd3] = (a)[_vadd3] + (b)[_vadd3] + (c)[_vadd3]; \
1073#define VADD4(o, a, b, c, d) do { \
1074 (o)[X] = (a)[X] + (b)[X] + (c)[X] + (d)[X]; \
1075 (o)[Y] = (a)[Y] + (b)[Y] + (c)[Y] + (d)[Y]; \
1076 (o)[Z] = (a)[Z] + (b)[Z] + (c)[Z] + (d)[Z]; \
1083#define V2ADD4(o, a, b, c, d) do { \
1084 (o)[X] = (a)[X] + (b)[X] + (c)[X] + (d)[X]; \
1085 (o)[Y] = (a)[Y] + (b)[Y] + (c)[Y] + (d)[Y]; \
1092#define HADD4(o, a, b, c, d) do { \
1093 (o)[X] = (a)[X] + (b)[X] + (c)[X] + (d)[X]; \
1094 (o)[Y] = (a)[Y] + (b)[Y] + (c)[Y] + (d)[Y]; \
1095 (o)[Z] = (a)[Z] + (b)[Z] + (c)[Z] + (d)[Z]; \
1096 (o)[W] = (a)[W] + (b)[W] + (c)[W] + (d)[W]; \
1103#define VADD4N(o, a, b, c, d, n) do { \
1105 for (_vadd4 = 0; _vadd4 < (int)(n); _vadd4++) { \
1106 (o)[_vadd4] = (a)[_vadd4] + (b)[_vadd4] + (c)[_vadd4] + (d)[_vadd4]; \
1112#define VSCALE(o, v, s) do { \
1113 (o)[X] = (v)[X] * (s); \
1114 (o)[Y] = (v)[Y] * (s); \
1115 (o)[Z] = (v)[Z] * (s); \
1119#define V2SCALE(o, v, s) do { \
1120 (o)[X] = (v)[X] * (s); \
1121 (o)[Y] = (v)[Y] * (s); \
1125#define HSCALE(o, v, s) do { \
1126 (o)[X] = (v)[X] * (s); \
1127 (o)[Y] = (v)[Y] * (s); \
1128 (o)[Z] = (v)[Z] * (s); \
1129 (o)[W] = (v)[W] * (s); \
1136#define VSCALEN(o, v, s, n) do { \
1138 for (_vscale = 0; _vscale < (int)(n); _vscale++) { \
1139 (o)[_vscale] = (v)[_vscale] * (s); \
1148#define VUNITIZE(v) do { \
1149 double _f = MAGSQ(v); \
1150 if (! NEAR_EQUAL(_f, 1.0, VUNITIZE_TOL)) { \
1152 if (_f < VDIVIDE_TOL) { \
1153 VSETALL((v), 0.0); \
1156 (v)[X] *= _f; (v)[Y] *= _f; (v)[Z] *= _f; \
1166#define V2UNITIZE(v) do { \
1167 double _f = MAG2SQ(v); \
1168 if (! NEAR_EQUAL(_f, 1.0, VUNITIZE_TOL)) { \
1170 if (_f < VDIVIDE_TOL) { \
1171 V2SETALL((v), 0.0); \
1174 (v)[X] *= _f; (v)[Y] *= _f; \
1183#define VADD2SCALE(o, a, b, s) do { \
1184 (o)[X] = ((a)[X] + (b)[X]) * (s); \
1185 (o)[Y] = ((a)[Y] + (b)[Y]) * (s); \
1186 (o)[Z] = ((a)[Z] + (b)[Z]) * (s); \
1193#define VADD2SCALEN(o, a, b, s, n) do { \
1195 for (_vadd2scale = 0; \
1196 _vadd2scale < (int)(n); \
1198 (o)[_vadd2scale] = ((a)[_vadd2scale] + (b)[_vadd2scale]) * (s); \
1206#define VSUB2SCALE(o, a, b, s) do { \
1207 (o)[X] = ((a)[X] - (b)[X]) * (s); \
1208 (o)[Y] = ((a)[Y] - (b)[Y]) * (s); \
1209 (o)[Z] = ((a)[Z] - (b)[Z]) * (s); \
1216#define VSUB2SCALEN(o, a, b, s, n) do { \
1218 for (_vsub2scale = 0; \
1219 _vsub2scale < (int)(n); \
1221 (o)[_vsub2scale] = ((a)[_vsub2scale] - (b)[_vsub2scale]) * (s); \
1228#define VCOMB2(o, sa, va, sb, vb) do { \
1229 (o)[X] = (sa) * (va)[X] + (sb) * (vb)[X]; \
1230 (o)[Y] = (sa) * (va)[Y] + (sb) * (vb)[Y]; \
1231 (o)[Z] = (sa) * (va)[Z] + (sb) * (vb)[Z]; \
1238#define VCOMB2N(o, sa, va, sb, vb, n) do { \
1241 _vcomb2 < (int)(n); \
1243 (o)[_vcomb2] = (sa) * (va)[_vcomb2] + (sb) * (vb)[_vcomb2]; \
1251#define VCOMB3(o, sa, va, sb, vb, sc, vc) do { \
1252 (o)[X] = (sa) * (va)[X] + (sb) * (vb)[X] + (sc) * (vc)[X]; \
1253 (o)[Y] = (sa) * (va)[Y] + (sb) * (vb)[Y] + (sc) * (vc)[Y]; \
1254 (o)[Z] = (sa) * (va)[Z] + (sb) * (vb)[Z] + (sc) * (vc)[Z]; \
1261#define VCOMB3N(o, sa, va, sb, vb, sc, vc, n) do { \
1264 _vcomb3 < (int)(n); \
1266 (o)[_vcomb3] = (sa) * (va)[_vcomb3] + (sb) * (vb)[_vcomb3] + (sc) * (vc)[_vcomb3]; \
1278#define VJOIN1(o, va, sb, vb) do { \
1279 (o)[X] = (va)[X] + (sb) * (vb)[X]; \
1280 (o)[Y] = (va)[Y] + (sb) * (vb)[Y]; \
1281 (o)[Z] = (va)[Z] + (sb) * (vb)[Z]; \
1291#define V2JOIN1(o, va, sb, vb) do { \
1292 (o)[X] = (va)[X] + (sb) * (vb)[X]; \
1293 (o)[Y] = (va)[Y] + (sb) * (vb)[Y]; \
1303#define HJOIN1(o, va, sb, vb) do { \
1304 (o)[X] = (va)[X] + (sb) * (vb)[X]; \
1305 (o)[Y] = (va)[Y] + (sb) * (vb)[Y]; \
1306 (o)[Z] = (va)[Z] + (sb) * (vb)[Z]; \
1307 (o)[W] = (va)[W] + (sb) * (vb)[W]; \
1317#define VJOIN1N(o, va, sb, vb, n) do { \
1320 _vjoin1 < (int)(n); \
1322 (o)[_vjoin1] = (va)[_vjoin1] + (sb) * (vb)[_vjoin1]; \
1333#define VJOIN2(o, va, sb, vb, sc, vc) do { \
1334 (o)[X] = (va)[X] + (sb) * (vb)[X] + (sc) * (vc)[X]; \
1335 (o)[Y] = (va)[Y] + (sb) * (vb)[Y] + (sc) * (vc)[Y]; \
1336 (o)[Z] = (va)[Z] + (sb) * (vb)[Z] + (sc) * (vc)[Z]; \
1345#define V2JOIN2(o, va, sb, vb, sc, vc) do { \
1346 (o)[X] = (va)[X] + (sb) * (vb)[X] + (sc) * (vc)[X]; \
1347 (o)[Y] = (va)[Y] + (sb) * (vb)[Y] + (sc) * (vc)[Y]; \
1356#define HJOIN2(o, a, sb, b, sc, c) do { \
1357 (o)[X] = (a)[X] + (sb) * (b)[X] + (sc) * (c)[X]; \
1358 (o)[Y] = (a)[Y] + (sb) * (b)[Y] + (sc) * (c)[Y]; \
1359 (o)[Z] = (a)[Z] + (sb) * (b)[Z] + (sc) * (c)[Z]; \
1360 (o)[W] = (a)[W] + (sb) * (b)[W] + (sc) * (c)[W]; \
1363#define VJOIN2N(o, va, sb, vb, sc, vc, n) do { \
1366 _vjoin2 < (int)(n); \
1368 (o)[_vjoin2] = (va)[_vjoin2] + (sb) * (vb)[_vjoin2] + (sc) * (vc)[_vjoin2]; \
1376#define VJOIN3(o, va, sb, vb, sc, vc, sd, vd) do { \
1377 (o)[X] = (va)[X] + (sb)*(vb)[X] + (sc)*(vc)[X] + (sd)*(vd)[X]; \
1378 (o)[Y] = (va)[Y] + (sb)*(vb)[Y] + (sc)*(vc)[Y] + (sd)*(vd)[Y]; \
1379 (o)[Z] = (va)[Z] + (sb)*(vb)[Z] + (sc)*(vc)[Z] + (sd)*(vd)[Z]; \
1388#define VBLEND2(o, sa, va, sb, vb) do { \
1389 (o)[X] = (sa) * (va)[X] + (sb) * (vb)[X]; \
1390 (o)[Y] = (sa) * (va)[Y] + (sb) * (vb)[Y]; \
1391 (o)[Z] = (sa) * (va)[Z] + (sb) * (vb)[Z]; \
1399#define VBLEND2N(o, sa, va, sb, vb, n) do { \
1401 for (_vblend2 = 0; \
1402 _vblend2 < (int)(n); \
1404 (o)[_vblend2] = (sa) * (va)[_vblend2] + (sb) * (vb)[_vblend2]; \
1416#define VPROJECT(a, b, c, d) do { \
1417 double _dot = VDOT((b), (b)); \
1418 if (NEAR_ZERO(_dot, SQRT_SMALL_FASTF)) { \
1419 VSCALE((c), (b), 0.0); \
1421 VSCALE((c), (b), VDOT((a), (b)) / _dot); \
1423 VSUB2((d), (a), (c)); \
1427#define MAGSQ(v) ((v)[X]*(v)[X] + (v)[Y]*(v)[Y] + (v)[Z]*(v)[Z])
1428#define MAG2SQ(v) ((v)[X]*(v)[X] + (v)[Y]*(v)[Y])
1435#define MAGNITUDE(v) sqrt(MAGSQ(v))
1441#define MAGNITUDE2(v) sqrt(MAG2SQ(v))
1458#define VCROSS(o, a, b) do { \
1459 (o)[X] = (a)[Y] * (b)[Z] - (a)[Z] * (b)[Y]; \
1460 (o)[Y] = (a)[Z] * (b)[X] - (a)[X] * (b)[Z]; \
1461 (o)[Z] = (a)[X] * (b)[Y] - (a)[Y] * (b)[X]; \
1469#define V2CROSS(a, b) ((a)[X] * (b)[Y] - (a)[Y] * (b)[X])
1487#define HCROSS(o, a, b) do { \
1488 VCROSS((o), (a), (b)); \
1489 (o)[W] = (a)[W] * (b)[W]; \
1494#define VDOT(a, b) ((a)[X]*(b)[X] + (a)[Y]*(b)[Y] + (a)[Z]*(b)[Z])
1496#define V2DOT(a, b) ((a)[X]*(b)[X] + (a)[Y]*(b)[Y])
1498#define HDOT(a, b) ((a)[X]*(b)[X] + (a)[Y]*(b)[Y] + (a)[Z]*(b)[Z] + (a)[W]*(b)[W])
1510#define VLERP(o, a, b, t) do { \
1511 (o)[X] = (a)[X] * (1 - (t)) + (b)[X] * (t); \
1512 (o)[Y] = (a)[Y] * (1 - (t)) + (b)[Y] * (t); \
1513 (o)[Z] = (a)[Z] * (1 - (t)) + (b)[Z] * (t); \
1525#define V2LERP(o, a, b, t) do { \
1526 (o)[X] = (a)[X] * (1 - (t)) + (b)[X] * (t); \
1527 (o)[Y] = (a)[Y] * (1 - (t)) + (b)[Y] * (t); \
1539#define HLERP(o, a, b, t) do { \
1540 (o)[X] = (a)[X] * (1 - (t)) + (b)[X] * (t); \
1541 (o)[Y] = (a)[Y] * (1 - (t)) + (b)[Y] * (t); \
1542 (o)[Z] = (a)[Z] * (1 - (t)) + (b)[Z] * (t); \
1543 (o)[W] = (a)[W] * (1 - (t)) + (b)[W] * (t); \
1551#define VSUB2DOT(_pt2, _pt, _vec) (\
1552 ((_pt2)[X] - (_pt)[X]) * (_vec)[X] + \
1553 ((_pt2)[Y] - (_pt)[Y]) * (_vec)[Y] + \
1554 ((_pt2)[Z] - (_pt)[Z]) * (_vec)[Z])
1560#define V2ARGS(a) (a)[X], (a)[Y]
1561#define V3ARGS(a) (a)[X], (a)[Y], (a)[Z]
1562#define V4ARGS(a) (a)[X], (a)[Y], (a)[Z], (a)[W]
1573#define INTCLAMP(_a) (NEAR_EQUAL((_a), rint(_a), VUNITIZE_TOL) ? rint(_a) : (_a))
1576#define VINTCLAMP(_v) do { \
1577 (_v)[X] = INTCLAMP((_v)[X]); \
1578 (_v)[Y] = INTCLAMP((_v)[Y]); \
1579 (_v)[Z] = INTCLAMP((_v)[Z]); \
1583#define V2INTCLAMP(_v) do { \
1584 (_v)[X] = INTCLAMP((_v)[X]); \
1585 (_v)[Y] = INTCLAMP((_v)[Y]); \
1589#define HINTCLAMP(_v) do { \
1591 (_v)[W] = INTCLAMP((_v)[W]); \
1596#define V2INTCLAMPARGS(a) INTCLAMP((a)[X]), INTCLAMP((a)[Y])
1598#define V3INTCLAMPARGS(a) INTCLAMP((a)[X]), INTCLAMP((a)[Y]), INTCLAMP((a)[Z])
1600#define V4INTCLAMPARGS(a) INTCLAMP((a)[X]), INTCLAMP((a)[Y]), INTCLAMP((a)[Z]), INTCLAMP((a)[W])
1603#define V2PRINT(a, b) \
1604 fprintf(stderr, "%s (%.6f, %.6g)\n", a, V2ARGS(b))
1605#define VPRINT(a, b) \
1606 fprintf(stderr, "%s (%.6f, %.6f, %.6f)\n", a, V3ARGS(b))
1607#define HPRINT(a, b) \
1608 fprintf(stderr, "%s (%.6f, %.6f, %.6f, %.6f)\n", a, V4ARGS(b))
1615#define V2INTCLAMPPRINT(a, b) \
1616 fprintf(stderr, "%s (%g, %g)\n", a, V2INTCLAMPARGS(b))
1617#define VINTCLAMPPRINT(a, b) \
1618 fprintf(stderr, "%s (%g, %g, %g)\n", a, V3INTCLAMPARGS(b))
1619#define HINTCLAMPPRINT(a, b) \
1620 fprintf(stderr, "%s (%g, %g, %g, %g)\n", a, V4INTCLAMPARGS(b))
1624#define VELMUL(o, a, b) do { \
1625 (o)[X] = (a)[X] * (b)[X]; \
1626 (o)[Y] = (a)[Y] * (b)[Y]; \
1627 (o)[Z] = (a)[Z] * (b)[Z]; \
1630#define VELMUL3(o, a, b, c) do { \
1631 (o)[X] = (a)[X] * (b)[X] * (c)[X]; \
1632 (o)[Y] = (a)[Y] * (b)[Y] * (c)[Y]; \
1633 (o)[Z] = (a)[Z] * (b)[Z] * (c)[Z]; \
1637#define VELDIV(o, a, b) do { \
1638 (o)[X] = (a)[X] / (b)[X]; \
1639 (o)[Y] = (a)[Y] / (b)[Y]; \
1640 (o)[Z] = (a)[Z] / (b)[Z]; \
1648#define VINVDIR(_inv, _dir) do { \
1649 if (NEAR_ZERO((_dir)[X], SQRT_SMALL_FASTF)) { \
1651 (_inv)[X] = INFINITY; \
1653 (_inv)[X]=1.0/(_dir)[X]; \
1655 if (NEAR_ZERO((_dir)[Y], SQRT_SMALL_FASTF)) { \
1657 (_inv)[Y] = INFINITY; \
1659 (_inv)[Y]=1.0/(_dir)[Y]; \
1661 if (NEAR_ZERO((_dir)[Z], SQRT_SMALL_FASTF)) { \
1663 (_inv)[Z] = INFINITY; \
1665 (_inv)[Z]=1.0/(_dir)[Z]; \
1673#define MAT3X3VEC(o, mat, vec) do { \
1674 (o)[X] = (mat)[X]*(vec)[X]+(mat)[Y]*(vec)[Y] + (mat)[ 2]*(vec)[Z]; \
1675 (o)[Y] = (mat)[4]*(vec)[X]+(mat)[5]*(vec)[Y] + (mat)[ 6]*(vec)[Z]; \
1676 (o)[Z] = (mat)[8]*(vec)[X]+(mat)[9]*(vec)[Y] + (mat)[10]*(vec)[Z]; \
1680#define VEC3X3MAT(o, i, m) do { \
1681 (o)[X] = (i)[X]*(m)[X] + (i)[Y]*(m)[4] + (i)[Z]*(m)[8]; \
1682 (o)[Y] = (i)[X]*(m)[1] + (i)[Y]*(m)[5] + (i)[Z]*(m)[9]; \
1683 (o)[Z] = (i)[X]*(m)[2] + (i)[Y]*(m)[6] + (i)[Z]*(m)[10]; \
1687#define MAT3X2VEC(o, mat, vec) do { \
1688 (o)[X] = (mat)[0]*(vec)[X] + (mat)[Y]*(vec)[Y]; \
1689 (o)[Y] = (mat)[4]*(vec)[X] + (mat)[5]*(vec)[Y]; \
1690 (o)[Z] = (mat)[8]*(vec)[X] + (mat)[9]*(vec)[Y]; \
1694#define VEC2X3MAT(o, i, m) do { \
1695 (o)[X] = (i)[X]*(m)[0] + (i)[Y]*(m)[4]; \
1696 (o)[Y] = (i)[X]*(m)[1] + (i)[Y]*(m)[5]; \
1697 (o)[Z] = (i)[X]*(m)[2] + (i)[Y]*(m)[6]; \
1704#define MAT4X3PNT(o, m, i) do { \
1706 _f = 1.0/((m)[12]*(i)[X] + (m)[13]*(i)[Y] + (m)[14]*(i)[Z] + (m)[15]); \
1707 (o)[X]=((m)[0]*(i)[X] + (m)[1]*(i)[Y] + (m)[ 2]*(i)[Z] + (m)[3]) * _f; \
1708 (o)[Y]=((m)[4]*(i)[X] + (m)[5]*(i)[Y] + (m)[ 6]*(i)[Z] + (m)[7]) * _f; \
1709 (o)[Z]=((m)[8]*(i)[X] + (m)[9]*(i)[Y] + (m)[10]*(i)[Z] + (m)[11])* _f; \
1716#define PNT3X4MAT(o, i, m) do { \
1718 _f = 1.0/((i)[X]*(m)[3] + (i)[Y]*(m)[7] + (i)[Z]*(m)[11] + (m)[15]); \
1719 (o)[X]=((i)[X]*(m)[0] + (i)[Y]*(m)[4] + (i)[Z]*(m)[8] + (m)[12]) * _f; \
1720 (o)[Y]=((i)[X]*(m)[1] + (i)[Y]*(m)[5] + (i)[Z]*(m)[9] + (m)[13]) * _f; \
1721 (o)[Z]=((i)[X]*(m)[2] + (i)[Y]*(m)[6] + (i)[Z]*(m)[10] + (m)[14])* _f; \
1728#define MAT4X4PNT(o, m, i) do { \
1729 (o)[X]=(m)[ 0]*(i)[X] + (m)[ 1]*(i)[Y] + (m)[ 2]*(i)[Z] + (m)[ 3]*(i)[W]; \
1730 (o)[Y]=(m)[ 4]*(i)[X] + (m)[ 5]*(i)[Y] + (m)[ 6]*(i)[Z] + (m)[ 7]*(i)[W]; \
1731 (o)[Z]=(m)[ 8]*(i)[X] + (m)[ 9]*(i)[Y] + (m)[10]*(i)[Z] + (m)[11]*(i)[W]; \
1732 (o)[W]=(m)[12]*(i)[X] + (m)[13]*(i)[Y] + (m)[14]*(i)[Z] + (m)[15]*(i)[W]; \
1740#define MAT4X3VEC(o, m, i) do { \
1742 _f = 1.0/((m)[15]); \
1743 (o)[X] = ((m)[0]*(i)[X] + (m)[1]*(i)[Y] + (m)[ 2]*(i)[Z]) * _f; \
1744 (o)[Y] = ((m)[4]*(i)[X] + (m)[5]*(i)[Y] + (m)[ 6]*(i)[Z]) * _f; \
1745 (o)[Z] = ((m)[8]*(i)[X] + (m)[9]*(i)[Y] + (m)[10]*(i)[Z]) * _f; \
1748#define MAT4XSCALAR(o, m, i) do { \
1749 (o) = (i) / (m)[15]; \
1756#define VEC3X4MAT(o, i, m) do { \
1758 _f = 1.0/((m)[15]); \
1759 (o)[X] = ((i)[X]*(m)[0] + (i)[Y]*(m)[4] + (i)[Z]*(m)[8]) * _f; \
1760 (o)[Y] = ((i)[X]*(m)[1] + (i)[Y]*(m)[5] + (i)[Z]*(m)[9]) * _f; \
1761 (o)[Z] = ((i)[X]*(m)[2] + (i)[Y]*(m)[6] + (i)[Z]*(m)[10]) * _f; \
1765#define VEC2X4MAT(o, i, m) do { \
1767 _f = 1.0/((m)[15]); \
1768 (o)[X] = ((i)[X]*(m)[0] + (i)[Y]*(m)[4]) * _f; \
1769 (o)[Y] = ((i)[X]*(m)[1] + (i)[Y]*(m)[5]) * _f; \
1770 (o)[Z] = ((i)[X]*(m)[2] + (i)[Y]*(m)[6]) * _f; \
1778#define V_MIN(r, s) if ((r) > (s)) r = (s)
1780#define V_MAX(r, s) if ((r) < (s)) r = (s)
1785#define VMIN(r, s) do { \
1786 V_MIN((r)[X], (s)[X]); V_MIN((r)[Y], (s)[Y]); V_MIN((r)[Z], (s)[Z]); \
1792#define VMAX(r, s) do { \
1793 V_MAX((r)[X], (s)[X]); V_MAX((r)[Y], (s)[Y]); V_MAX((r)[Z], (s)[Z]); \
1799#define VMINMAX(min, max, pt) do { \
1800 VMIN((min), (pt)); VMAX((max), (pt)); \
1808#define V2MIN(r, s) do { \
1809 V_MIN((r)[X], (s)[X]); V_MIN((r)[Y], (s)[Y]); \
1812#define V2MAX(r, s) do { \
1813 V_MAX((r)[X], (s)[X]); V_MAX((r)[Y], (s)[Y]); \
1816#define V2MINMAX(min, max, pt) do { \
1817 V2MIN((min), (pt)); V2MAX((max), (pt)); \
1824#define CLAMP(_v, _l, _h) do { \
1825 V_MAX((_v), (_l)); else V_MIN((_v), (_h)); \
1831#define VCLAMP(_v, _l, _h) do { \
1832 CLAMP(_v[X], _l, _h); \
1833 CLAMP(_v[Y], _l, _h); \
1834 CLAMP(_v[Z], _l, _h); \
1840#define V2CLAMP(_v, _l, _h) do { \
1841 CLAMP(_v[X], _l, _h); \
1842 CLAMP(_v[Y], _l, _h); \
1848#define HCLAMP(_v, _l, _h) do { \
1849 CLAMP(_v[X], _l, _h); \
1850 CLAMP(_v[Y], _l, _h); \
1851 CLAMP(_v[Z], _l, _h); \
1852 CLAMP(_v[W], _l, _h); \
1860#define HDIVIDE(o, v) do { \
1861 if (NEAR_ZERO((v)[W], SMALL_FASTF)) { \
1862 HSETALL((o), 0.0); \
1864 (o)[X] = (v)[X] / (v)[W]; \
1865 (o)[Y] = (v)[Y] / (v)[W]; \
1866 (o)[Z] = (v)[Z] / (v)[W]; \
1894#define QUAT_FROM_ROT(q, r, x, y, z) do { \
1895 fastf_t _rot = (r) * 0.5; \
1896 QSET(q, x, y, z, cos(_rot)); \
1899 VSCALE(q, q, _rot); \
1902#define QUAT_FROM_VROT(q, r, v) do { \
1903 fastf_t _rot = (r) * 0.5; \
1906 (q)[W] = cos(_rot); \
1908 VSCALE(q, q, _rot); \
1911#define QUAT_FROM_VROT_DEG(q, r, v) \
1912 QUAT_FROM_VROT(q, ((r)*DEG2RAD), v)
1914#define QUAT_FROM_ROT_DEG(q, r, x, y, z) \
1915 QUAT_FROM_ROT(q, ((r)*DEG2RAD), x, y, z)
1922#define QSET(a, b, c, d, e) do { \
1930#define QMOVE(a, b) do { \
1938#define QADD2(a, b, c) do { \
1939 (a)[X] = (b)[X] + (c)[X]; \
1940 (a)[Y] = (b)[Y] + (c)[Y]; \
1941 (a)[Z] = (b)[Z] + (c)[Z]; \
1942 (a)[W] = (b)[W] + (c)[W]; \
1949#define QSUB2(a, b, c) do { \
1950 (a)[X] = (b)[X] - (c)[X]; \
1951 (a)[Y] = (b)[Y] - (c)[Y]; \
1952 (a)[Z] = (b)[Z] - (c)[Z]; \
1953 (a)[W] = (b)[W] - (c)[W]; \
1959#define QSCALE(a, b, c) do { \
1960 (a)[X] = (b)[X] * (c); \
1961 (a)[Y] = (b)[Y] * (c); \
1962 (a)[Z] = (b)[Z] * (c); \
1963 (a)[W] = (b)[W] * (c); \
1969#define QUNITIZE(a) do { \
1971 _f = QMAGNITUDE(a); \
1972 if (_f < VDIVIDE_TOL) _f = 0.0; else _f = 1.0/_f; \
1973 (a)[X] *= _f; (a)[Y] *= _f; (a)[Z] *= _f; (a)[W] *= _f; \
1978 ((a)[X]*(a)[X] + (a)[Y]*(a)[Y] \
1979 + (a)[Z]*(a)[Z] + (a)[W]*(a)[W])
1982#define QMAGNITUDE(a) sqrt(QMAGSQ(a))
1986 ((a)[X]*(b)[X] + (a)[Y]*(b)[Y] \
1987 + (a)[Z]*(b)[Z] + (a)[W]*(b)[W])
1996#define QMUL(a, b, c) do { \
1997 (a)[W] = (b)[W]*(c)[W] - (b)[X]*(c)[X] - (b)[Y]*(c)[Y] - (b)[Z]*(c)[Z]; \
1998 (a)[X] = (b)[W]*(c)[X] + (b)[X]*(c)[W] + (b)[Y]*(c)[Z] - (b)[Z]*(c)[Y]; \
1999 (a)[Y] = (b)[W]*(c)[Y] + (b)[Y]*(c)[W] + (b)[Z]*(c)[X] - (b)[X]*(c)[Z]; \
2000 (a)[Z] = (b)[W]*(c)[Z] + (b)[Z]*(c)[W] + (b)[X]*(c)[Y] - (b)[Y]*(c)[X]; \
2004#define QCONJUGATE(a, b) do { \
2014#define QINVERSE(a, b) do { \
2015 double _f = QMAGSQ(b); \
2016 if (_f < VDIVIDE_TOL) _f = 0.0; else _f = 1.0/_f; \
2017 (a)[X] = -(b)[X] * _f; \
2018 (a)[Y] = -(b)[Y] * _f; \
2019 (a)[Z] = -(b)[Z] * _f; \
2020 (a)[W] = (b)[W] * _f; \
2029#define QBLEND2(a, b, c, d, e) do { \
2030 (a)[X] = (b) * (c)[X] + (d) * (e)[X]; \
2031 (a)[Y] = (b) * (c)[Y] + (d) * (e)[Y]; \
2032 (a)[Z] = (b) * (c)[Z] + (d) * (e)[Z]; \
2033 (a)[W] = (b) * (c)[W] + (d) * (e)[W]; \
2046#define V3RPP_DISJOINT(_l1, _h1, _l2, _h2) \
2047 ((_l1)[X] > (_h2)[X] || (_l1)[Y] > (_h2)[Y] || (_l1)[Z] > (_h2)[Z] || \
2048 (_l2)[X] > (_h1)[X] || (_l2)[Y] > (_h1)[Y] || (_l2)[Z] > (_h1)[Z])
2054#define V3RPP_DISJOINT_TOL(_l1, _h1, _l2, _h2, _t) \
2055 ((_l1)[X] > (_h2)[X] + (_t) || \
2056 (_l1)[Y] > (_h2)[Y] + (_t) || \
2057 (_l1)[Z] > (_h2)[Z] + (_t) || \
2058 (_l2)[X] > (_h1)[X] + (_t) || \
2059 (_l2)[Y] > (_h1)[Y] + (_t) || \
2060 (_l2)[Z] > (_h1)[Z] + (_t))
2063#define V3RPP_OVERLAP(_l1, _h1, _l2, _h2) \
2064 (! ((_l1)[X] > (_h2)[X] || (_l1)[Y] > (_h2)[Y] || (_l1)[Z] > (_h2)[Z] || \
2065 (_l2)[X] > (_h1)[X] || (_l2)[Y] > (_h1)[Y] || (_l2)[Z] > (_h1)[Z]))
2071#define V3RPP_OVERLAP_TOL(_l1, _h1, _l2, _h2, _t) \
2072 (! ((_l1)[X] > (_h2)[X] + (_t) || \
2073 (_l1)[Y] > (_h2)[Y] + (_t) || \
2074 (_l1)[Z] > (_h2)[Z] + (_t) || \
2075 (_l2)[X] > (_h1)[X] + (_t) || \
2076 (_l2)[Y] > (_h1)[Y] + (_t) || \
2077 (_l2)[Z] > (_h1)[Z] + (_t)))
2084#define V3PNT_IN_RPP(_pt, _lo, _hi) (\
2085 (_pt)[X] >= (_lo)[X] && (_pt)[X] <= (_hi)[X] && \
2086 (_pt)[Y] >= (_lo)[Y] && (_pt)[Y] <= (_hi)[Y] && \
2087 (_pt)[Z] >= (_lo)[Z] && (_pt)[Z] <= (_hi)[Z])
2094#define V3PNT_IN_RPP_TOL(_pt, _lo, _hi, _t) (\
2095 (_pt)[X] >= (_lo)[X]-(_t) && (_pt)[X] <= (_hi)[X]+(_t) && \
2096 (_pt)[Y] >= (_lo)[Y]-(_t) && (_pt)[Y] <= (_hi)[Y]+(_t) && \
2097 (_pt)[Z] >= (_lo)[Z]-(_t) && (_pt)[Z] <= (_hi)[Z]+(_t))
2103#define V3PNT_OUT_RPP_TOL(_pt, _lo, _hi, _t) (\
2104 (_pt)[X] < (_lo)[X]-(_t) || (_pt)[X] > (_hi)[X]+(_t) || \
2105 (_pt)[Y] < (_lo)[Y]-(_t) || (_pt)[Y] > (_hi)[Y]+(_t) || \
2106 (_pt)[Z] < (_lo)[Z]-(_t) || (_pt)[Z] > (_hi)[Z]+(_t))
2114#define V3RPP1_IN_RPP2(_lo1, _hi1, _lo2, _hi2) (\
2115 (_lo1)[X] >= (_lo2)[X] && (_hi1)[X] <= (_hi2)[X] && \
2116 (_lo1)[Y] >= (_lo2)[Y] && (_hi1)[Y] <= (_hi2)[Y] && \
2117 (_lo1)[Z] >= (_lo2)[Z] && (_hi1)[Z] <= (_hi2)[Z])
2121#define VSWAP(_a, _b) do { \
2124 (_a)[X] = (_b)[X]; \
2127 (_a)[Y] = (_b)[Y]; \
2130 (_a)[Z] = (_b)[Z]; \
2135#define V2SWAP(_a, _b) do { \
2138 (_a)[X] = (_b)[X]; \
2141 (_a)[Y] = (_b)[Y]; \
2146#define HSWAP(_a, _b) do { \
2149 (_a)[X] = (_b)[X]; \
2152 (_a)[Y] = (_b)[Y]; \
2155 (_a)[Z] = (_b)[Z]; \
2158 (_a)[W] = (_b)[W]; \
2163#define MAT_SWAP(_a, _b) do { \
2165 MAT_COPY(_t, (_a)); \
2166 MAT_COPY((_a), (_b)); \
2167 MAT_COPY((_b), _t); \
2178#define VINITALL(_v) {(_v), (_v), (_v)}
2186#define V2INITALL(_v) {(_v), (_v)}
2194#define HINITALL(_v) {(_v), (_v), (_v), (_v)}
2202#define VINIT_ZERO {0.0, 0.0, 0.0}
2210#define V2INIT_ZERO {0.0, 0.0}
2218#define HINIT_ZERO {0.0, 0.0, 0.0, 0.0}
2225#define HINIT_IDN {0.0, 0.0, 0.0, 1.0}
2232#define MAT_INIT_ZERO {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}
2239#define MAT_INIT_IDN {1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0}
Header file for the BRL-CAD common definitions.
fastf_t * pointp_t
pointer to a 3-tuple point
fastf_t vect_t[ELEMENTS_PER_VECT]
3-tuple vector
fastf_t * point2dp_t
pointer to a 2-tuple point
double fastf_t
fastest 64-bit (or larger) floating point type
#define ELEMENTS_PER_POINT
number of fastf_t's per point_t
fastf_t mat_t[ELEMENTS_PER_MAT]
4x4 matrix
fastf_t hvect_t[ELEMENTS_PER_HVECT]
4-tuple vector
enum vmath_matrix_component_ vmath_matrix_component
#define ELEMENTS_PER_PLANE
number of fastf_t's per plane_t
fastf_t point2d_t[ELEMENTS_PER_POINT2D]
2-tuple point
#define ELEMENTS_PER_HVECT
number of fastf_t's per hvect_t (homogeneous vector)
fastf_t * vect2dp_t
pointer to a 2-tuple vector
#define ELEMENTS_PER_POINT2D
number of fastf_t's per point2d_t
#define ELEMENTS_PER_VECT2D
number of fastf_t's per vect2d_t
fastf_t hpoint_t[ELEMENTS_PER_HPOINT]
4-tuple point
fastf_t plane_t[ELEMENTS_PER_PLANE]
Definition of a plane equation.
fastf_t * matp_t
pointer to a 4x4 matrix
#define ELEMENTS_PER_HPOINT
number of fastf_t's per hpt_t (homogeneous point)
fastf_t point_t[ELEMENTS_PER_POINT]
3-tuple point
#define ELEMENTS_PER_VECT
number of fastf_t's per vect_t
hvect_t quat_t
4-element quaternion
fastf_t * vectp_t
pointer to a 3-tuple vector
#define ELEMENTS_PER_MAT
number of fastf_t's per mat_t
fastf_t vect2d_t[ELEMENTS_PER_VECT2D]
2-tuple vector
enum vmath_vector_component_ vmath_vector_component