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_MAT (ELEMENTS_PER_PLANE*ELEMENTS_PER_PLANE)
421#define INVALID(n) (!((n) > -INFINITY && (n) < INFINITY))
427#define VINVALID(v) (INVALID((v)[X]) || INVALID((v)[Y]) || INVALID((v)[Z]))
433#define V2INVALID(v) (INVALID((v)[X]) || INVALID((v)[Y]))
439#define HINVALID(v) (INVALID((v)[X]) || INVALID((v)[Y]) || INVALID((v)[Z]) || INVALID((v)[W]))
445#ifdef KEITH_WANTS_THIS
457# define NEAR_ZERO(val, epsilon) (!(((val) < -epsilon) || ((val) > epsilon)))
458# define NEAR_ZERO(val, epsilon) (!(((val) < -epsilon)) && !(((val) > epsilon)))
460# define NEAR_ZERO(val, epsilon) (((val) > -epsilon) && ((val) < epsilon))
467#define VNEAR_ZERO(v, tol) \
468 (NEAR_ZERO(v[X], tol) \
469 && NEAR_ZERO(v[Y], tol) \
470 && NEAR_ZERO(v[Z], tol))
476#define V2NEAR_ZERO(v, tol) (NEAR_ZERO(v[X], tol) && NEAR_ZERO(v[Y], tol))
482#define HNEAR_ZERO(v, tol) \
483 (NEAR_ZERO(v[X], tol) \
484 && NEAR_ZERO(v[Y], tol) \
485 && NEAR_ZERO(v[Z], tol) \
486 && NEAR_ZERO(h[W], tol))
493#define ZERO(_a) NEAR_ZERO((_a), SMALL_FASTF)
499#define VZERO(_a) VNEAR_ZERO((_a), SMALL_FASTF)
505#define V2ZERO(_a) V2NEAR_ZERO((_a), SMALL_FASTF)
511#define HZERO(_a) HNEAR_ZERO((_a), SMALL_FASTF)
518#define NEAR_EQUAL(_a, _b, _tol) NEAR_ZERO((_a) - (_b), (_tol))
524#define VNEAR_EQUAL(_a, _b, _tol) \
525 (NEAR_EQUAL((_a)[X], (_b)[X], (_tol)) \
526 && NEAR_EQUAL((_a)[Y], (_b)[Y], (_tol)) \
527 && NEAR_EQUAL((_a)[Z], (_b)[Z], (_tol)))
533#define V2NEAR_EQUAL(a, b, tol) \
534 (NEAR_EQUAL((a)[X], (b)[X], tol) \
535 && NEAR_EQUAL((a)[Y], (b)[Y], tol))
541#define HNEAR_EQUAL(_a, _b, _tol) \
542 (NEAR_EQUAL((_a)[X], (_b)[X], (_tol)) \
543 && NEAR_EQUAL((_a)[Y], (_b)[Y], (_tol)) \
544 && NEAR_EQUAL((_a)[Z], (_b)[Z], (_tol)) \
545 && NEAR_EQUAL((_a)[W], (_b)[W], (_tol)))
551#define EQUAL(_a, _b) NEAR_EQUAL((_a), (_b), SMALL_FASTF)
558#define VEQUAL(_a, _b) VNEAR_EQUAL((_a), (_b), SMALL_FASTF)
564#define V2EQUAL(_a, _b) V2NEAR_EQUAL((_a), (_b), SMALL_FASTF)
570#define HEQUAL(_a, _b) HNEAR_EQUAL((_a), (_b), SMALL_FASTF)
574#define DIST_PNT_PLANE(_pt, _pl) (VDOT(_pt, _pl) - (_pl)[W])
577#define DIST_PNT_PNT_SQ(_a, _b) \
578 ((_a)[X]-(_b)[X])*((_a)[X]-(_b)[X]) + \
579 ((_a)[Y]-(_b)[Y])*((_a)[Y]-(_b)[Y]) + \
580 ((_a)[Z]-(_b)[Z])*((_a)[Z]-(_b)[Z])
581#define DIST_PNT_PNT(_a, _b) sqrt(DIST_PNT_PNT_SQ(_a, _b))
584#define DIST_PNT2_PNT2_SQ(_a, _b) \
585 ((_a)[X]-(_b)[X])*((_a)[X]-(_b)[X]) + \
586 ((_a)[Y]-(_b)[Y])*((_a)[Y]-(_b)[Y])
587#define DIST_PNT2_PNT2(_a, _b) sqrt(DIST_PNT2_PNT2_SQ(_a, _b))
590#define MAT_DELTAS(_m, _x, _y, _z) do { \
597#define MAT_DELTAS_VEC(_m, _v) \
598 MAT_DELTAS(_m, (_v)[X], (_v)[Y], (_v)[Z])
604#define MAT_DELTAS_VEC_NEG(_m, _v) \
605 MAT_DELTAS(_m, -(_v)[X], -(_v)[Y], -(_v)[Z])
608#define MAT_DELTAS_GET(_v, _m) do { \
609 (_v)[X] = (_m)[MDX]; \
610 (_v)[Y] = (_m)[MDY]; \
611 (_v)[Z] = (_m)[MDZ]; \
618#define MAT_DELTAS_GET_NEG(_v, _m) do { \
619 (_v)[X] = -(_m)[MDX]; \
620 (_v)[Y] = -(_m)[MDY]; \
621 (_v)[Z] = -(_m)[MDZ]; \
628#define MAT_DELTAS_ADD(_m, _x, _y, _z) do { \
638#define MAT_DELTAS_ADD_VEC(_m, _v) do { \
639 (_m)[MDX] += (_v)[X]; \
640 (_m)[MDY] += (_v)[Y]; \
641 (_m)[MDZ] += (_v)[Z]; \
648#define MAT_DELTAS_SUB(_m, _x, _y, _z) do { \
658#define MAT_DELTAS_SUB_VEC(_m, _v) do { \
659 (_m)[MDX] -= (_v)[X]; \
660 (_m)[MDY] -= (_v)[Y]; \
661 (_m)[MDZ] -= (_v)[Z]; \
668#define MAT_DELTAS_MUL(_m, _x, _y, _z) do { \
678#define MAT_DELTAS_MUL_VEC(_m, _v) do { \
679 (_m)[MDX] *= (_v)[X]; \
680 (_m)[MDY] *= (_v)[Y]; \
681 (_m)[MDZ] *= (_v)[Z]; \
685#define MAT_SCALE(_m, _x, _y, _z) do { \
692#define MAT_SCALE_VEC(_m, _v) do { \
693 (_m)[MSX] = (_v)[X]; \
694 (_m)[MSY] = (_v)[Y]; \
695 (_m)[MSZ] = (_v)[Z]; \
699#define MAT_SCALE_ALL(_m, _s) (_m)[MSA] = (_s)
702#define MAT_SCALE_ADD(_m, _x, _y, _z) do { \
709#define MAT_SCALE_ADD_VEC(_m, _v) do { \
710 (_m)[MSX] += (_v)[X]; \
711 (_m)[MSY] += (_v)[Y]; \
712 (_m)[MSZ] += (_v)[Z]; \
716#define MAT_SCALE_SUB(_m, _x, _y, _z) do { \
726#define MAT_SCALE_SUB_VEC(_m, _v) do { \
727 (_m)[MSX] -= (_v)[X]; \
728 (_m)[MSY] -= (_v)[Y]; \
729 (_m)[MSZ] -= (_v)[Z]; \
733#define MAT_SCALE_MUL(_m, _x, _y, _z) do { \
740#define MAT_SCALE_MUL_VEC(_m, _v) do { \
741 (_m)[MSX] *= (_v)[X]; \
742 (_m)[MSY] *= (_v)[Y]; \
743 (_m)[MSZ] *= (_v)[Z]; \
754#define MAT_ZERO(m) do { \
755 (m)[0] = (m)[1] = (m)[2] = (m)[3] = \
756 (m)[4] = (m)[5] = (m)[6] = (m)[7] = \
757 (m)[8] = (m)[9] = (m)[10] = (m)[11] = \
758 (m)[12] = (m)[13] = (m)[14] = (m)[15] = 0.0; \
762#define MAT_IDN(m) do { \
763 (m)[1] = (m)[2] = (m)[3] = (m)[4] = \
764 (m)[6] = (m)[7] = (m)[8] = (m)[9] = \
765 (m)[11] = (m)[12] = (m)[13] = (m)[14] = 0.0; \
766 (m)[0] = (m)[5] = (m)[10] = (m)[15] = 1.0; \
775#define MAT_TRANSPOSE(t, m) do { \
795#define MAT_COPY(c, m) do { \
815#define VSET(o, a, b, c) do { \
822#define V2SET(o, a, b) do { \
828#define HSET(o, a, b, c, d) do { \
837#define VSETALL(v, s) do { \
838 (v)[X] = (v)[Y] = (v)[Z] = (s); \
842#define V2SETALL(v, s) do { \
843 (v)[X] = (v)[Y] = (s); \
847#define HSETALL(v, s) do { \
848 (v)[X] = (v)[Y] = (v)[Z] = (v)[W] = (s); \
853#define VSETALLN(v, s, n) do { \
855 for (_j=0; _j < (size_t)(n); _j++) v[_j]=(s); \
860#define VMOVE(o, v) do { \
867#define V2MOVE(o, v) do { \
873#define HMOVE(o, v) do { \
881#define VMOVEN(o, v, n) do { \
883 for (_vmove = 0; _vmove < (size_t)(n); _vmove++) { \
884 (o)[_vmove] = (v)[_vmove]; \
894#define VREVERSE(o, v) do { \
905#define V2REVERSE(o, v) do { \
916#define HREVERSE(o, v) do { \
924#define VADD2(o, a, b) do { \
925 (o)[X] = (a)[X] + (b)[X]; \
926 (o)[Y] = (a)[Y] + (b)[Y]; \
927 (o)[Z] = (a)[Z] + (b)[Z]; \
931#define V2ADD2(o, a, b) do { \
932 (o)[X] = (a)[X] + (b)[X]; \
933 (o)[Y] = (a)[Y] + (b)[Y]; \
937#define HADD2(o, a, b) do { \
938 (o)[X] = (a)[X] + (b)[X]; \
939 (o)[Y] = (a)[Y] + (b)[Y]; \
940 (o)[Z] = (a)[Z] + (b)[Z]; \
941 (o)[W] = (a)[W] + (b)[W]; \
948#define VADD2N(o, a, b, n) do { \
950 for (_vadd2 = 0; _vadd2 < (size_t)(n); _vadd2++) { \
951 (o)[_vadd2] = (a)[_vadd2] + (b)[_vadd2]; \
960#define VSUB2(o, a, b) do { \
961 (o)[X] = (a)[X] - (b)[X]; \
962 (o)[Y] = (a)[Y] - (b)[Y]; \
963 (o)[Z] = (a)[Z] - (b)[Z]; \
970#define V2SUB2(o, a, b) do { \
971 (o)[X] = (a)[X] - (b)[X]; \
972 (o)[Y] = (a)[Y] - (b)[Y]; \
979#define HSUB2(o, a, b) do { \
980 (o)[X] = (a)[X] - (b)[X]; \
981 (o)[Y] = (a)[Y] - (b)[Y]; \
982 (o)[Z] = (a)[Z] - (b)[Z]; \
983 (o)[W] = (a)[W] - (b)[W]; \
990#define VSUB2N(o, a, b, n) do { \
992 for (_vsub2 = 0; _vsub2 < (size_t)(n); _vsub2++) { \
993 (o)[_vsub2] = (a)[_vsub2] - (b)[_vsub2]; \
999#define VSUB3(o, a, b, c) do { \
1000 (o)[X] = (a)[X] - (b)[X] - (c)[X]; \
1001 (o)[Y] = (a)[Y] - (b)[Y] - (c)[Y]; \
1002 (o)[Z] = (a)[Z] - (b)[Z] - (c)[Z]; \
1006#define V2SUB3(o, a, b, c) do { \
1007 (o)[X] = (a)[X] - (b)[X] - (c)[X]; \
1008 (o)[Y] = (a)[Y] - (b)[Y] - (c)[Y]; \
1012#define HSUB3(o, a, b, c) do { \
1013 (o)[X] = (a)[X] - (b)[X] - (c)[X]; \
1014 (o)[Y] = (a)[Y] - (b)[Y] - (c)[Y]; \
1015 (o)[Z] = (a)[Z] - (b)[Z] - (c)[Z]; \
1016 (o)[W] = (a)[W] - (b)[W] - (c)[W]; \
1020#define VSUB3N(o, a, b, c, n) do { \
1022 for (_vsub3 = 0; _vsub3 < (size_t)(n); _vsub3++) { \
1023 (o)[_vsub3] = (a)[_vsub3] - (b)[_vsub3] - (c)[_vsub3]; \
1029#define VADD3(o, a, b, c) do { \
1030 (o)[X] = (a)[X] + (b)[X] + (c)[X]; \
1031 (o)[Y] = (a)[Y] + (b)[Y] + (c)[Y]; \
1032 (o)[Z] = (a)[Z] + (b)[Z] + (c)[Z]; \
1036#define V2ADD3(o, a, b, c) do { \
1037 (o)[X] = (a)[X] + (b)[X] + (c)[X]; \
1038 (o)[Y] = (a)[Y] + (b)[Y] + (c)[Y]; \
1042#define HADD3(o, a, b, c) do { \
1043 (o)[X] = (a)[X] + (b)[X] + (c)[X]; \
1044 (o)[Y] = (a)[Y] + (b)[Y] + (c)[Y]; \
1045 (o)[Z] = (a)[Z] + (b)[Z] + (c)[Z]; \
1046 (o)[W] = (a)[W] + (b)[W] + (c)[W]; \
1053#define VADD3N(o, a, b, c, n) do { \
1055 for (_vadd3 = 0; _vadd3 < (size_t)(n); _vadd3++) { \
1056 (o)[_vadd3] = (a)[_vadd3] + (b)[_vadd3] + (c)[_vadd3]; \
1065#define VADD4(o, a, b, c, d) do { \
1066 (o)[X] = (a)[X] + (b)[X] + (c)[X] + (d)[X]; \
1067 (o)[Y] = (a)[Y] + (b)[Y] + (c)[Y] + (d)[Y]; \
1068 (o)[Z] = (a)[Z] + (b)[Z] + (c)[Z] + (d)[Z]; \
1075#define V2ADD4(o, a, b, c, d) do { \
1076 (o)[X] = (a)[X] + (b)[X] + (c)[X] + (d)[X]; \
1077 (o)[Y] = (a)[Y] + (b)[Y] + (c)[Y] + (d)[Y]; \
1084#define HADD4(o, a, b, c, d) do { \
1085 (o)[X] = (a)[X] + (b)[X] + (c)[X] + (d)[X]; \
1086 (o)[Y] = (a)[Y] + (b)[Y] + (c)[Y] + (d)[Y]; \
1087 (o)[Z] = (a)[Z] + (b)[Z] + (c)[Z] + (d)[Z]; \
1088 (o)[W] = (a)[W] + (b)[W] + (c)[W] + (d)[W]; \
1095#define VADD4N(o, a, b, c, d, n) do { \
1097 for (_vadd4 = 0; _vadd4 < (size_t)(n); _vadd4++) { \
1098 (o)[_vadd4] = (a)[_vadd4] + (b)[_vadd4] + (c)[_vadd4] + (d)[_vadd4]; \
1104#define VSCALE(o, v, s) do { \
1105 (o)[X] = (v)[X] * (s); \
1106 (o)[Y] = (v)[Y] * (s); \
1107 (o)[Z] = (v)[Z] * (s); \
1111#define V2SCALE(o, v, s) do { \
1112 (o)[X] = (v)[X] * (s); \
1113 (o)[Y] = (v)[Y] * (s); \
1117#define HSCALE(o, v, s) do { \
1118 (o)[X] = (v)[X] * (s); \
1119 (o)[Y] = (v)[Y] * (s); \
1120 (o)[Z] = (v)[Z] * (s); \
1121 (o)[W] = (v)[W] * (s); \
1128#define VSCALEN(o, v, s, n) do { \
1130 for (_vscale = 0; _vscale < (size_t)(n); _vscale++) { \
1131 (o)[_vscale] = (v)[_vscale] * (s); \
1136#define VUNITIZE(v) do { \
1137 double _f = MAGSQ(v); \
1138 if (! NEAR_EQUAL(_f, 1.0, VUNITIZE_TOL)) { \
1140 if (_f < VDIVIDE_TOL) { \
1141 VSETALL((v), 0.0); \
1144 (v)[X] *= _f; (v)[Y] *= _f; (v)[Z] *= _f; \
1150#define V2UNITIZE(v) do { \
1151 double _f = MAG2SQ(v); \
1152 if (! NEAR_EQUAL(_f, 1.0, VUNITIZE_TOL)) { \
1154 if (_f < VDIVIDE_TOL) { \
1155 V2SETALL((v), 0.0); \
1158 (v)[X] *= _f; (v)[Y] *= _f; \
1167#define VADD2SCALE(o, a, b, s) do { \
1168 (o)[X] = ((a)[X] + (b)[X]) * (s); \
1169 (o)[Y] = ((a)[Y] + (b)[Y]) * (s); \
1170 (o)[Z] = ((a)[Z] + (b)[Z]) * (s); \
1177#define VADD2SCALEN(o, a, b, s, n) do { \
1178 size_t _vadd2scale; \
1179 for (_vadd2scale = 0; \
1180 _vadd2scale < (size_t)(n); \
1182 (o)[_vadd2scale] = ((a)[_vadd2scale] + (b)[_vadd2scale]) * (s); \
1190#define VSUB2SCALE(o, a, b, s) do { \
1191 (o)[X] = ((a)[X] - (b)[X]) * (s); \
1192 (o)[Y] = ((a)[Y] - (b)[Y]) * (s); \
1193 (o)[Z] = ((a)[Z] - (b)[Z]) * (s); \
1200#define VSUB2SCALEN(o, a, b, s, n) do { \
1201 size_t _vsub2scale; \
1202 for (_vsub2scale = 0; \
1203 _vsub2scale < (size_t)(n); \
1205 (o)[_vsub2scale] = ((a)[_vsub2scale] - (b)[_vsub2scale]) * (s); \
1212#define VCOMB2(o, sa, va, sb, vb) do { \
1213 (o)[X] = (sa) * (va)[X] + (sb) * (vb)[X]; \
1214 (o)[Y] = (sa) * (va)[Y] + (sb) * (vb)[Y]; \
1215 (o)[Z] = (sa) * (va)[Z] + (sb) * (vb)[Z]; \
1222#define VCOMB2N(o, sa, a, sb, b, n) do { \
1225 _vcomb2 < (size_t)(n); \
1227 (o)[_vcomb2] = (sa) * (va)[_vcomb2] + (sb) * (vb)[_vcomb2]; \
1234#define VJOIN3(o, a, sb, b, sc, c, sd, d) do { \
1235 (o)[X] = (a)[X] + (sb)*(b)[X] + (sc)*(c)[X] + (sd)*(d)[X]; \
1236 (o)[Y] = (a)[Y] + (sb)*(b)[Y] + (sc)*(c)[Y] + (sd)*(d)[Y]; \
1237 (o)[Z] = (a)[Z] + (sb)*(b)[Z] + (sc)*(c)[Z] + (sd)*(d)[Z]; \
1247#define VJOIN2(o, a, sb, b, sc, c) do { \
1248 (o)[X] = (a)[X] + (sb) * (b)[X] + (sc) * (c)[X]; \
1249 (o)[Y] = (a)[Y] + (sb) * (b)[Y] + (sc) * (c)[Y]; \
1250 (o)[Z] = (a)[Z] + (sb) * (b)[Z] + (sc) * (c)[Z]; \
1259#define V2JOIN2(o, a, sb, b, sc, c) do { \
1260 (o)[X] = (a)[X] + (sb) * (b)[X] + (sc) * (c)[X]; \
1261 (o)[Y] = (a)[Y] + (sb) * (b)[Y] + (sc) * (c)[Y]; \
1270#define HJOIN2(o, a, sb, b, sc, c) do { \
1271 (o)[X] = (a)[X] + (sb) * (b)[X] + (sc) * (c)[X]; \
1272 (o)[Y] = (a)[Y] + (sb) * (b)[Y] + (sc) * (c)[Y]; \
1273 (o)[Z] = (a)[Z] + (sb) * (b)[Z] + (sc) * (c)[Z]; \
1274 (o)[W] = (a)[W] + (sb) * (b)[W] + (sc) * (c)[W]; \
1277#define VJOIN2N(o, a, sb, b, sc, c, n) do { \
1280 _vjoin2 < (size_t)(n); \
1282 (o)[_vjoin2] = (a)[_vjoin2] + (sb) * (b)[_vjoin2] + (sc) * (c)[_vjoin2]; \
1294#define VJOIN1(o, a, sb, b) do { \
1295 (o)[X] = (a)[X] + (sb) * (b)[X]; \
1296 (o)[Y] = (a)[Y] + (sb) * (b)[Y]; \
1297 (o)[Z] = (a)[Z] + (sb) * (b)[Z]; \
1307#define V2JOIN1(o, a, sb, b) do { \
1308 (o)[X] = (a)[X] + (sb) * (b)[X]; \
1309 (o)[Y] = (a)[Y] + (sb) * (b)[Y]; \
1319#define HJOIN1(o, a, sb, b) do { \
1320 (o)[X] = (a)[X] + (sb) * (b)[X]; \
1321 (o)[Y] = (a)[Y] + (sb) * (b)[Y]; \
1322 (o)[Z] = (a)[Z] + (sb) * (b)[Z]; \
1323 (o)[W] = (a)[W] + (sb) * (b)[W]; \
1333#define VJOIN1N(o, a, sb, b, n) do { \
1336 _vjoin1 < (size_t)(n); \
1338 (o)[_vjoin1] = (a)[_vjoin1] + (sb) * (b)[_vjoin1]; \
1348#define VBLEND2(o, sa, a, sb, b) do { \
1349 (o)[X] = (sa) * (a)[X] + (sb) * (b)[X]; \
1350 (o)[Y] = (sa) * (a)[Y] + (sb) * (b)[Y]; \
1351 (o)[Z] = (sa) * (a)[Z] + (sb) * (b)[Z]; \
1359#define VBLEND2N(o, sa, a, sb, b, n) do { \
1361 for (_vblend2 = 0; \
1362 _vblend2 < (size_t)(n); \
1364 (b)[_vblend2] = (sa) * (a)[_vblend2] + (sb) * (b)[_vblend2]; \
1376#define VPROJECT(a, b, c, d) do { \
1377 VSCALE(c, b, VDOT(a, b) / VDOT(b, b)); \
1382#define MAGSQ(v) ((v)[X]*(v)[X] + (v)[Y]*(v)[Y] + (v)[Z]*(v)[Z])
1383#define MAG2SQ(v) ((v)[X]*(v)[X] + (v)[Y]*(v)[Y])
1390#define MAGNITUDE(v) sqrt(MAGSQ(v))
1396#define MAGNITUDE2(v) sqrt(MAG2SQ(v))
1413#define VCROSS(o, a, b) do { \
1414 (o)[X] = (a)[Y] * (b)[Z] - (a)[Z] * (b)[Y]; \
1415 (o)[Y] = (a)[Z] * (b)[X] - (a)[X] * (b)[Z]; \
1416 (o)[Z] = (a)[X] * (b)[Y] - (a)[Y] * (b)[X]; \
1424#define V2CROSS(a, b) ((a)[X] * (b)[Y] - (a)[Y] * (b)[X])
1429#define HCROSS(a, b, c)
1433#define VDOT(a, b) ((a)[X]*(b)[X] + (a)[Y]*(b)[Y] + (a)[Z]*(b)[Z])
1435#define V2DOT(a, b) ((a)[X]*(b)[X] + (a)[Y]*(b)[Y])
1437#define HDOT(a, b) ((a)[X]*(b)[X] + (a)[Y]*(b)[Y] + (a)[Z]*(b)[Z] + (a)[W]*(b)[W])
1449#define VLERP(o, a, b, t) do { \
1450 (o)[X] = (a)[X] * (1 - (t)) + (b)[X] * (t); \
1451 (o)[Y] = (a)[Y] * (1 - (t)) + (b)[Y] * (t); \
1452 (o)[Z] = (a)[Z] * (1 - (t)) + (b)[Z] * (t); \
1464#define V2LERP(o, a, b, t) do { \
1465 (o)[X] = (a)[X] * (1 - (t)) + (b)[X] * (t); \
1466 (o)[Y] = (a)[Y] * (1 - (t)) + (b)[Y] * (t); \
1478#define HLERP(o, a, b, t) do { \
1479 (o)[X] = (a)[X] * (1 - (t)) + (b)[X] * (t); \
1480 (o)[Y] = (a)[Y] * (1 - (t)) + (b)[Y] * (t); \
1481 (o)[Z] = (a)[Z] * (1 - (t)) + (b)[Z] * (t); \
1482 (o)[W] = (a)[W] * (1 - (t)) + (b)[W] * (t); \
1490#define VSUB2DOT(_pt2, _pt, _vec) (\
1491 ((_pt2)[X] - (_pt)[X]) * (_vec)[X] + \
1492 ((_pt2)[Y] - (_pt)[Y]) * (_vec)[Y] + \
1493 ((_pt2)[Z] - (_pt)[Z]) * (_vec)[Z])
1499#define V2ARGS(a) (a)[X], (a)[Y]
1500#define V3ARGS(a) (a)[X], (a)[Y], (a)[Z]
1501#define V4ARGS(a) (a)[X], (a)[Y], (a)[Z], (a)[W]
1512#define INTCLAMP(_a) (NEAR_EQUAL((_a), rint(_a), VUNITIZE_TOL) ? rint(_a) : (_a))
1515#define VINTCLAMP(_v) do { \
1516 (_v)[X] = INTCLAMP((_v)[X]); \
1517 (_v)[Y] = INTCLAMP((_v)[Y]); \
1518 (_v)[Z] = INTCLAMP((_v)[Z]); \
1522#define V2INTCLAMP(_v) do { \
1523 (_v)[X] = INTCLAMP((_v)[X]); \
1524 (_v)[Y] = INTCLAMP((_v)[Y]); \
1528#define HINTCLAMP(_v) do { \
1530 (_v)[W] = INTCLAMP((_v)[W]); \
1535#define V2INTCLAMPARGS(a) INTCLAMP((a)[X]), INTCLAMP((a)[Y])
1537#define V3INTCLAMPARGS(a) INTCLAMP((a)[X]), INTCLAMP((a)[Y]), INTCLAMP((a)[Z])
1539#define V4INTCLAMPARGS(a) INTCLAMP((a)[X]), INTCLAMP((a)[Y]), INTCLAMP((a)[Z]), INTCLAMP((a)[W])
1542#define V2PRINT(a, b) \
1543 fprintf(stderr, "%s (%.6f, %.6g)\n", a, V2ARGS(b));
1544#define VPRINT(a, b) \
1545 fprintf(stderr, "%s (%.6f, %.6f, %.6f)\n", a, V3ARGS(b));
1546#define HPRINT(a, b) \
1547 fprintf(stderr, "%s (%.6f, %.6f, %.6f, %.6f)\n", a, V4ARGS(b));
1554#define V2INTCLAMPPRINT(a, b) \
1555 fprintf(stderr, "%s (%g, %g)\n", a, V2INTCLAMPARGS(b));
1556#define VINTCLAMPPRINT(a, b) \
1557 fprintf(stderr, "%s (%g, %g, %g)\n", a, V3INTCLAMPARGS(b));
1558#define HINTCLAMPPRINT(a, b) \
1559 fprintf(stderr, "%s (%g, %g, %g, %g)\n", a, V4INTCLAMPARGS(b));
1563#define VELMUL(o, a, b) do { \
1564 (o)[X] = (a)[X] * (b)[X]; \
1565 (o)[Y] = (a)[Y] * (b)[Y]; \
1566 (o)[Z] = (a)[Z] * (b)[Z]; \
1569#define VELMUL3(o, a, b, c) do { \
1570 (o)[X] = (a)[X] * (b)[X] * (c)[X]; \
1571 (o)[Y] = (a)[Y] * (b)[Y] * (c)[Y]; \
1572 (o)[Z] = (a)[Z] * (b)[Z] * (c)[Z]; \
1576#define VELDIV(o, a, b) do { \
1577 (o)[X] = (a)[X] / (b)[X]; \
1578 (o)[Y] = (a)[Y] / (b)[Y]; \
1579 (o)[Z] = (a)[Z] / (b)[Z]; \
1586#define VINVDIR(_inv, _dir) do { \
1587 if ((_dir)[X] < -SQRT_SMALL_FASTF || (_dir)[X] > SQRT_SMALL_FASTF) { \
1588 (_inv)[X]=1.0/(_dir)[X]; \
1591 (_inv)[X] = INFINITY; \
1593 if ((_dir)[Y] < -SQRT_SMALL_FASTF || (_dir)[Y] > SQRT_SMALL_FASTF) { \
1594 (_inv)[Y]=1.0/(_dir)[Y]; \
1597 (_inv)[Y] = INFINITY; \
1599 if ((_dir)[Z] < -SQRT_SMALL_FASTF || (_dir)[Z] > SQRT_SMALL_FASTF) { \
1600 (_inv)[Z]=1.0/(_dir)[Z]; \
1603 (_inv)[Z] = INFINITY; \
1611#define MAT3X3VEC(o, mat, vec) do { \
1612 (o)[X] = (mat)[X]*(vec)[X]+(mat)[Y]*(vec)[Y] + (mat)[ 2]*(vec)[Z]; \
1613 (o)[Y] = (mat)[4]*(vec)[X]+(mat)[5]*(vec)[Y] + (mat)[ 6]*(vec)[Z]; \
1614 (o)[Z] = (mat)[8]*(vec)[X]+(mat)[9]*(vec)[Y] + (mat)[10]*(vec)[Z]; \
1618#define VEC3X3MAT(o, i, m) do { \
1619 (o)[X] = (i)[X]*(m)[X] + (i)[Y]*(m)[4] + (i)[Z]*(m)[8]; \
1620 (o)[Y] = (i)[X]*(m)[1] + (i)[Y]*(m)[5] + (i)[Z]*(m)[9]; \
1621 (o)[Z] = (i)[X]*(m)[2] + (i)[Y]*(m)[6] + (i)[Z]*(m)[10]; \
1625#define MAT3X2VEC(o, mat, vec) do { \
1626 (o)[X] = (mat)[0]*(vec)[X] + (mat)[Y]*(vec)[Y]; \
1627 (o)[Y] = (mat)[4]*(vec)[X] + (mat)[5]*(vec)[Y]; \
1628 (o)[Z] = (mat)[8]*(vec)[X] + (mat)[9]*(vec)[Y]; \
1632#define VEC2X3MAT(o, i, m) do { \
1633 (o)[X] = (i)[X]*(m)[0] + (i)[Y]*(m)[4]; \
1634 (o)[Y] = (i)[X]*(m)[1] + (i)[Y]*(m)[5]; \
1635 (o)[Z] = (i)[X]*(m)[2] + (i)[Y]*(m)[6]; \
1642#define MAT4X3PNT(o, m, i) do { \
1644 _f = 1.0/((m)[12]*(i)[X] + (m)[13]*(i)[Y] + (m)[14]*(i)[Z] + (m)[15]); \
1645 (o)[X]=((m)[0]*(i)[X] + (m)[1]*(i)[Y] + (m)[ 2]*(i)[Z] + (m)[3]) * _f; \
1646 (o)[Y]=((m)[4]*(i)[X] + (m)[5]*(i)[Y] + (m)[ 6]*(i)[Z] + (m)[7]) * _f; \
1647 (o)[Z]=((m)[8]*(i)[X] + (m)[9]*(i)[Y] + (m)[10]*(i)[Z] + (m)[11])* _f; \
1654#define PNT3X4MAT(o, i, m) do { \
1656 _f = 1.0/((i)[X]*(m)[3] + (i)[Y]*(m)[7] + (i)[Z]*(m)[11] + (m)[15]); \
1657 (o)[X]=((i)[X]*(m)[0] + (i)[Y]*(m)[4] + (i)[Z]*(m)[8] + (m)[12]) * _f; \
1658 (o)[Y]=((i)[X]*(m)[1] + (i)[Y]*(m)[5] + (i)[Z]*(m)[9] + (m)[13]) * _f; \
1659 (o)[Z]=((i)[X]*(m)[2] + (i)[Y]*(m)[6] + (i)[Z]*(m)[10] + (m)[14])* _f; \
1666#define MAT4X4PNT(o, m, i) do { \
1667 (o)[X]=(m)[ 0]*(i)[X] + (m)[ 1]*(i)[Y] + (m)[ 2]*(i)[Z] + (m)[ 3]*(i)[W]; \
1668 (o)[Y]=(m)[ 4]*(i)[X] + (m)[ 5]*(i)[Y] + (m)[ 6]*(i)[Z] + (m)[ 7]*(i)[W]; \
1669 (o)[Z]=(m)[ 8]*(i)[X] + (m)[ 9]*(i)[Y] + (m)[10]*(i)[Z] + (m)[11]*(i)[W]; \
1670 (o)[W]=(m)[12]*(i)[X] + (m)[13]*(i)[Y] + (m)[14]*(i)[Z] + (m)[15]*(i)[W]; \
1678#define MAT4X3VEC(o, m, i) do { \
1680 _f = 1.0/((m)[15]); \
1681 (o)[X] = ((m)[0]*(i)[X] + (m)[1]*(i)[Y] + (m)[ 2]*(i)[Z]) * _f; \
1682 (o)[Y] = ((m)[4]*(i)[X] + (m)[5]*(i)[Y] + (m)[ 6]*(i)[Z]) * _f; \
1683 (o)[Z] = ((m)[8]*(i)[X] + (m)[9]*(i)[Y] + (m)[10]*(i)[Z]) * _f; \
1686#define MAT4XSCALOR(o, m, i) do { \
1687 (o) = (i) / (m)[15]; \
1694#define VEC3X4MAT(o, i, m) do { \
1696 _f = 1.0/((m)[15]); \
1697 (o)[X] = ((i)[X]*(m)[0] + (i)[Y]*(m)[4] + (i)[Z]*(m)[8]) * _f; \
1698 (o)[Y] = ((i)[X]*(m)[1] + (i)[Y]*(m)[5] + (i)[Z]*(m)[9]) * _f; \
1699 (o)[Z] = ((i)[X]*(m)[2] + (i)[Y]*(m)[6] + (i)[Z]*(m)[10]) * _f; \
1703#define VEC2X4MAT(o, i, m) do { \
1705 _f = 1.0/((m)[15]); \
1706 (o)[X] = ((i)[X]*(m)[0] + (i)[Y]*(m)[4]) * _f; \
1707 (o)[Y] = ((i)[X]*(m)[1] + (i)[Y]*(m)[5]) * _f; \
1708 (o)[Z] = ((i)[X]*(m)[2] + (i)[Y]*(m)[6]) * _f; \
1716#define V_MIN(r, s) if ((r) > (s)) r = (s)
1718#define V_MAX(r, s) if ((r) < (s)) r = (s)
1723#define VMIN(r, s) do { \
1724 V_MIN((r)[X], (s)[X]); V_MIN((r)[Y], (s)[Y]); V_MIN((r)[Z], (s)[Z]); \
1730#define VMAX(r, s) do { \
1731 V_MAX((r)[X], (s)[X]); V_MAX((r)[Y], (s)[Y]); V_MAX((r)[Z], (s)[Z]); \
1737#define VMINMAX(min, max, pt) do { \
1738 VMIN((min), (pt)); VMAX((max), (pt)); \
1746#define V2MIN(r, s) do { \
1747 V_MIN((r)[X], (s)[X]); V_MIN((r)[Y], (s)[Y]); \
1750#define V2MAX(r, s) do { \
1751 V_MAX((r)[X], (s)[X]); V_MAX((r)[Y], (s)[Y]); \
1754#define V2MINMAX(min, max, pt) do { \
1755 V2MIN((min), (pt)); V2MAX((max), (pt)); \
1761#define CLAMP(_v, _l, _h) V_MAX((_v), (_l)); else V_MIN((_v), (_h))
1768#define HDIVIDE(o, v) do { \
1769 (o)[X] = (v)[X] / (v)[W]; \
1770 (o)[Y] = (v)[Y] / (v)[W]; \
1771 (o)[Z] = (v)[Z] / (v)[W]; \
1797#define QUAT_FROM_ROT(q, r, x, y, z) do { \
1798 fastf_t _rot = (r) * 0.5; \
1799 QSET(q, x, y, z, cos(_rot)); \
1802 VSCALE(q, q, _rot); \
1805#define QUAT_FROM_VROT(q, r, v) do { \
1806 fastf_t _rot = (r) * 0.5; \
1809 (q)[W] = cos(_rot); \
1811 VSCALE(q, q, _rot); \
1814#define QUAT_FROM_VROT_DEG(q, r, v) \
1815 QUAT_FROM_VROT(q, ((r)*DEG2RAD), v)
1817#define QUAT_FROM_ROT_DEG(q, r, x, y, z) \
1818 QUAT_FROM_ROT(q, ((r)*DEG2RAD), x, y, z)
1825#define QSET(a, b, c, d, e) do { \
1833#define QMOVE(a, b) do { \
1841#define QADD2(a, b, c) do { \
1842 (a)[X] = (b)[X] + (c)[X]; \
1843 (a)[Y] = (b)[Y] + (c)[Y]; \
1844 (a)[Z] = (b)[Z] + (c)[Z]; \
1845 (a)[W] = (b)[W] + (c)[W]; \
1852#define QSUB2(a, b, c) do { \
1853 (a)[X] = (b)[X] - (c)[X]; \
1854 (a)[Y] = (b)[Y] - (c)[Y]; \
1855 (a)[Z] = (b)[Z] - (c)[Z]; \
1856 (a)[W] = (b)[W] - (c)[W]; \
1863#define QSCALE(a, b, c) do { \
1864 (a)[X] = (b)[X] * (c); \
1865 (a)[Y] = (b)[Y] * (c); \
1866 (a)[Z] = (b)[Z] * (c); \
1867 (a)[W] = (b)[W] * (c); \
1871#define QUNITIZE(a) do { \
1873 _f = QMAGNITUDE(a); \
1874 if (_f < VDIVIDE_TOL) _f = 0.0; else _f = 1.0/_f; \
1875 (a)[X] *= _f; (a)[Y] *= _f; (a)[Z] *= _f; (a)[W] *= _f; \
1880 ((a)[X]*(a)[X] + (a)[Y]*(a)[Y] \
1881 + (a)[Z]*(a)[Z] + (a)[W]*(a)[W])
1884#define QMAGNITUDE(a) sqrt(QMAGSQ(a))
1888 ((a)[X]*(b)[X] + (a)[Y]*(b)[Y] \
1889 + (a)[Z]*(b)[Z] + (a)[W]*(b)[W])
1898#define QMUL(a, b, c) do { \
1899 (a)[W] = (b)[W]*(c)[W] - (b)[X]*(c)[X] - (b)[Y]*(c)[Y] - (b)[Z]*(c)[Z]; \
1900 (a)[X] = (b)[W]*(c)[X] + (b)[X]*(c)[W] + (b)[Y]*(c)[Z] - (b)[Z]*(c)[Y]; \
1901 (a)[Y] = (b)[W]*(c)[Y] + (b)[Y]*(c)[W] + (b)[Z]*(c)[X] - (b)[X]*(c)[Z]; \
1902 (a)[Z] = (b)[W]*(c)[Z] + (b)[Z]*(c)[W] + (b)[X]*(c)[Y] - (b)[Y]*(c)[X]; \
1906#define QCONJUGATE(a, b) do { \
1914#define QINVERSE(a, b) do { \
1915 double _f = QMAGSQ(b); \
1916 if (_f < VDIVIDE_TOL) _f = 0.0; else _f = 1.0/_f; \
1917 (a)[X] = -(b)[X] * _f; \
1918 (a)[Y] = -(b)[Y] * _f; \
1919 (a)[Z] = -(b)[Z] * _f; \
1920 (a)[W] = (b)[W] * _f; \
1929#define QBLEND2(a, b, c, d, e) do { \
1930 (a)[X] = (b) * (c)[X] + (d) * (e)[X]; \
1931 (a)[Y] = (b) * (c)[Y] + (d) * (e)[Y]; \
1932 (a)[Z] = (b) * (c)[Z] + (d) * (e)[Z]; \
1933 (a)[W] = (b) * (c)[W] + (d) * (e)[W]; \
1946#define V3RPP_DISJOINT(_l1, _h1, _l2, _h2) \
1947 ((_l1)[X] > (_h2)[X] || (_l1)[Y] > (_h2)[Y] || (_l1)[Z] > (_h2)[Z] || \
1948 (_l2)[X] > (_h1)[X] || (_l2)[Y] > (_h1)[Y] || (_l2)[Z] > (_h1)[Z])
1954#define V3RPP_DISJOINT_TOL(_l1, _h1, _l2, _h2, _t) \
1955 ((_l1)[X] > (_h2)[X] + (_t) || \
1956 (_l1)[Y] > (_h2)[Y] + (_t) || \
1957 (_l1)[Z] > (_h2)[Z] + (_t) || \
1958 (_l2)[X] > (_h1)[X] + (_t) || \
1959 (_l2)[Y] > (_h1)[Y] + (_t) || \
1960 (_l2)[Z] > (_h1)[Z] + (_t))
1963#define V3RPP_OVERLAP(_l1, _h1, _l2, _h2) \
1964 (! ((_l1)[X] > (_h2)[X] || (_l1)[Y] > (_h2)[Y] || (_l1)[Z] > (_h2)[Z] || \
1965 (_l2)[X] > (_h1)[X] || (_l2)[Y] > (_h1)[Y] || (_l2)[Z] > (_h1)[Z]))
1971#define V3RPP_OVERLAP_TOL(_l1, _h1, _l2, _h2, _t) \
1972 (! ((_l1)[X] > (_h2)[X] + (_t) || \
1973 (_l1)[Y] > (_h2)[Y] + (_t) || \
1974 (_l1)[Z] > (_h2)[Z] + (_t) || \
1975 (_l2)[X] > (_h1)[X] + (_t) || \
1976 (_l2)[Y] > (_h1)[Y] + (_t) || \
1977 (_l2)[Z] > (_h1)[Z] + (_t)))
1984#define V3PNT_IN_RPP(_pt, _lo, _hi) (\
1985 (_pt)[X] >= (_lo)[X] && (_pt)[X] <= (_hi)[X] && \
1986 (_pt)[Y] >= (_lo)[Y] && (_pt)[Y] <= (_hi)[Y] && \
1987 (_pt)[Z] >= (_lo)[Z] && (_pt)[Z] <= (_hi)[Z])
1994#define V3PNT_IN_RPP_TOL(_pt, _lo, _hi, _t) (\
1995 (_pt)[X] >= (_lo)[X]-(_t) && (_pt)[X] <= (_hi)[X]+(_t) && \
1996 (_pt)[Y] >= (_lo)[Y]-(_t) && (_pt)[Y] <= (_hi)[Y]+(_t) && \
1997 (_pt)[Z] >= (_lo)[Z]-(_t) && (_pt)[Z] <= (_hi)[Z]+(_t))
2003#define V3PNT_OUT_RPP_TOL(_pt, _lo, _hi, _t) (\
2004 (_pt)[X] < (_lo)[X]-(_t) || (_pt)[X] > (_hi)[X]+(_t) || \
2005 (_pt)[Y] < (_lo)[Y]-(_t) || (_pt)[Y] > (_hi)[Y]+(_t) || \
2006 (_pt)[Z] < (_lo)[Z]-(_t) || (_pt)[Z] > (_hi)[Z]+(_t))
2014#define V3RPP1_IN_RPP2(_lo1, _hi1, _lo2, _hi2) (\
2015 (_lo1)[X] >= (_lo2)[X] && (_hi1)[X] <= (_hi2)[X] && \
2016 (_lo1)[Y] >= (_lo2)[Y] && (_hi1)[Y] <= (_hi2)[Y] && \
2017 (_lo1)[Z] >= (_lo2)[Z] && (_hi1)[Z] <= (_hi2)[Z])
2021#define VSWAP(_a, _b) do { \
2024 (_a)[X] = (_b)[X]; \
2027 (_a)[Y] = (_b)[Y]; \
2030 (_a)[Z] = (_b)[Z]; \
2035#define V2SWAP(_a, _b) do { \
2038 (_a)[X] = (_b)[X]; \
2041 (_a)[Y] = (_b)[Y]; \
2046#define HSWAP(_a, _b) do { \
2049 (_a)[X] = (_b)[X]; \
2052 (_a)[Y] = (_b)[Y]; \
2055 (_a)[Z] = (_b)[Z]; \
2058 (_a)[W] = (_b)[W]; \
2063#define MAT_SWAP(_a, _b) do { \
2065 MAT_COPY(_t, (_a)); \
2066 MAT_COPY((_a), (_b)); \
2067 MAT_COPY((_b), _t); \
2078#define VINITALL(_v) {(_v), (_v), (_v)}
2086#define V2INITALL(_v) {(_v), (_v), (_v)}
2094#define HINITALL(_v) {(_v), (_v), (_v), (_v)}
2102#define VINIT_ZERO {0.0, 0.0, 0.0}
2110#define V2INIT_ZERO {0.0, 0.0}
2118#define HINIT_ZERO {0.0, 0.0, 0.0, 0.0}
2125#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}
2132#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}
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