Thread: [brlcad-commits] SF.net SVN: brlcad:[47850] brlcad/trunk/include/vmath.h (Page 2)
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <r_...@us...> - 2011-12-08 00:18:43
|
Revision: 47850 http://brlcad.svn.sourceforge.net/brlcad/?rev=47850&view=rev Author: r_weiss Date: 2011-12-08 00:18:36 +0000 (Thu, 08 Dec 2011) Log Message: ----------- Updated include file 'vmath.h' adding the macro 'V3RPP_DISJOINT_TOL'. Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2011-12-08 00:15:51 UTC (rev 47849) +++ brlcad/trunk/include/vmath.h 2011-12-08 00:18:36 UTC (rev 47850) @@ -1646,6 +1646,18 @@ ((_l1)[X] > (_h2)[X] || (_l1)[Y] > (_h2)[Y] || (_l1)[Z] > (_h2)[Z] || \ (_l2)[X] > (_h1)[X] || (_l2)[Y] > (_h1)[Y] || (_l2)[Z] > (_h1)[Z]) +/** + * Compare two bounding boxes and return true if they are disjoint + * by at least distance tolerance. + */ +#define V3RPP_DISJOINT_TOL(_l1, _h1, _l2, _h2, _t) \ + (((_l1)[X] > (_h2)[X] + (_t)->dist && \ + (_l1)[Y] > (_h2)[Y] + (_t)->dist && \ + (_l1)[Z] > (_h2)[Z] + (_t)->dist) || \ + ((_l2)[X] > (_h1)[X] + (_t)->dist && \ + (_l2)[Y] > (_h1)[Y] + (_t)->dist && \ + (_l2)[Z] > (_h1)[Z] + (_t)->dist)) + /** Compare two bounding boxes and return true If they overlap. */ #define V3RPP_OVERLAP(_l1, _h1, _l2, _h2) \ (! ((_l1)[X] > (_h2)[X] || (_l1)[Y] > (_h2)[Y] || (_l1)[Z] > (_h2)[Z] || \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <eri...@us...> - 2012-04-10 12:01:03
|
Revision: 49961 http://brlcad.svn.sourceforge.net/brlcad/?rev=49961&view=rev Author: erikgreenwald Date: 2012-04-10 12:00:53 +0000 (Tue, 10 Apr 2012) Log Message: ----------- set _USE_MATH_DEFINES for msvc ( http://msdn.microsoft.com/en-us/library/4hwaceh6%28v=vs.80%29.aspx ) Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2012-04-10 11:54:28 UTC (rev 49960) +++ brlcad/trunk/include/vmath.h 2012-04-10 12:00:53 UTC (rev 49961) @@ -76,6 +76,9 @@ #include "common.h" /* for sqrt(), sin(), cos(), rint(), etc */ +#ifdef WIN32 +# define _USE_MATH_DEFINES +#endif #include <math.h> /* for floating point tolerances and other math constants */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2012-06-16 13:11:05
|
Revision: 51193 http://brlcad.svn.sourceforge.net/brlcad/?rev=51193&view=rev Author: brlcad Date: 2012-06-16 13:10:59 +0000 (Sat, 16 Jun 2012) Log Message: ----------- ws Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2012-06-16 13:10:29 UTC (rev 51192) +++ brlcad/trunk/include/vmath.h 2012-06-16 13:10:59 UTC (rev 51193) @@ -402,13 +402,13 @@ #define VEQUAL(_a, _b) VNEAR_EQUAL((_a), (_b), SMALL_FASTF) /** - * @brief Compare two vectors for EXACT equality. Use carefully. + * @brief Compare two vectors for EXACT equality. Use carefully. * Version for degree 2 vectors. FIXME: no such thing as exact. */ #define V2EQUAL(a, b) ((a)[X]==(b)[X] && (a)[Y]==(b)[Y]) /** - * @brief Compare two vectors for EXACT equality. Use carefully. + * @brief Compare two vectors for EXACT equality. Use carefully. * Version for degree 4 vectors. FIXME: no such thing as exact. */ #define HEQUAL(a, b) ((a)[X]==(b)[X] && (a)[Y]==(b)[Y] && (a)[Z]==(b)[Z] && (a)[W]==(b)[W]) @@ -1659,7 +1659,7 @@ (_l1)[Z] > (_h2)[Z] + (_t)) || \ ((_l2)[X] > (_h1)[X] + (_t) && \ (_l2)[Y] > (_h1)[Y] + (_t) && \ - (_l2)[Z] > (_h1)[Z] + (_t))) + (_l2)[Z] > (_h1)[Z] + (_t))) /** Compare two bounding boxes and return true If they overlap. */ #define V3RPP_OVERLAP(_l1, _h1, _l2, _h2) \ @@ -1703,9 +1703,9 @@ * This will not return true if the point is on the RPP. */ #define V3PT_OUT_RPP_TOL(_pt, _lo, _hi, _t) (\ - (_pt)[X] < (_lo)[X]-(_t) || (_pt)[X] > (_hi)[X]+(_t) || \ - (_pt)[Y] < (_lo)[Y]-(_t) || (_pt)[Y] > (_hi)[Y]+(_t) || \ - (_pt)[Z] < (_lo)[Z]-(_t) || (_pt)[Z] > (_hi)[Z]+(_t)) + (_pt)[X] < (_lo)[X]-(_t) || (_pt)[X] > (_hi)[X]+(_t) || \ + (_pt)[Y] < (_lo)[Y]-(_t) || (_pt)[Y] > (_hi)[Y]+(_t) || \ + (_pt)[Z] < (_lo)[Z]-(_t) || (_pt)[Z] > (_hi)[Z]+(_t)) /** * @brief Determine if one bounding box is within another. Also This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2012-07-16 02:32:05
|
Revision: 51522 http://brlcad.svn.sourceforge.net/brlcad/?rev=51522&view=rev Author: brlcad Date: 2012-07-16 02:31:55 +0000 (Mon, 16 Jul 2012) Log Message: ----------- stub in the analog of a cross product for 2d vectors consistent with vmath API adding a new V2CROSS() macro. since the analog doesn't result in a vector, return the scalar instead of setting it to a provided variable. stub in HCROSS while we're at it. Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2012-07-16 01:57:10 UTC (rev 51521) +++ brlcad/trunk/include/vmath.h 2012-07-16 02:31:55 UTC (rev 51522) @@ -1179,11 +1179,12 @@ /** @brief Return scalar magnitude of vector at `a' */ #define MAGNITUDE(a) sqrt(MAGSQ(a)) + /** - * @brief Store cross product of vectors at `b' and `c' in vector at - * `a'. Note that the "right hand rule" applies: If closing your - * right hand goes from `b' to `c', then your thumb points in the - * direction of the cross product. + * Store cross product of 3D vectors at `b' and `c' in vector at `a'. + * Note that the "right hand rule" applies: If closing your right hand + * goes from `b' to `c', then your thumb points in the direction of + * the cross product. * * If the angle from `b' to `c' goes clockwise, then the result vector * points "into" the plane (inward normal). Example: b=(0, 1, 0), @@ -1199,6 +1200,19 @@ (a)[Z] = (b)[X] * (c)[Y] - (b)[Y] * (c)[X]; \ } +/** + * Return the analog of a cross product for 2D vectors `a' and `b' + * as a scalar value. If a = (ax, ay) and b = (bx, by), then the analog + * of a x b is det(a*b) = ax*by - ay*bx + */ +#define V2CROSS(a, b) ((a)[X] * (b)[Y] - (a)[Y] * (b)[X]) + +/** + * TODO: implement me + */ +#define HCROSS(a, b, c) + + /** @brief Compute dot product of vectors at `a' and `b'. */ #define VDOT(a, b) ((a)[X]*(b)[X] + (a)[Y]*(b)[Y] + (a)[Z]*(b)[Z]) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cr...@us...> - 2012-08-06 20:22:06
|
Revision: 51771 http://brlcad.svn.sourceforge.net/brlcad/?rev=51771&view=rev Author: crdueck Date: 2012-08-06 20:22:00 +0000 (Mon, 06 Aug 2012) Log Message: ----------- update HEQUAL and V2EQUAL to use the HNEAR_EQUAL and V2NEAR_EQUAL macros respectively Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2012-08-06 19:57:33 UTC (rev 51770) +++ brlcad/trunk/include/vmath.h 2012-08-06 20:22:00 UTC (rev 51771) @@ -402,16 +402,16 @@ #define VEQUAL(_a, _b) VNEAR_EQUAL((_a), (_b), SMALL_FASTF) /** - * @brief Compare two vectors for EXACT equality. Use carefully. - * Version for degree 2 vectors. FIXME: no such thing as exact. + * @brief Return truthfully whether two 2D vectors are equal within + * a minimum representation tolerance. */ -#define V2EQUAL(a, b) ((a)[X]==(b)[X] && (a)[Y]==(b)[Y]) +#define V2EQUAL(_a, _b) V2NEAR_EQUAL((_a), (_b), SMALL_FASTF) /** - * @brief Compare two vectors for EXACT equality. Use carefully. - * Version for degree 4 vectors. FIXME: no such thing as exact. + * @brief Return truthfully whether two higher degree vectors are + * equal within a minimum representation tolerance. */ -#define HEQUAL(a, b) ((a)[X]==(b)[X] && (a)[Y]==(b)[Y] && (a)[Z]==(b)[Z] && (a)[W]==(b)[W]) +#define HEQUAL(_a, _b) HNEAR_EQUAL((_a), (_b), SMALL_FASTF) /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <car...@us...> - 2012-08-14 18:08:40
|
Revision: 52011 http://brlcad.svn.sourceforge.net/brlcad/?rev=52011&view=rev Author: carlmoore Date: 2012-08-14 18:08:33 +0000 (Tue, 14 Aug 2012) Log Message: ----------- fix spellings Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2012-08-14 18:04:48 UTC (rev 52010) +++ brlcad/trunk/include/vmath.h 2012-08-14 18:08:33 UTC (rev 52011) @@ -249,7 +249,7 @@ /** * Locations of deltas (MD*) and scaling values (MS*) in a 4x4 - * Homogenous Transform matrix + * Homogeneous Transform matrix */ typedef enum bn_matrix_component_ { MSX = 0, @@ -573,7 +573,7 @@ (_m)[MSZ] -= (_v)[Z]; \ } -/** @brief multipy scaling elements in a 4x4 matrix from xyz. */ +/** @brief multiply scaling elements in a 4x4 matrix from xyz. */ #define MAT_SCALE_MUL(_m, _x, _y, _z) { \ (_m)[MSX] *= _x; \ (_m)[MSY] *= _y; \ @@ -663,7 +663,7 @@ (a)[Y] = (c); \ } -/** @brief Set 4D vector at `a' to homogenous coordinates `b', `c', `d', and `e'. */ +/** @brief Set 4D vector at `a' to homogeneous coordinates `b', `c', `d', and `e'. */ #define HSET(a, b, c, d, e) { \ (a)[X] = (b); \ (a)[Y] = (c); \ @@ -1306,7 +1306,7 @@ /** * @brief Given a direction vector, compute the inverses of each element. - * When division by zero would have occured, mark inverse as INFINITY. + * When division by zero would have occurred, mark inverse as INFINITY. */ #define VINVDIR(_inv, _dir) { \ if ((_dir)[X] < -SQRT_SMALL_FASTF || (_dir)[X] > SQRT_SMALL_FASTF) { \ @@ -1651,7 +1651,7 @@ /** * Macros for dealing with 3-D "extents", aka bounding boxes, that are - * represented as axis-aligned right parallelpipeds (RPPs). This is + * represented as axis-aligned right parallelepipeds (RPPs). This is * stored as two points: a min point, and a max point. RPP 1 is * defined by lo1, hi1, RPP 2 by lo2, hi2. */ @@ -1789,7 +1789,7 @@ #define V2INIT_ZERO {0.0, 0.0} /** - * 4D homogenous vector macro suitable for declaration statement + * 4D homogeneous vector macro suitable for declaration statement * initialization. this sets all vector elements to zero similar to * calling VSETALLN(hvect_t,0.0,4) but as an initializer array * declaration instead of as a statement. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <car...@us...> - 2012-10-02 14:30:47
|
Revision: 52674 http://brlcad.svn.sourceforge.net/brlcad/?rev=52674&view=rev Author: carlmoore Date: 2012-10-02 14:30:36 +0000 (Tue, 02 Oct 2012) Log Message: ----------- remove a trailing blank/tab and change ie to i.e. Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2012-10-02 14:27:11 UTC (rev 52673) +++ brlcad/trunk/include/vmath.h 2012-10-02 14:30:36 UTC (rev 52674) @@ -27,17 +27,17 @@ * and operates on vect_t, point_t, mat_t, and quat_t objects. * * Note that while many people in the computer graphics field use - * post-multiplication with row vectors (ie, vector * matrix * matrix + * post-multiplication with row vectors (i.e., vector * matrix * matrix * ...) the BRL-CAD system uses the more traditional representation - * of column vectors (ie, ... matrix * matrix * vector). (The + * of column vectors (i.e., ... matrix * matrix * vector). (The * matrices in these two representations are the transposes of each * other). Therefore, when transforming a vector by a matrix, - * pre-multiplication is used, ie: + * pre-multiplication is used, i.e.: * * view_vec = model2view_mat * model_vec * * Furthermore, additional transformations are multiplied on the left, - * ie: + * i.e.: * <tt> @code * vec' = T1 * vec @@ -45,7 +45,7 @@ @endcode </tt> * * The most notable implication of this is the location of the "delta" - * (translation) values in the matrix, ie: + * (translation) values in the matrix, i.e.: * <tt> @code * x' (R0 R1 R2 Dx) x @@ -1690,7 +1690,7 @@ (_l1)[Z] > (_h2)[Z] + (_t) || \ (_l2)[X] > (_h1)[X] + (_t) || \ (_l2)[Y] > (_h1)[Y] + (_t) || \ - (_l2)[Z] > (_h1)[Z] + (_t)) + (_l2)[Z] > (_h1)[Z] + (_t)) /** Compare two bounding boxes and return true If they overlap. */ #define V3RPP_OVERLAP(_l1, _h1, _l2, _h2) \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <car...@us...> - 2012-11-05 22:06:05
|
Revision: 53462 http://brlcad.svn.sourceforge.net/brlcad/?rev=53462&view=rev Author: carlmoore Date: 2012-11-05 22:05:58 +0000 (Mon, 05 Nov 2012) Log Message: ----------- fix spelling Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2012-11-05 21:47:59 UTC (rev 53461) +++ brlcad/trunk/include/vmath.h 2012-11-05 22:05:58 UTC (rev 53462) @@ -196,7 +196,7 @@ #define ELEMENTS_PER_MAT (ELEMENTS_PER_PLANE*ELEMENTS_PER_PLANE) /* - * Types for matrixes and vectors. + * Types for matrices and vectors. */ /** @brief 2-tuple vector */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <car...@us...> - 2012-11-08 22:15:41
|
Revision: 53586 http://brlcad.svn.sourceforge.net/brlcad/?rev=53586&view=rev Author: carlmoore Date: 2012-11-08 22:15:34 +0000 (Thu, 08 Nov 2012) Log Message: ----------- add a period Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2012-11-08 22:03:59 UTC (rev 53585) +++ brlcad/trunk/include/vmath.h 2012-11-08 22:15:34 UTC (rev 53586) @@ -75,7 +75,7 @@ #include "common.h" -/* for sqrt(), sin(), cos(), rint(), etc */ +/* for sqrt(), sin(), cos(), rint(), etc. */ #ifdef WIN32 # define _USE_MATH_DEFINES #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pop...@us...> - 2012-12-02 19:41:05
|
Revision: 53946 http://brlcad.svn.sourceforge.net/brlcad/?rev=53946&view=rev Author: popescuandrei Date: 2012-12-02 19:40:58 +0000 (Sun, 02 Dec 2012) Log Message: ----------- Moved mat_t description from mat.c to vmath.h Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2012-12-02 19:20:35 UTC (rev 53945) +++ brlcad/trunk/include/vmath.h 2012-12-02 19:40:58 UTC (rev 53946) @@ -26,6 +26,19 @@ * This header file defines many commonly used 3D vector math macros, * and operates on vect_t, point_t, mat_t, and quat_t objects. * + * @brief matrix representation + * 4 x 4 Matrix manipulation functions... + * + * Matrix array elements have the following positions in the matrix: + @code + * | 0 1 2 3 | | 0 | + * [ 0 1 2 3 ] | 4 5 6 7 | | 1 | + * | 8 9 10 11 | | 2 | + * | 12 13 14 15 | | 3 | + * + * preVector (vect_t) Matrix (mat_t) postVector (vect_t) + @endcode + * * Note that while many people in the computer graphics field use * post-multiplication with row vectors (i.e., vector * matrix * matrix * ...) the BRL-CAD system uses the more traditional representation This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2013-03-14 14:59:53
|
Revision: 54684 http://brlcad.svn.sourceforge.net/brlcad/?rev=54684&view=rev Author: brlcad Date: 2013-03-14 14:59:46 +0000 (Thu, 14 Mar 2013) Log Message: ----------- simplify, a define shouldn't be harmful/recognized on non-WIN32 and we don't want platform checks anyways Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2013-03-14 14:22:50 UTC (rev 54683) +++ brlcad/trunk/include/vmath.h 2013-03-14 14:59:46 UTC (rev 54684) @@ -88,10 +88,9 @@ #include "common.h" -/* for sqrt(), sin(), cos(), rint(), etc. */ -#ifdef WIN32 -# define _USE_MATH_DEFINES -#endif +/* for sqrt(), sin(), cos(), rint(), M_PI and more on Windows */ +#define _USE_MATH_DEFINES 1 + #include <math.h> /* for floating point tolerances and other math constants */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2013-03-21 19:39:10
|
Revision: 54807 http://brlcad.svn.sourceforge.net/brlcad/?rev=54807&view=rev Author: brlcad Date: 2013-03-21 19:39:02 +0000 (Thu, 21 Mar 2013) Log Message: ----------- implement macros for swapping vectors and matrices. use a single temporary float for the vectors, but a full temp matrix for the matrix swap. while the single fastf_t temp is fewer read/write instructions, it may be more coherent (faster) to use a full vector. warrants testing if put into critical code. implemented in do{}while(0) fashion so a semicolon becomes necessary Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2013-03-21 19:21:32 UTC (rev 54806) +++ brlcad/trunk/include/vmath.h 2013-03-21 19:39:02 UTC (rev 54807) @@ -1775,6 +1775,57 @@ (_e) = atan2(-((_d)[Z]), sqrt((_d)[X]*(_d)[X] + (_d)[Y]*(_d)[Y])) * -RAD2DEG; \ } + +/** Swap two 3D vectors */ +#define VSWAP(_a, _b) do { \ + fastf_t _t; \ + _t = (_a)[X]; \ + (_a)[X] = (_b)[X]; \ + (_b)[X] = _t; \ + _t = (_a)[Y]; \ + (_a)[Y] = (_b)[Y]; \ + (_b)[Y] = _t; \ + _t = (_a)[Z]; \ + (_a)[Z] = (_b)[Z]; \ + (_b)[Z] = _t; \ + } while (0) + +/** Swap two 2D vectors */ +#define V2SWAP(_a, _b) do { \ + fastf_t _t; \ + _t = (_a)[X]; \ + (_a)[X] = (_b)[X]; \ + (_b)[X] = _t; \ + _t = (_a)[Y]; \ + (_a)[Y] = (_b)[Y]; \ + (_b)[Y] = _t; \ + } while (0) + +/** Swap two 4D vectors */ +#define HSWAP(_a, _b) do { \ + fastf_t _t; \ + _t = (_a)[X]; \ + (_a)[X] = (_b)[X]; \ + (_b)[X] = _t; \ + _t = (_a)[Y]; \ + (_a)[Y] = (_b)[Y]; \ + (_b)[Y] = _t; \ + _t = (_a)[Z]; \ + (_a)[Z] = (_b)[Z]; \ + (_b)[Z] = _t; \ + _t = (_a)[W]; \ + (_a)[W] = (_b)[W]; \ + (_b)[W] = _t; \ + } while (0) + +/** Swap two 4x4 matrices */ +#define MAT_SWAP(_a, _b) do { \ + mat_t _t; \ + MAT_COPY(_t, (_a)); \ + MAT_COPY((_a), (_b)); \ + MAT_COPY((_b), _t); \ + } while (0) + /*** Macros suitable for declaration statement initialization. ***/ /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2013-03-22 13:39:32
|
Revision: 54821 http://brlcad.svn.sourceforge.net/brlcad/?rev=54821&view=rev Author: brlcad Date: 2013-03-22 13:39:23 +0000 (Fri, 22 Mar 2013) Log Message: ----------- convert all of the vmath block macros to do {} while (0) form so that a semicolon becomes required. only a really stupid compiler would actually output an always-false branch test, so it should have no impact on performance. moreover, testing (mac, linux, gcc, clang) showed no impact. Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2013-03-22 13:22:19 UTC (rev 54820) +++ brlcad/trunk/include/vmath.h 2013-03-22 13:39:23 UTC (rev 54821) @@ -433,20 +433,20 @@ /** Clamp a 3D vector to zero if within tolerance of zero. */ -#define VCLAMP(a) { \ +#define VCLAMP(a) do { \ if (ZERO((a)[X])) (a)[X] = 0.0; \ if (ZERO((a)[Y])) (a)[Y] = 0.0; \ if (ZERO((a)[Z])) (a)[Z] = 0.0; \ -} + } while (0) /** Clamp a 4D vector to zero if within tolerance of zero. */ -#define HCLAMP(a) { \ +#define HCLAMP(a) do { \ if (ZERO((a)[X])) (a)[X] = 0.0; \ if (ZERO((a)[Y])) (a)[Y] = 0.0; \ if (ZERO((a)[Z])) (a)[Z] = 0.0; \ if (ZERO((a)[H])) (a)[H] = 0.0; \ -} + } while (0) /** @brief Compute distance from a point to a plane. */ @@ -460,11 +460,11 @@ #define DIST_PT_PT(_a, _b) sqrt(DIST_PT_PT_SQ(_a, _b)) /** @brief set translation values of 4x4 matrix with x, y, z values. */ -#define MAT_DELTAS(_m, _x, _y, _z) { \ +#define MAT_DELTAS(_m, _x, _y, _z) do { \ (_m)[MDX] = (_x); \ (_m)[MDY] = (_y); \ (_m)[MDZ] = (_z); \ -} + } while (0) /** @brief set translation values of 4x4 matrix from a vector. */ #define MAT_DELTAS_VEC(_m, _v) \ @@ -478,143 +478,143 @@ MAT_DELTAS(_m, -(_v)[X], -(_v)[Y], -(_v)[Z]) /** @brief get translation values of 4x4 matrix to a vector. */ -#define MAT_DELTAS_GET(_v, _m) { \ +#define MAT_DELTAS_GET(_v, _m) do { \ (_v)[X] = (_m)[MDX]; \ (_v)[Y] = (_m)[MDY]; \ (_v)[Z] = (_m)[MDZ]; \ -} + } while (0) /** * @brief get translation values of 4x4 matrix to a vector, * reversed. */ -#define MAT_DELTAS_GET_NEG(_v, _m) { \ +#define MAT_DELTAS_GET_NEG(_v, _m) do { \ (_v)[X] = -(_m)[MDX]; \ (_v)[Y] = -(_m)[MDY]; \ (_v)[Z] = -(_m)[MDZ]; \ -} + } while (0) /** * @brief increment translation elements in a 4x4 matrix with x, y, z * values. */ -#define MAT_DELTAS_ADD(_m, _x, _y, _z) { \ +#define MAT_DELTAS_ADD(_m, _x, _y, _z) do { \ (_m)[MDX] += (_x); \ (_m)[MDY] += (_y); \ (_m)[MDZ] += (_z); \ -} + } while (0) /** * @brief increment translation elements in a 4x4 matrix from a * vector. */ -#define MAT_DELTAS_ADD_VEC(_m, _v) { \ +#define MAT_DELTAS_ADD_VEC(_m, _v) do { \ (_m)[MDX] += (_v)[X]; \ (_m)[MDY] += (_v)[Y]; \ (_m)[MDZ] += (_v)[Z]; \ -} + } while (0) /** * @brief decrement translation elements in a 4x4 matrix with x, y, z * values. */ -#define MAT_DELTAS_SUB(_m, _x, _y, _z) { \ +#define MAT_DELTAS_SUB(_m, _x, _y, _z) do { \ (_m)[MDX] -= (_x); \ (_m)[MDY] -= (_y); \ (_m)[MDZ] -= (_z); \ -} + } while (0) /** * @brief decrement translation elements in a 4x4 matrix from a * vector. */ -#define MAT_DELTAS_SUB_VEC(_m, _v) { \ +#define MAT_DELTAS_SUB_VEC(_m, _v) do { \ (_m)[MDX] -= (_v)[X]; \ (_m)[MDY] -= (_v)[Y]; \ (_m)[MDZ] -= (_v)[Z]; \ -} + } while (0) /** * @brief decrement translation elements in a 4x4 matrix with x, y, z * values. */ -#define MAT_DELTAS_MUL(_m, _x, _y, _z) { \ +#define MAT_DELTAS_MUL(_m, _x, _y, _z) do { \ (_m)[MDX] *= (_x); \ (_m)[MDY] *= (_y); \ (_m)[MDZ] *= (_z); \ -} + } while (0) /** * @brief decrement translation elements in a 4x4 matrix from a * vector. */ -#define MAT_DELTAS_MUL_VEC(_m, _v) { \ +#define MAT_DELTAS_MUL_VEC(_m, _v) do { \ (_m)[MDX] *= (_v)[X]; \ (_m)[MDY] *= (_v)[Y]; \ (_m)[MDZ] *= (_v)[Z]; \ -} + } while (0) /** @brief set scale of 4x4 matrix from xyz. */ -#define MAT_SCALE(_m, _x, _y, _z) { \ +#define MAT_SCALE(_m, _x, _y, _z) do { \ (_m)[MSX] = _x; \ (_m)[MSY] = _y; \ (_m)[MSZ] = _z; \ -} + } while (0) /** @brief set scale of 4x4 matrix from vector. */ -#define MAT_SCALE_VEC(_m, _v) { \ +#define MAT_SCALE_VEC(_m, _v) do { \ (_m)[MSX] = (_v)[X]; \ (_m)[MSY] = (_v)[Y]; \ (_m)[MSZ] = (_v)[Z]; \ -} + } while (0) /** @brief set uniform scale of 4x4 matrix from scalar. */ #define MAT_SCALE_ALL(_m, _s) (_m)[MSA] = (_s) /** @brief add to scaling elements in a 4x4 matrix from xyz. */ -#define MAT_SCALE_ADD(_m, _x, _y, _z) { \ +#define MAT_SCALE_ADD(_m, _x, _y, _z) do { \ (_m)[MSX] += _x; \ (_m)[MSY] += _y; \ (_m)[MSZ] += _z; \ -} + } while (0) /** @brief add to scaling elements in a 4x4 matrix from vector. */ -#define MAT_SCALE_ADD_VEC(_m, _v) { \ +#define MAT_SCALE_ADD_VEC(_m, _v) do { \ (_m)[MSX] += (_v)[X]; \ (_m)[MSY] += (_v)[Y]; \ (_m)[MSZ] += (_v)[Z]; \ -} + } while (0) /** @brief subtract from scaling elements in a 4x4 matrix from xyz. */ -#define MAT_SCALE_SUB(_m, _x, _y, _z) { \ +#define MAT_SCALE_SUB(_m, _x, _y, _z) do { \ (_m)[MSX] -= _x; \ (_m)[MSY] -= _y; \ (_m)[MSZ] -= _z; \ -} + } while (0) /** * @brief subtract from scaling elements in a 4x4 matrix from * vector. */ -#define MAT_SCALE_SUB_VEC(_m, _v) { \ +#define MAT_SCALE_SUB_VEC(_m, _v) do { \ (_m)[MSX] -= (_v)[X]; \ (_m)[MSY] -= (_v)[Y]; \ (_m)[MSZ] -= (_v)[Z]; \ -} + } while (0) /** @brief multiply scaling elements in a 4x4 matrix from xyz. */ -#define MAT_SCALE_MUL(_m, _x, _y, _z) { \ +#define MAT_SCALE_MUL(_m, _x, _y, _z) do { \ (_m)[MSX] *= _x; \ (_m)[MSY] *= _y; \ (_m)[MSZ] *= _z; \ -} + } while (0) /** @brief multiply scaling elements in a 4x4 matrix from vector. */ -#define MAT_SCALE_MUL_VEC(_m, _v) { \ +#define MAT_SCALE_MUL_VEC(_m, _v) do { \ (_m)[MSX] *= (_v)[X]; \ (_m)[MSY] *= (_v)[Y]; \ (_m)[MSZ] *= (_v)[Z]; \ -} + } while (0) /** @@ -624,23 +624,23 @@ /** @brief Zero a matrix. */ -#define MAT_ZERO(m) { \ +#define MAT_ZERO(m) do { \ (m)[0] = (m)[1] = (m)[2] = (m)[3] = \ (m)[4] = (m)[5] = (m)[6] = (m)[7] = \ (m)[8] = (m)[9] = (m)[10] = (m)[11] = \ (m)[12] = (m)[13] = (m)[14] = (m)[15] = 0.0; \ -} + } while (0) /** @brief Set matrix to identity. */ -#define MAT_IDN(m) { \ +#define MAT_IDN(m) do { \ (m)[1] = (m)[2] = (m)[3] = (m)[4] = \ (m)[6] = (m)[7] = (m)[8] = (m)[9] = \ (m)[11] = (m)[12] = (m)[13] = (m)[14] = 0.0; \ (m)[0] = (m)[5] = (m)[10] = (m)[15] = 1.0; \ -} + } while (0) /** @brief set t to the transpose of matrix m */ -#define MAT_TRANSPOSE(t, m) { \ +#define MAT_TRANSPOSE(t, m) do { \ (t)[0] = (m)[0]; \ (t)[4] = (m)[1]; \ (t)[8] = (m)[2]; \ @@ -657,10 +657,10 @@ (t)[7] = (m)[13]; \ (t)[11] = (m)[14]; \ (t)[15] = (m)[15]; \ -} + } while (0) /** @brief Copy a matrix. */ -#define MAT_COPY(d, s) { \ +#define MAT_COPY(d, s) do { \ (d)[0] = (s)[0]; \ (d)[1] = (s)[1]; \ (d)[2] = (s)[2]; \ @@ -677,321 +677,321 @@ (d)[13] = (s)[13]; \ (d)[14] = (s)[14]; \ (d)[15] = (s)[15]; \ -} + } while (0) /** @brief Set 3D vector at `a' to have coordinates `b', `c', and `d'. */ -#define VSET(a, b, c, d) { \ +#define VSET(a, b, c, d) do { \ (a)[X] = (b); \ (a)[Y] = (c); \ (a)[Z] = (d); \ -} + } while (0) /** @brief Set 2D vector at `a' to have coordinates `b' and `c'. */ -#define V2SET(a, b, c) { \ +#define V2SET(a, b, c) do { \ (a)[X] = (b); \ (a)[Y] = (c); \ -} + } while (0) /** @brief Set 4D vector at `a' to homogeneous coordinates `b', `c', `d', and `e'. */ -#define HSET(a, b, c, d, e) { \ +#define HSET(a, b, c, d, e) do { \ (a)[X] = (b); \ (a)[Y] = (c); \ (a)[Z] = (d); \ (a)[H] = (e); \ -} + } while (0) /** @brief Set all elements of 3D vector to same scalar value. */ -#define VSETALL(a, s) { \ +#define VSETALL(a, s) do { \ (a)[X] = (a)[Y] = (a)[Z] = (s); \ -} + } while (0) /** @brief Set 2D vector elements to same scalar value. */ -#define V2SETALL(a, s) { \ +#define V2SETALL(a, s) do { \ (a)[X] = (a)[Y] = (s); \ -} + } while (0) /** @brief Set 4D vector elements to same scalar value. */ -#define HSETALL(a, s) { \ +#define HSETALL(a, s) do { \ (a)[X] = (a)[Y] = (a)[Z] = (a)[H] = (s); \ -} + } while (0) /** @brief Set all elements of N-vector to same scalar value. */ -#define VSETALLN(v, s, n) { \ +#define VSETALLN(v, s, n) do { \ register int _j; \ for (_j=0; _j<n; _j++) v[_j]=(s); \ -} + } while (0) /** @brief Transfer 3D vector at `b' to vector at `a'. */ -#define VMOVE(a, b) { \ +#define VMOVE(a, b) do { \ (a)[X] = (b)[X]; \ (a)[Y] = (b)[Y]; \ (a)[Z] = (b)[Z]; \ -} + } while (0) /** @brief Move a 2D vector. */ -#define V2MOVE(a, b) { \ +#define V2MOVE(a, b) do { \ (a)[X] = (b)[X]; \ (a)[Y] = (b)[Y]; \ -} + } while (0) /** @brief Move a homogeneous 4-tuple. */ -#define HMOVE(a, b) { \ +#define HMOVE(a, b) do { \ (a)[X] = (b)[X]; \ (a)[Y] = (b)[Y]; \ (a)[Z] = (b)[Z]; \ (a)[W] = (b)[W]; \ -} + } while (0) /** @brief Transfer vector of length `n' at `b' to vector at `a'. */ -#define VMOVEN(a, b, n) { \ +#define VMOVEN(a, b, n) do { \ register int _vmove; \ for (_vmove = 0; _vmove < (n); _vmove++) { \ (a)[_vmove] = (b)[_vmove]; \ } \ -} + } while (0) /** @brief Reverse the direction of 3D vector `b' and store it in `a'. */ -#define VREVERSE(a, b) { \ +#define VREVERSE(a, b) do { \ (a)[X] = -(b)[X]; \ (a)[Y] = -(b)[Y]; \ (a)[Z] = -(b)[Z]; \ -} + } while (0) /** @brief Reverse the direction of 2D vector `b' and store it in `a'. */ -#define V2REVERSE(a, b) { \ +#define V2REVERSE(a, b) do { \ (a)[X] = -(b)[X]; \ (a)[Y] = -(b)[Y]; \ -} + } while (0) /** * @brief Same as VREVERSE, but for a 4-tuple. Also useful on plane_t * objects. */ -#define HREVERSE(a, b) { \ +#define HREVERSE(a, b) do { \ (a)[X] = -(b)[X]; \ (a)[Y] = -(b)[Y]; \ (a)[Z] = -(b)[Z]; \ (a)[W] = -(b)[W]; \ -} + } while (0) /** @brief Add 3D vectors at `b' and `c', store result at `a'. */ -#define VADD2(a, b, c) { \ +#define VADD2(a, b, c) do { \ (a)[X] = (b)[X] + (c)[X]; \ (a)[Y] = (b)[Y] + (c)[Y]; \ (a)[Z] = (b)[Z] + (c)[Z]; \ -} + } while (0) /** @brief Add 2D vectors at `b' and `c', store result at `a'. */ -#define V2ADD2(a, b, c) { \ +#define V2ADD2(a, b, c) do { \ (a)[X] = (b)[X] + (c)[X]; \ (a)[Y] = (b)[Y] + (c)[Y]; \ -} + } while (0) /** @brief Add 4D vectors at `b' and `c', store result at `a'. */ -#define HADD2(a, b, c) { \ +#define HADD2(a, b, c) do { \ (a)[X] = (b)[X] + (c)[X]; \ (a)[Y] = (b)[Y] + (c)[Y]; \ (a)[Z] = (b)[Z] + (c)[Z]; \ (a)[W] = (b)[W] + (c)[W]; \ -} + } while (0) /** * @brief Add vectors of length `n' at `b' and `c', store result at * `a'. */ -#define VADD2N(a, b, c, n) { \ +#define VADD2N(a, b, c, n) do { \ register int _vadd2; \ for (_vadd2 = 0; _vadd2 < (n); _vadd2++) { \ (a)[_vadd2] = (b)[_vadd2] + (c)[_vadd2]; \ } \ -} + } while (0) /** * @brief Subtract 3D vector at `c' from vector at `b', store result at * `a'. */ -#define VSUB2(a, b, c) { \ +#define VSUB2(a, b, c) do { \ (a)[X] = (b)[X] - (c)[X]; \ (a)[Y] = (b)[Y] - (c)[Y]; \ (a)[Z] = (b)[Z] - (c)[Z]; \ -} + } while (0) /** * @brief Subtract 2D vector at `c' from vector at `b', store result at * `a'. */ -#define V2SUB2(a, b, c) { \ +#define V2SUB2(a, b, c) do { \ (a)[X] = (b)[X] - (c)[X]; \ (a)[Y] = (b)[Y] - (c)[Y]; \ -} + } while (0) /** * @brief Subtract 4D vector at `c' from vector at `b', store result at * `a'. */ -#define HSUB2(a, b, c) { \ +#define HSUB2(a, b, c) do { \ (a)[X] = (b)[X] - (c)[X]; \ (a)[Y] = (b)[Y] - (c)[Y]; \ (a)[Z] = (b)[Z] - (c)[Z]; \ (a)[W] = (b)[W] - (c)[W]; \ -} + } while (0) /** * @brief Subtract `n' length vector at `c' from vector at `b', store * result at `a'. */ -#define VSUB2N(a, b, c, n) { \ +#define VSUB2N(a, b, c, n) do { \ register int _vsub2; \ for (_vsub2 = 0; _vsub2 < (n); _vsub2++) { \ (a)[_vsub2] = (b)[_vsub2] - (c)[_vsub2]; \ } \ -} + } while (0) /** @brief 3D Vectors: A = B - C - D */ -#define VSUB3(a, b, c, d) { \ +#define VSUB3(a, b, c, d) do { \ (a)[X] = (b)[X] - (c)[X] - (d)[X]; \ (a)[Y] = (b)[Y] - (c)[Y] - (d)[Y]; \ (a)[Z] = (b)[Z] - (c)[Z] - (d)[Z]; \ -} + } while (0) /** @brief 2D Vectors: A = B - C - D */ -#define V2SUB3(a, b, c, d) { \ +#define V2SUB3(a, b, c, d) do { \ (a)[X] = (b)[X] - (c)[X] - (d)[X]; \ (a)[Y] = (b)[Y] - (c)[Y] - (d)[Y]; \ -} + } while (0) /** @brief 4D Vectors: A = B - C - D */ -#define HSUB3(a, b, c, d) { \ +#define HSUB3(a, b, c, d) do { \ (a)[X] = (b)[X] - (c)[X] - (d)[X]; \ (a)[Y] = (b)[Y] - (c)[Y] - (d)[Y]; \ (a)[Z] = (b)[Z] - (c)[Z] - (d)[Z]; \ (a)[W] = (b)[W] - (c)[W] - (d)[W]; \ -} + } while (0) /** @brief Vectors: A = B - C - D for vectors of length `n'. */ -#define VSUB3N(a, b, c, d, n) { \ +#define VSUB3N(a, b, c, d, n) do { \ register int _vsub3; \ for (_vsub3 = 0; _vsub3 < (n); _vsub3++) { \ (a)[_vsub3] = (b)[_vsub3] - (c)[_vsub3] - (d)[_vsub3]; \ } \ -} + } while (0) /** @brief Add 3 3D vectors at `b', `c', and `d', store result at `a'. */ -#define VADD3(a, b, c, d) { \ +#define VADD3(a, b, c, d) do { \ (a)[X] = (b)[X] + (c)[X] + (d)[X]; \ (a)[Y] = (b)[Y] + (c)[Y] + (d)[Y]; \ (a)[Z] = (b)[Z] + (c)[Z] + (d)[Z]; \ -} + } while (0) /** @brief Add 3 2D vectors at `b', `c', and `d', store result at `a'. */ -#define V2ADD3(a, b, c, d) { \ +#define V2ADD3(a, b, c, d) do { \ (a)[X] = (b)[X] + (c)[X] + (d)[X]; \ (a)[Y] = (b)[Y] + (c)[Y] + (d)[Y]; \ -} + } while (0) /** @brief Add 3 4D vectors at `b', `c', and `d', store result at `a'. */ -#define HADD3(a, b, c, d) { \ +#define HADD3(a, b, c, d) do { \ (a)[X] = (b)[X] + (c)[X] + (d)[X]; \ (a)[Y] = (b)[Y] + (c)[Y] + (d)[Y]; \ (a)[Z] = (b)[Z] + (c)[Z] + (d)[Z]; \ (a)[W] = (b)[W] + (c)[W] + (d)[W]; \ -} + } while (0) /** * @brief Add 3 vectors of length `n' at `b', `c', and `d', store * result at `a'. */ -#define VADD3N(a, b, c, d, n) { \ +#define VADD3N(a, b, c, d, n) do { \ register int _vadd3; \ for (_vadd3 = 0; _vadd3 < (n); _vadd3++) { \ (a)[_vadd3] = (b)[_vadd3] + (c)[_vadd3] + (d)[_vadd3]; \ } \ -} + } while (0) /** * @brief Add 4 vectors at `b', `c', `d', and `e', store result at * `a'. */ -#define VADD4(a, b, c, d, e) { \ +#define VADD4(a, b, c, d, e) do { \ (a)[X] = (b)[X] + (c)[X] + (d)[X] + (e)[X]; \ (a)[Y] = (b)[Y] + (c)[Y] + (d)[Y] + (e)[Y]; \ (a)[Z] = (b)[Z] + (c)[Z] + (d)[Z] + (e)[Z]; \ -} + } while (0) /** * @brief Add 4 2D vectors at `b', `c', `d', and `e', store result at * `a'. */ -#define V2ADD4(a, b, c, d, e) { \ +#define V2ADD4(a, b, c, d, e) do { \ (a)[X] = (b)[X] + (c)[X] + (d)[X] + (e)[X]; \ (a)[Y] = (b)[Y] + (c)[Y] + (d)[Y] + (e)[Y]; \ -} + } while (0) /** * @brief Add 4 4D vectors at `b', `c', `d', and `e', store result at * `a'. */ -#define HADD4(a, b, c, d, e) { \ +#define HADD4(a, b, c, d, e) do { \ (a)[X] = (b)[X] + (c)[X] + (d)[X] + (e)[X]; \ (a)[Y] = (b)[Y] + (c)[Y] + (d)[Y] + (e)[Y]; \ (a)[Z] = (b)[Z] + (c)[Z] + (d)[Z] + (e)[Z]; \ (a)[W] = (b)[W] + (c)[W] + (d)[W] + (e)[W]; \ -} + } while (0) /** * @brief Add 4 `n' length vectors at `b', `c', `d', and `e', store * result at `a'. */ -#define VADD4N(a, b, c, d, e, n) { \ +#define VADD4N(a, b, c, d, e, n) do { \ register int _vadd4; \ for (_vadd4 = 0; _vadd4 < (n); _vadd4++) { \ (a)[_vadd4] = (b)[_vadd4] + (c)[_vadd4] + (d)[_vadd4] + (e)[_vadd4]; \ } \ -} + } while (0) /** @brief Scale 3D vector at `b' by scalar `c', store result at `a'. */ -#define VSCALE(a, b, c) { \ +#define VSCALE(a, b, c) do { \ (a)[X] = (b)[X] * (c); \ (a)[Y] = (b)[Y] * (c); \ (a)[Z] = (b)[Z] * (c); \ -} + } while (0) /** @brief Scale 2D vector at `b' by scalar `c', store result at `a'. */ -#define V2SCALE(a, b, c) { \ +#define V2SCALE(a, b, c) do { \ (a)[X] = (b)[X] * (c); \ (a)[Y] = (b)[Y] * (c); \ -} + } while (0) /** @brief Scale 4D vector at `b' by scalar `c', store result at `a'. */ -#define HSCALE(a, b, c) { \ +#define HSCALE(a, b, c) do { \ (a)[X] = (b)[X] * (c); \ (a)[Y] = (b)[Y] * (c); \ (a)[Z] = (b)[Z] * (c); \ (a)[W] = (b)[W] * (c); \ -} + } while (0) /** * @brief Scale vector of length `n' at `b' by scalar `c', store * result at `a' */ -#define VSCALEN(a, b, c, n) { \ +#define VSCALEN(a, b, c, n) do { \ register int _vscale; \ for (_vscale = 0; _vscale < (n); _vscale++) { \ (a)[_vscale] = (b)[_vscale] * (c); \ } \ -} + } while (0) /** @brief Normalize vector `a' to be a unit vector. */ -#define VUNITIZE(a) { \ +#define VUNITIZE(a) do { \ register double _f = MAGSQ(a); \ if (! NEAR_EQUAL(_f, 1.0, VUNITIZE_TOL)) { \ _f = sqrt(_f); \ @@ -1002,98 +1002,98 @@ (a)[X] *= _f; (a)[Y] *= _f; (a)[Z] *= _f; \ } \ } \ -} + } while (0) /** @brief If vector magnitude is too small, return an error code. */ -#define VUNITIZE_RET(a, ret) { \ +#define VUNITIZE_RET(a, ret) do { \ register double _f; \ _f = MAGNITUDE(a); \ if (_f < VDIVIDE_TOL) return ret; \ _f = 1.0/_f; \ (a)[X] *= _f; (a)[Y] *= _f; (a)[Z] *= _f; \ -} + } while (0) /** * @brief Find the sum of two points, and scale the result. Often * used to find the midpoint. */ -#define VADD2SCALE(o, a, b, s) { \ +#define VADD2SCALE(o, a, b, s) do { \ (o)[X] = ((a)[X] + (b)[X]) * (s); \ (o)[Y] = ((a)[Y] + (b)[Y]) * (s); \ (o)[Z] = ((a)[Z] + (b)[Z]) * (s); \ -} + } while (0) -#define VADD2SCALEN(o, a, b, n) { \ +#define VADD2SCALEN(o, a, b, n) do { \ register int _vadd2scale; \ for (_vadd2scale = 0; \ _vadd2scale < (n); \ _vadd2scale++) { \ (o)[_vadd2scale] = ((a)[_vadd2scale] + (b)[_vadd2scale]) * (s); \ } \ -} + } while (0) /** * @brief Find the difference between two points, and scale result. * Often used to compute bounding sphere radius given rpp points. */ -#define VSUB2SCALE(o, a, b, s) { \ +#define VSUB2SCALE(o, a, b, s) do { \ (o)[X] = ((a)[X] - (b)[X]) * (s); \ (o)[Y] = ((a)[Y] - (b)[Y]) * (s); \ (o)[Z] = ((a)[Z] - (b)[Z]) * (s); \ -} + } while (0) -#define VSUB2SCALEN(o, a, b, n) { \ +#define VSUB2SCALEN(o, a, b, n) do { \ register int _vsub2scale; \ for (_vsub2scale = 0; \ _vsub2scale < (n); \ _vsub2scale++) { \ (o)[_vsub2scale] = ((a)[_vsub2scale] - (b)[_vsub2scale]) * (s); \ } \ -} + } while (0) /** @brief Combine together several vectors, scaled by a scalar. */ -#define VCOMB3(o, a, b, c, d, e, f) { \ +#define VCOMB3(o, a, b, c, d, e, f) do { \ (o)[X] = (a) * (b)[X] + (c) * (d)[X] + (e) * (f)[X]; \ (o)[Y] = (a) * (b)[Y] + (c) * (d)[Y] + (e) * (f)[Y]; \ (o)[Z] = (a) * (b)[Z] + (c) * (d)[Z] + (e) * (f)[Z]; \ -} + } while (0) -#define VCOMB3N(o, a, b, c, d, e, f, n) { \ +#define VCOMB3N(o, a, b, c, d, e, f, n) do { \ register int _vcomb3; \ for (_vcomb3 = 0; \ _vcomb3 < (n); \ _vcomb3++) { \ (o)[_vcomb3] = (a) * (b)[_vcomb3] + (c) * (d)[_vcomb3] + (e) * (f)[_vcomb3]; \ } \ -} + } while (0) -#define VCOMB2(o, a, b, c, d) { \ +#define VCOMB2(o, a, b, c, d) do { \ (o)[X] = (a) * (b)[X] + (c) * (d)[X]; \ (o)[Y] = (a) * (b)[Y] + (c) * (d)[Y]; \ (o)[Z] = (a) * (b)[Z] + (c) * (d)[Z]; \ -} + } while (0) -#define VCOMB2N(o, a, b, c, d, n) { \ +#define VCOMB2N(o, a, b, c, d, n) do { \ register int _vcomb2; \ for (_vcomb2 = 0; \ _vcomb2 < (n); \ _vcomb2++) { \ (o)[_vcomb2] = (a) * (b)[_vcomb2] + (c) * (d)[_vcomb2]; \ } \ -} + } while (0) -#define VJOIN4(a, b, c, d, e, f, g, h, i, j) { \ +#define VJOIN4(a, b, c, d, e, f, g, h, i, j) do { \ (a)[X] = (b)[X] + (c)*(d)[X] + (e)*(f)[X] + (g)*(h)[X] + (i)*(j)[X]; \ (a)[Y] = (b)[Y] + (c)*(d)[Y] + (e)*(f)[Y] + (g)*(h)[Y] + (i)*(j)[Y]; \ (a)[Z] = (b)[Z] + (c)*(d)[Z] + (e)*(f)[Z] + (g)*(h)[Z] + (i)*(j)[Z]; \ -} + } while (0) -#define VJOIN3(a, b, c, d, e, f, g, h) { \ +#define VJOIN3(a, b, c, d, e, f, g, h) do { \ (a)[X] = (b)[X] + (c)*(d)[X] + (e)*(f)[X] + (g)*(h)[X]; \ (a)[Y] = (b)[Y] + (c)*(d)[Y] + (e)*(f)[Y] + (g)*(h)[Y]; \ (a)[Z] = (b)[Z] + (c)*(d)[Z] + (e)*(f)[Z] + (g)*(h)[Z]; \ -} + } while (0) /** @@ -1102,11 +1102,11 @@ * scalar `c' times vector at `d' plus * scalar `e' times vector at `f' */ -#define VJOIN2(a, b, c, d, e, f) { \ +#define VJOIN2(a, b, c, d, e, f) do { \ (a)[X] = (b)[X] + (c) * (d)[X] + (e) * (f)[X]; \ (a)[Y] = (b)[Y] + (c) * (d)[Y] + (e) * (f)[Y]; \ (a)[Z] = (b)[Z] + (c) * (d)[Z] + (e) * (f)[Z]; \ -} + } while (0) /** * @brief Compose 2D vector at `a' of: @@ -1114,10 +1114,10 @@ * scalar `c' times vector at `d' plus * scalar `e' times vector at `f' */ -#define V2JOIN2(a, b, c, d, e, f) { \ +#define V2JOIN2(a, b, c, d, e, f) do { \ (a)[X] = (b)[X] + (c) * (d)[X] + (e) * (f)[X]; \ (a)[Y] = (b)[Y] + (c) * (d)[Y] + (e) * (f)[Y]; \ -} + } while (0) /** * @brief Compose 4D vector at `a' of: @@ -1125,49 +1125,49 @@ * scalar `c' times vector at `d' plus * scalar `e' times vector at `f' */ -#define HJOIN2(a, b, c, d, e, f) { \ +#define HJOIN2(a, b, c, d, e, f) do { \ (a)[X] = (b)[X] + (c) * (d)[X] + (e) * (f)[X]; \ (a)[Y] = (b)[Y] + (c) * (d)[Y] + (e) * (f)[Y]; \ (a)[Z] = (b)[Z] + (c) * (d)[Z] + (e) * (f)[Z]; \ (a)[W] = (b)[W] + (c) * (d)[W] + (e) * (f)[W]; \ -} + } while (0) -#define VJOIN2N(a, b, c, d, e, f, n) { \ +#define VJOIN2N(a, b, c, d, e, f, n) do { \ register int _vjoin2; \ for (_vjoin2 = 0; \ _vjoin2 < (n); \ _vjoin2++) { \ (a)[_vjoin2] = (b)[_vjoin2] + (c) * (d)[_vjoin2] + (e) * (f)[_vjoin2]; \ } \ -} + } while (0) -#define VJOIN1(a, b, c, d) { \ +#define VJOIN1(a, b, c, d) do { \ (a)[X] = (b)[X] + (c) * (d)[X]; \ (a)[Y] = (b)[Y] + (c) * (d)[Y]; \ (a)[Z] = (b)[Z] + (c) * (d)[Z]; \ -} + } while (0) -#define V2JOIN1(a, b, c, d) { \ +#define V2JOIN1(a, b, c, d) do { \ (a)[X] = (b)[X] + (c) * (d)[X]; \ (a)[Y] = (b)[Y] + (c) * (d)[Y]; \ -} + } while (0) -#define HJOIN1(a, b, c, d) { \ +#define HJOIN1(a, b, c, d) do { \ (a)[X] = (b)[X] + (c) * (d)[X]; \ (a)[Y] = (b)[Y] + (c) * (d)[Y]; \ (a)[Z] = (b)[Z] + (c) * (d)[Z]; \ (a)[W] = (b)[W] + (c) * (d)[W]; \ -} + } while (0) -#define VJOIN1N(a, b, c, d, n) { \ +#define VJOIN1N(a, b, c, d, n) do { \ register int _vjoin1; \ for (_vjoin1 = 0; \ _vjoin1 < (n); \ _vjoin1++) { \ (a)[_vjoin1] = (b)[_vjoin1] + (c) * (d)[_vjoin1]; \ } \ -} + } while (0) /** @@ -1175,20 +1175,20 @@ * scalar `b' times vector at `c' plus * scalar `d' times vector at `e' */ -#define VBLEND2(a, b, c, d, e) { \ +#define VBLEND2(a, b, c, d, e) do { \ (a)[X] = (b) * (c)[X] + (d) * (e)[X]; \ (a)[Y] = (b) * (c)[Y] + (d) * (e)[Y]; \ (a)[Z] = (b) * (c)[Z] + (d) * (e)[Z]; \ -} + } while (0) -#define VBLEND2N(a, b, c, d, e, n) { \ +#define VBLEND2N(a, b, c, d, e, n) do { \ register int _vblend2; \ for (_vblend2 = 0; \ _vblend2 < (n); \ _vblend2++) { \ (a)[_vblend2] = (b) * (c)[_vblend2] + (d) * (e)[_vblend2]; \ } \ -} + } while (0) /** @@ -1196,10 +1196,10 @@ * vector `c' is the component of `a' parallel to `b' * " `d' " " " " " orthogonal " " */ -#define VPROJECT(a, b, c, d) { \ +#define VPROJECT(a, b, c, d) do { \ VSCALE(c, b, VDOT(a, b) / VDOT(b, b)); \ VSUB2(d, a, c); \ -} + } while (0) /** @brief Return scalar magnitude squared of vector at `a' */ #define MAGSQ(a) ((a)[X]*(a)[X] + (a)[Y]*(a)[Y] + (a)[Z]*(a)[Z]) @@ -1223,11 +1223,11 @@ * result vector points "out" of the plane. This outward pointing * normal is the BRL-CAD convention. */ -#define VCROSS(a, b, c) { \ +#define VCROSS(a, b, c) do { \ (a)[X] = (b)[Y] * (c)[Z] - (b)[Z] * (c)[Y]; \ (a)[Y] = (b)[Z] * (c)[X] - (b)[X] * (c)[Z]; \ (a)[Z] = (b)[X] * (c)[Y] - (b)[Y] * (c)[X]; \ -} + } while (0) /** * Return the analog of a cross product for 2D vectors `a' and `b' @@ -1314,30 +1314,30 @@ #endif /** @brief Vector element multiplication. Really: diagonal matrix X vect. */ -#define VELMUL(a, b, c) { \ +#define VELMUL(a, b, c) do { \ (a)[X] = (b)[X] * (c)[X]; \ (a)[Y] = (b)[Y] * (c)[Y]; \ (a)[Z] = (b)[Z] * (c)[Z]; \ -} + } while (0) -#define VELMUL3(a, b, c, d) { \ +#define VELMUL3(a, b, c, d) do { \ (a)[X] = (b)[X] * (c)[X] * (d)[X]; \ (a)[Y] = (b)[Y] * (c)[Y] * (d)[Y]; \ (a)[Z] = (b)[Z] * (c)[Z] * (d)[Z]; \ -} + } while (0) /** @brief Similar to VELMUL. */ -#define VELDIV(a, b, c) { \ +#define VELDIV(a, b, c) do { \ (a)[0] = (b)[0] / (c)[0]; \ (a)[1] = (b)[1] / (c)[1]; \ (a)[2] = (b)[2] / (c)[2]; \ -} + } while (0) /** * @brief Given a direction vector, compute the inverses of each element. * When division by zero would have occurred, mark inverse as INFINITY. */ -#define VINVDIR(_inv, _dir) { \ +#define VINVDIR(_inv, _dir) do { \ if ((_dir)[X] < -SQRT_SMALL_FASTF || (_dir)[X] > SQRT_SMALL_FASTF) { \ (_inv)[X]=1.0/(_dir)[X]; \ } else { \ @@ -1356,111 +1356,111 @@ (_dir)[Z] = 0.0; \ (_inv)[Z] = INFINITY; \ } \ - } + } while (0) /** * @brief Apply the 3x3 part of a mat_t to a 3-tuple. This rotates a * vector without scaling it (changing its length). */ -#define MAT3X3VEC(o, mat, vec) { \ +#define MAT3X3VEC(o, mat, vec) do { \ (o)[X] = (mat)[X]*(vec)[X]+(mat)[Y]*(vec)[Y] + (mat)[ 2]*(vec)[Z]; \ (o)[Y] = (mat)[4]*(vec)[X]+(mat)[5]*(vec)[Y] + (mat)[ 6]*(vec)[Z]; \ (o)[Z] = (mat)[8]*(vec)[X]+(mat)[9]*(vec)[Y] + (mat)[10]*(vec)[Z]; \ -} + } while (0) /** @brief Multiply a 3-tuple by the 3x3 part of a mat_t. */ -#define VEC3X3MAT(o, i, m) { \ +#define VEC3X3MAT(o, i, m) do { \ (o)[X] = (i)[X]*(m)[X] + (i)[Y]*(m)[4] + (i)[Z]*(m)[8]; \ (o)[Y] = (i)[X]*(m)[1] + (i)[Y]*(m)[5] + (i)[Z]*(m)[9]; \ (o)[Z] = (i)[X]*(m)[2] + (i)[Y]*(m)[6] + (i)[Z]*(m)[10]; \ -} + } while (0) /** @brief Apply the 3x3 part of a mat_t to a 2-tuple (Z part=0). */ -#define MAT3X2VEC(o, mat, vec) { \ +#define MAT3X2VEC(o, mat, vec) do { \ (o)[X] = (mat)[0]*(vec)[X] + (mat)[Y]*(vec)[Y]; \ (o)[Y] = (mat)[4]*(vec)[X] + (mat)[5]*(vec)[Y]; \ (o)[Z] = (mat)[8]*(vec)[X] + (mat)[9]*(vec)[Y]; \ -} + } while (0) /** @brief Multiply a 2-tuple (Z=0) by the 3x3 part of a mat_t. */ -#define VEC2X3MAT(o, i, m) { \ +#define VEC2X3MAT(o, i, m) do { \ (o)[X] = (i)[X]*(m)[0] + (i)[Y]*(m)[4]; \ (o)[Y] = (i)[X]*(m)[1] + (i)[Y]*(m)[5]; \ (o)[Z] = (i)[X]*(m)[2] + (i)[Y]*(m)[6]; \ -} + } while (0) /** * @brief Apply a 4x4 matrix to a 3-tuple which is an absolute Point * in space. Output and input points should be separate arrays. */ -#define MAT4X3PNT(o, m, i) { \ +#define MAT4X3PNT(o, m, i) do { \ register double _f; \ _f = 1.0/((m)[12]*(i)[X] + (m)[13]*(i)[Y] + (m)[14]*(i)[Z] + (m)[15]); \ (o)[X]=((m)[0]*(i)[X] + (m)[1]*(i)[Y] + (m)[ 2]*(i)[Z] + (m)[3]) * _f; \ (o)[Y]=((m)[4]*(i)[X] + (m)[5]*(i)[Y] + (m)[ 6]*(i)[Z] + (m)[7]) * _f; \ (o)[Z]=((m)[8]*(i)[X] + (m)[9]*(i)[Y] + (m)[10]*(i)[Z] + (m)[11])* _f; \ -} + } while (0) /** * @brief Multiply an Absolute 3-Point by a full 4x4 matrix. Output * and input points should be separate arrays. */ -#define PNT3X4MAT(o, i, m) { \ +#define PNT3X4MAT(o, i, m) do { \ register double _f; \ _f = 1.0/((i)[X]*(m)[3] + (i)[Y]*(m)[7] + (i)[Z]*(m)[11] + (m)[15]); \ (o)[X]=((i)[X]*(m)[0] + (i)[Y]*(m)[4] + (i)[Z]*(m)[8] + (m)[12]) * _f; \ (o)[Y]=((i)[X]*(m)[1] + (i)[Y]*(m)[5] + (i)[Z]*(m)[9] + (m)[13]) * _f; \ (o)[Z]=((i)[X]*(m)[2] + (i)[Y]*(m)[6] + (i)[Z]*(m)[10] + (m)[14])* _f; \ -} + } while (0) /** * @brief Multiply an Absolute hvect_t 4-Point by a full 4x4 matrix. * Output and input points should be separate arrays. */ -#define MAT4X4PNT(o, m, i) { \ +#define MAT4X4PNT(o, m, i) do { \ (o)[X]=(m)[ 0]*(i)[X] + (m)[ 1]*(i)[Y] + (m)[ 2]*(i)[Z] + (m)[ 3]*(i)[H]; \ (o)[Y]=(m)[ 4]*(i)[X] + (m)[ 5]*(i)[Y] + (m)[ 6]*(i)[Z] + (m)[ 7]*(i)[H]; \ (o)[Z]=(m)[ 8]*(i)[X] + (m)[ 9]*(i)[Y] + (m)[10]*(i)[Z] + (m)[11]*(i)[H]; \ (o)[H]=(m)[12]*(i)[X] + (m)[13]*(i)[Y] + (m)[14]*(i)[Z] + (m)[15]*(i)[H]; \ -} + } while (0) /** * @brief Apply a 4x4 matrix to a 3-tuple which is a relative Vector * in space. This macro can scale the length of the vector if [15] != * 1.0. Output and input vectors should be separate arrays. */ -#define MAT4X3VEC(o, m, i) { \ +#define MAT4X3VEC(o, m, i) do { \ register double _f; \ _f = 1.0/((m)[15]); \ (o)[X] = ((m)[0]*(i)[X] + (m)[1]*(i)[Y] + (m)[ 2]*(i)[Z]) * _f; \ (o)[Y] = ((m)[4]*(i)[X] + (m)[5]*(i)[Y] + (m)[ 6]*(i)[Z]) * _f; \ (o)[Z] = ((m)[8]*(i)[X] + (m)[9]*(i)[Y] + (m)[10]*(i)[Z]) * _f; \ -} + } while (0) -#define MAT4XSCALOR(o, m, i) { \ +#define MAT4XSCALOR(o, m, i) do { \ (o) = (i) / (m)[15]; \ -} + } while (0) /** * @brief Multiply a Relative 3-Vector by most of a 4x4 matrix. * Output and input vectors should be separate arrays. */ -#define VEC3X4MAT(o, i, m) { \ +#define VEC3X4MAT(o, i, m) do { \ register double _f; \ _f = 1.0/((m)[15]); \ (o)[X] = ((i)[X]*(m)[0] + (i)[Y]*(m)[4] + (i)[Z]*(m)[8]) * _f; \ (o)[Y] = ((i)[X]*(m)[1] + (i)[Y]*(m)[5] + (i)[Z]*(m)[9]) * _f; \ (o)[Z] = ((i)[X]*(m)[2] + (i)[Y]*(m)[6] + (i)[Z]*(m)[10]) * _f; \ -} + } while (0) /** @brief Multiply a Relative 2-Vector by most of a 4x4 matrix. */ -#define VEC2X4MAT(o, i, m) { \ +#define VEC2X4MAT(o, i, m) do { \ register double _f; \ _f = 1.0/((m)[15]); \ (o)[X] = ((i)[X]*(m)[0] + (i)[Y]*(m)[4]) * _f; \ (o)[Y] = ((i)[X]*(m)[1] + (i)[Y]*(m)[5]) * _f; \ (o)[Z] = ((i)[X]*(m)[2] + (i)[Y]*(m)[6]) * _f; \ -} + } while (0) /** @brief Test a vector for non-unit length. */ #define BN_VEC_NON_UNIT_LEN(_vec) \ @@ -1475,27 +1475,27 @@ #define V_MAX(r, s) if ((r) < (s)) r = (s) -#define VMIN(r, s) { \ +#define VMIN(r, s) do { \ V_MIN((r)[X], (s)[X]); V_MIN((r)[Y], (s)[Y]); V_MIN((r)[Z], (s)[Z]); \ -} + } while (0) -#define VMAX(r, s) { \ +#define VMAX(r, s) do { \ V_MAX((r)[X], (s)[X]); V_MAX((r)[Y], (s)[Y]); V_MAX((r)[Z], (s)[Z]); \ -} + } while (0) -#define VMINMAX(min, max, pt) { \ +#define VMINMAX(min, max, pt) do { \ VMIN((min), (pt)); VMAX((max), (pt)); \ -} + } while (0) /** * @brief Divide out homogeneous parameter from hvect_t, creating * vect_t. */ -#define HDIVIDE(a, b) { \ +#define HDIVIDE(a, b) do { \ (a)[X] = (b)[X] / (b)[H]; \ (a)[Y] = (b)[Y] / (b)[H]; \ (a)[Z] = (b)[Z] / (b)[H]; \ -} + } while (0) /** * @brief Some 2-D versions of the 3-D macros given above. @@ -1539,22 +1539,22 @@ * Alternatively, in degrees: * QUAT_FROM_ROT_DEG(quat, 180.0, 1.0, 0.0, 0.0, 0.0); */ -#define QUAT_FROM_ROT(q, r, x, y, z) { \ +#define QUAT_FROM_ROT(q, r, x, y, z) do { \ register fastf_t _rot = (r) * 0.5; \ QSET(q, x, y, z, cos(_rot)); \ VUNITIZE(q); \ _rot = sin(_rot); /* _rot is really just a temp variable now */ \ VSCALE(q, q, _rot); \ -} + } while (0) -#define QUAT_FROM_VROT(q, r, v) { \ +#define QUAT_FROM_VROT(q, r, v) do { \ register fastf_t _rot = (r) * 0.5; \ VMOVE(q, v); \ VUNITIZE(q); \ (q)[W] = cos(_rot); \ _rot = sin(_rot); /* _rot is really just a temp variable now */ \ VSCALE(q, q, _rot); \ -} + } while (0) #define QUAT_FROM_VROT_DEG(q, r, v) \ QUAT_FROM_VROT(q, ((r)*DEG2RAD), v) @@ -1567,58 +1567,58 @@ * @brief Set quaternion at `a' to have coordinates `b', `c', `d', and * `e'. */ -#define QSET(a, b, c, d, e) { \ +#define QSET(a, b, c, d, e) do { \ (a)[X] = (b); \ (a)[Y] = (c); \ (a)[Z] = (d); \ (a)[W] = (e); \ -} + } while (0) /** @brief Transfer quaternion at `b' to quaternion at `a'. */ -#define QMOVE(a, b) { \ +#define QMOVE(a, b) do { \ (a)[X] = (b)[X]; \ (a)[Y] = (b)[Y]; \ (a)[Z] = (b)[Z]; \ (a)[W] = (b)[W]; \ -} + } while (0) /** @brief Add quaternions at `b' and `c', store result at `a'. */ -#define QADD2(a, b, c) { \ +#define QADD2(a, b, c) do { \ (a)[X] = (b)[X] + (c)[X]; \ (a)[Y] = (b)[Y] + (c)[Y]; \ (a)[Z] = (b)[Z] + (c)[Z]; \ (a)[W] = (b)[W] + (c)[W]; \ -} + } while (0) /** * @brief Subtract quaternion at `c' from quaternion at `b', store * result at `a'. */ -#define QSUB2(a, b, c) { \ +#define QSUB2(a, b, c) do { \ (a)[X] = (b)[X] - (c)[X]; \ (a)[Y] = (b)[Y] - (c)[Y]; \ (a)[Z] = (b)[Z] - (c)[Z]; \ (a)[W] = (b)[W] - (c)[W]; \ -} + } while (0) /** * @brief Scale quaternion at `b' by scalar `c', store result at * `a'. */ -#define QSCALE(a, b, c) { \ +#define QSCALE(a, b, c) do { \ (a)[X] = (b)[X] * (c); \ (a)[Y] = (b)[Y] * (c); \ (a)[Z] = (b)[Z] * (c); \ (a)[W] = (b)[W] * (c); \ -} + } while (0) /** @brief Normalize quaternion 'a' to be a unit quaternion. */ -#define QUNITIZE(a) { \ +#define QUNITIZE(a) do { \ register double _f; \ _f = QMAGNITUDE(a); \ if (_f < VDIVIDE_TOL) _f = 0.0; else _f = 1.0/_f; \ (a)[X] *= _f; (a)[Y] *= _f; (a)[Z] *= _f; (a)[W] *= _f; \ -} + } while (0) /** @brief Return scalar magnitude squared of quaternion at `a'. */ #define QMAGSQ(a) \ @@ -1640,30 +1640,30 @@ * VCROSS(temp, b, c); * VJOIN2(a, temp, b[W], c, c[W], b); */ -#define QMUL(a, b, c) { \ +#define QMUL(a, b, c) do { \ (a)[W] = (b)[W]*(c)[W] - (b)[X]*(c)[X] - (b)[Y]*(c)[Y] - (b)[Z]*(c)[Z]; \ (a)[X] = (b)[W]*(c)[X] + (b)[X]*(c)[W] + (b)[Y]*(c)[Z] - (b)[Z]*(c)[Y]; \ (a)[Y] = (b)[W]*(c)[Y] + (b)[Y]*(c)[W] + (b)[Z]*(c)[X] - (b)[X]*(c)[Z]; \ (a)[Z] = (b)[W]*(c)[Z] + (b)[Z]*(c)[W] + (b)[X]*(c)[Y] - (b)[Y]*(c)[X]; \ -} + } while (0) /** @brief Conjugate quaternion */ -#define QCONJUGATE(a, b) { \ +#define QCONJUGATE(a, b) do { \ (a)[X] = -(b)[X]; \ (a)[Y] = -(b)[Y]; \ (a)[Z] = -(b)[Z]; \ (a)[W] = (b)[W]; \ -} + } while (0) /** @brief Multiplicative inverse quaternion */ -#define QINVERSE(a, b) { \ +#define QINVERSE(a, b) do { \ register double _f = QMAGSQ(b); \ if (_f < VDIVIDE_TOL) _f = 0.0; else _f = 1.0/_f; \ (a)[X] = -(b)[X] * _f; \ (a)[Y] = -(b)[Y] * _f; \ (a)[Z] = -(b)[Z] * _f; \ (a)[W] = (b)[W] * _f; \ -} + } while (0) /** * @brief Blend into quaternion `a' @@ -1671,12 +1671,12 @@ * scalar `b' times quaternion at `c' plus * scalar `d' times quaternion at `e' */ -#define QBLEND2(a, b, c, d, e) { \ +#define QBLEND2(a, b, c, d, e) do { \ (a)[X] = (b) * (c)[X] + (d) * (e)[X]; \ (a)[Y] = (b) * (c)[Y] + (d) * (e)[Y]; \ (a)[Z] = (b) * (c)[Z] + (d) * (e)[Z]; \ (a)[W] = (b) * (c)[W] + (d) * (e)[W]; \ -} + } while (0) /** * Macros for dealing with 3-D "extents", aka bounding boxes, that are @@ -1762,18 +1762,18 @@ (_lo1)[Z] >= (_lo2)[Z] && (_hi1)[Z] <= (_hi2)[Z]) /** Convert an azimuth/elevation to a direction vector. */ -#define V3DIR_FROM_AZEL(_d, _a, _e) { \ +#define V3DIR_FROM_AZEL(_d, _a, _e) do { \ register fastf_t _c_e = cos(_e); \ (_d)[X] = cos(_a) * _c_e; \ (_d)[Y] = sin(_a) * _c_e; \ (_d)[Z] = sin(_e); \ -} + } while (0) /** Convert a direction vector to azimuth/elevation (in radians). */ -#define AZEL_FROM_V3DIR(_a, _e, _d) { \ +#define AZEL_FROM_V3DIR(_a, _e, _d) do { \ (_a) = ((NEAR_ZERO((_d)[X], SMALL_FASTF)) && (NEAR_ZERO((_d)[Y], SMALL_FASTF))) ? 0.0 : atan2(-((_d)[Y]), -((_d)[X])) * -RAD2DEG; \ (_e) = atan2(-((_d)[Z]), sqrt((_d)[X]*(_d)[X] + (_d)[Y]*(_d)[Y])) * -RAD2DEG; \ -} + } while (0) /** Swap two 3D vectors */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2013-03-22 13:50:27
|
Revision: 54822 http://brlcad.svn.sourceforge.net/brlcad/?rev=54822&view=rev Author: brlcad Date: 2013-03-22 13:50:20 +0000 (Fri, 22 Mar 2013) Log Message: ----------- document the reason for the do while construct Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2013-03-22 13:39:23 UTC (rev 54821) +++ brlcad/trunk/include/vmath.h 2013-03-22 13:50:20 UTC (rev 54822) @@ -75,12 +75,16 @@ * storage, distinct from the input parameters, except where noted. * * When writing macros like this, it is very important that any - * variables which are declared within code blocks inside a macro - * start with an underscore. This (hopefully) minimizes any name - * conflicts with user-provided parameters. For example: + * variables declared within a macro code blocks start with an + * underscore in order to (hopefully) minimize any name conflicts with + * user-provided parameters, such as _f in the following example: * - * { register double _f; stuff; } + * #define ABC() do { register double _f; do stuff; } while (0) * + * All of the macros that introduce a scope like the preceeding + * example are written as do { } while (0) loops in order to require + * callers provide a trailing semicolon (e.g., ABC();). This helps + * preserve source code formatting. */ #ifndef __VMATH_H__ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2013-03-22 21:02:43
|
Revision: 54845 http://brlcad.svn.sourceforge.net/brlcad/?rev=54845&view=rev Author: brlcad Date: 2013-03-22 21:02:33 +0000 (Fri, 22 Mar 2013) Log Message: ----------- increase the precision of all our vmath math constants to 36 digits. in the process, found an error in M_PI_4 but it was below double-precision. Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2013-03-22 20:12:06 UTC (rev 54844) +++ brlcad/trunk/include/vmath.h 2013-03-22 21:02:33 UTC (rev 54845) @@ -107,66 +107,66 @@ __BEGIN_DECLS #ifndef M_ -# define M_ XXX /**< */ +# define M_ XXX /**< all with 36-digits of precision */ #endif #ifndef M_1_PI -# define M_1_PI 0.31830988618379067153776752675 /**< 1/pi */ +# define M_1_PI 0.318309886183790671537767526745028724 /**< 1/pi */ #endif #ifndef M_2_PI -# define M_2_PI 0.63661977236758134307553505349 /**< 2/pi */ +# define M_2_PI 0.636619772367581343075535053490057448 /**< 2/pi */ #endif #ifndef M_2_SQRTPI -# define M_2_SQRTPI 1.12837916709551257389615890312 /**< 2/sqrt(pi) */ +# define M_2_SQRTPI 1.12837916709551257389615890312154517 /**< 2/sqrt(pi) */ #endif #ifndef M_E -# define M_E 2.71828182845904523536028747135 /**< e */ +# define M_E 2.71828182845904523536028747135266250 /**< e */ #endif #ifndef M_EULER -# define M_EULER 0.57721566490153286060651209008 /**< Euler's constant */ +# define M_EULER 0.577215664901532860606512090082402431 /**< Euler's constant */ #endif #ifndef M_LOG2E -# define M_LOG2E 1.44269504088896340735992468100 /**< log_2(e) */ +# define M_LOG2E 1.44269504088896340735992468100189214 /**< log_2(e) */ #endif #ifndef M_LOG10E -# define M_LOG10E 0.43429448190325182765112891892 /**< log_10(e) */ +# define M_LOG10E 0.434294481903251827651128918916605082 /**< log_10(e) */ #endif +#ifndef M_LN2 +# define M_LN2 0.693147180559945309417232121458176568 /**< log_e(2) */ +#endif #ifndef M_LN10 -# define M_LN10 2.30258509299404568401799145468 /**< log_e(10) */ +# define M_LN10 2.30258509299404568401799145468436421 /**< log_e(10) */ #endif -#ifndef M_LN2 -# define M_LN2 0.69314718055994530941723212146 /**< log_e(2) */ -#endif #ifndef M_LNPI -# define M_LNPI 1.14472988584940017414342735135 /**< log_e(pi) */ +# define M_LNPI 1.14472988584940017414342735135305871 /** log_e(pi) */ #endif #ifndef M_PI -# define M_PI 3.14159265358979323846264338328 /**< pi */ +# define M_PI 3.14159265358979323846264338327950288 /**< pi */ #endif #ifndef M_PI_2 -# define M_PI_2 1.57079632679489661923132169164 /**< pi/2 */ +# define M_PI_2 1.57079632679489661923132169163975144 /**< pi/2 */ #endif #ifndef M_PI_4 -# define M_PI_4 0.78539816339744830966156608458 /**< pi/4 */ +# define M_PI_4 0.785398163397448309615660845819875721 /**< pi/4 */ #endif #ifndef M_SQRT1_2 -# define M_SQRT1_2 0.70710678118654752440084436210 /**< sqrt(1/2) */ +# define M_SQRT1_2 0.707106781186547524400844362104849039 /**< 1/sqrt(2) */ #endif #ifndef M_SQRT2 -# define M_SQRT2 1.41421356237309504880168872421 /**< sqrt(2) */ +# define M_SQRT2 1.41421356237309504880168872420969808 /**< sqrt(2) */ #endif #ifndef M_SQRT3 -# define M_SQRT3 1.73205080756887729352744634151 /**< sqrt(3) */ +# define M_SQRT3 1.73205080756887729352744634150587237 /**< sqrt(3) */ #endif #ifndef M_SQRTPI -# define M_SQRTPI 1.77245385090551602729816748334 /**< sqrt(pi) */ +# define M_SQRTPI 1.77245385090551602729816748334114518 /**< sqrt(pi) */ #endif #ifndef DEG2RAD -# define DEG2RAD 0.017453292519943295769236907684 /**< pi/180 */ +# define DEG2RAD 0.0174532925199432957692369076848861271 /**< pi/180 */ #endif #ifndef RAD2DEG -# define RAD2DEG 57.295779513082320876798154814105 /**< 180/pi */ +# define RAD2DEG 57.2957795130823208767981548141051703 /**< 180/pi */ #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2013-03-22 21:13:14
|
Revision: 54846 http://brlcad.svn.sourceforge.net/brlcad/?rev=54846&view=rev Author: brlcad Date: 2013-03-22 21:13:07 +0000 (Fri, 22 Mar 2013) Log Message: ----------- add an M_PI_3 constant even though it's not common, just because we need it in at least one place Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2013-03-22 21:02:33 UTC (rev 54845) +++ brlcad/trunk/include/vmath.h 2013-03-22 21:13:07 UTC (rev 54846) @@ -123,7 +123,7 @@ # define M_E 2.71828182845904523536028747135266250 /**< e */ #endif #ifndef M_EULER -# define M_EULER 0.577215664901532860606512090082402431 /**< Euler's constant */ +# define M_EULER 0.577215664901532860606512090082402431 /**< Euler's constant */ #endif #ifndef M_LOG2E # define M_LOG2E 1.44269504088896340735992468100189214 /**< log_2(e) */ @@ -141,11 +141,14 @@ # define M_LNPI 1.14472988584940017414342735135305871 /** log_e(pi) */ #endif #ifndef M_PI -# define M_PI 3.14159265358979323846264338327950288 /**< pi */ +# define M_PI 3.14159265358979323846264338327950288 /**< pi */ #endif #ifndef M_PI_2 # define M_PI_2 1.57079632679489661923132169163975144 /**< pi/2 */ #endif +#ifndef M_PI_3 +# define M_PI_3 1.04719755119659774615421446109316763 /**< pi/3 */ +#endif #ifndef M_PI_4 # define M_PI_4 0.785398163397448309615660845819875721 /**< pi/4 */ #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2013-04-04 03:44:25
|
Revision: 55037 http://brlcad.svn.sourceforge.net/brlcad/?rev=55037&view=rev Author: brlcad Date: 2013-04-04 03:44:18 +0000 (Thu, 04 Apr 2013) Log Message: ----------- document the JOIN1 macros Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2013-04-04 03:32:12 UTC (rev 55036) +++ brlcad/trunk/include/vmath.h 2013-04-04 03:44:18 UTC (rev 55037) @@ -1149,17 +1149,38 @@ } while (0) +/** + * Compose 3D vector at `a' of: + * vector at `b' plus + * scalar `c' times vector at `d' + * + * This is basically a shorthand for VSCALE();VADD2();. + */ #define VJOIN1(a, b, c, d) do { \ (a)[X] = (b)[X] + (c) * (d)[X]; \ (a)[Y] = (b)[Y] + (c) * (d)[Y]; \ (a)[Z] = (b)[Z] + (c) * (d)[Z]; \ } while (0) +/** + * Compose 2D vector at `a' of: + * vector at `b' plus + * scalar `c' times vector at `d' + * + * This is basically a shorthand for V2SCALE();V2ADD2();. + */ #define V2JOIN1(a, b, c, d) do { \ (a)[X] = (b)[X] + (c) * (d)[X]; \ (a)[Y] = (b)[Y] + (c) * (d)[Y]; \ } while (0) +/** + * Compose 4D vector at `a' of: + * vector at `b' plus + * scalar `c' times vector at `d' + * + * This is basically a shorthand for HSCALE();HADD2();. + */ #define HJOIN1(a, b, c, d) do { \ (a)[X] = (b)[X] + (c) * (d)[X]; \ (a)[Y] = (b)[Y] + (c) * (d)[Y]; \ @@ -1167,6 +1188,13 @@ (a)[W] = (b)[W] + (c) * (d)[W]; \ } while (0) +/** + * Compose `n'-D vector at `a' of: + * vector at `b' plus + * scalar `c' times vector at `d' + * + * This is basically a shorthand for VSCALEN();VADD2N();. + */ #define VJOIN1N(a, b, c, d, n) do { \ register int _vjoin1; \ for (_vjoin1 = 0; \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <n_...@us...> - 2013-05-29 14:10:23
|
Revision: 55576 http://sourceforge.net/p/brlcad/code/55576 Author: n_reed Date: 2013-05-29 14:10:19 +0000 (Wed, 29 May 2013) Log Message: ----------- fix two macros that referenced a non-existent 's' parameter Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2013-05-28 23:24:36 UTC (rev 55575) +++ brlcad/trunk/include/vmath.h 2013-05-29 14:10:19 UTC (rev 55576) @@ -1021,7 +1021,7 @@ (o)[Z] = ((a)[Z] + (b)[Z]) * (s); \ } while (0) -#define VADD2SCALEN(o, a, b, n) do { \ +#define VADD2SCALEN(o, a, b, s, n) do { \ register int _vadd2scale; \ for (_vadd2scale = 0; \ _vadd2scale < (n); \ @@ -1040,7 +1040,7 @@ (o)[Z] = ((a)[Z] - (b)[Z]) * (s); \ } while (0) -#define VSUB2SCALEN(o, a, b, n) do { \ +#define VSUB2SCALEN(o, a, b, s, n) do { \ register int _vsub2scale; \ for (_vsub2scale = 0; \ _vsub2scale < (n); \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2013-08-10 05:36:25
|
Revision: 56733 http://sourceforge.net/p/brlcad/code/56733 Author: brlcad Date: 2013-08-10 05:36:22 +0000 (Sat, 10 Aug 2013) Log Message: ----------- add macros for testing whether an object is invalid (not within our defined range of INFINITY to -INFINITY Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2013-08-10 01:22:15 UTC (rev 56732) +++ brlcad/trunk/include/vmath.h 2013-08-10 05:36:22 UTC (rev 56733) @@ -304,8 +304,31 @@ */ typedef fastf_t plane_t[ELEMENTS_PER_PLANE]; +/** + * Evaluates truthfully whether a number is not within valid range of + * INFINITY to -INFINITY inclusive. + */ +#define INVALID(n) (!((n) >= -INFINITY && (n) <= INFINITY)) /** + * Evaluates truthfully whether all components of a vector are not + * within a valid range. + */ +#define VINVALID(v) (INVALID((v)[X]) || INVALID((v)[Y]) || INVALID((v)[Z])) + +/** + * Evaluates truthfully whether all components of a 2D vector are not + * within a valid range. + */ +#define V2INVALID(v) (INVALID((v)[X]) || INVALID((v)[Y])) + +/** + * Evaluates truthfully whether all components of a 4D vector are not + * within a valid range. + */ +#define HINVALID(v) (INVALID((v)[X]) || INVALID((v)[Y]) || INVALID((v)[Z]) || INVALID((v)[W])) + +/** * Return truthfully whether a value is within a specified epsilon * distance from zero. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2013-11-27 19:30:37
|
Revision: 58693 http://sourceforge.net/p/brlcad/code/58693 Author: starseeker Date: 2013-11-27 19:30:34 +0000 (Wed, 27 Nov 2013) Log Message: ----------- Add the 2D version of the vector unitize macro Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2013-11-27 19:23:34 UTC (rev 58692) +++ brlcad/trunk/include/vmath.h 2013-11-27 19:30:34 UTC (rev 58693) @@ -1034,6 +1034,20 @@ } \ } while (0) +/** @brief Normalize 2D vector `a' to be a unit vector. */ +#define V2UNITIZE(a) do { \ + register double _f = MAG2SQ(a); \ + if (! NEAR_EQUAL(_f, 1.0, VUNITIZE_TOL)) { \ + _f = sqrt(_f); \ + if (_f < VDIVIDE_TOL) { \ + V2SETALL((a), 0.0); \ + } else { \ + _f = 1.0/_f; \ + (a)[X] *= _f; (a)[Y] *= _f; \ + } \ + } \ + } while (0) + /** * @brief Find the sum of two points, and scale the result. Often * used to find the midpoint. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2013-11-27 21:14:26
|
Revision: 58699 http://sourceforge.net/p/brlcad/code/58699 Author: starseeker Date: 2013-11-27 21:14:22 +0000 (Wed, 27 Nov 2013) Log Message: ----------- Add V2MINMAX and friends Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2013-11-27 20:58:17 UTC (rev 58698) +++ brlcad/trunk/include/vmath.h 2013-11-27 21:14:22 UTC (rev 58699) @@ -1551,6 +1551,23 @@ } while (0) /** + * @brief Included below are macros to update min and max X, Y + * values to contain a point + */ + +#define V2MIN(r, s) do { \ + V_MIN((r)[X], (s)[X]); V_MIN((r)[Y], (s)[Y]); \ + } while (0) + +#define V2MAX(r, s) do { \ + V_MAX((r)[X], (s)[X]); V_MAX((r)[Y], (s)[Y]); \ + } while (0) + +#define V2MINMAX(min, max, pt) do { \ + V2MIN((min), (pt)); V2MAX((max), (pt)); \ + } while (0) + +/** * @brief Divide out homogeneous parameter from hvect_t, creating * vect_t. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <n_...@us...> - 2013-11-28 15:28:22
|
Revision: 58705 http://sourceforge.net/p/brlcad/code/58705 Author: n_reed Date: 2013-11-28 15:28:20 +0000 (Thu, 28 Nov 2013) Log Message: ----------- add distance macros for 2d points Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2013-11-28 15:18:51 UTC (rev 58704) +++ brlcad/trunk/include/vmath.h 2013-11-28 15:28:20 UTC (rev 58705) @@ -489,6 +489,12 @@ ((_a)[Z]-(_b)[Z])*((_a)[Z]-(_b)[Z]) #define DIST_PT_PT(_a, _b) sqrt(DIST_PT_PT_SQ(_a, _b)) +/** @brief Compute distance between two 2D points. */ +#define DIST_PT2_PT2_SQ(_a, _b) \ + ((_a)[X]-(_b)[X])*((_a)[X]-(_b)[X]) + \ + ((_a)[Y]-(_b)[Y])*((_a)[Y]-(_b)[Y]) +#define DIST_PT2_PT2(_a, _b) sqrt(DIST_PT2_PT2_SQ(_a, _b)) + /** @brief set translation values of 4x4 matrix with x, y, z values. */ #define MAT_DELTAS(_m, _x, _y, _z) do { \ (_m)[MDX] = (_x); \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2013-12-25 11:13:52
|
Revision: 59158 http://sourceforge.net/p/brlcad/code/59158 Author: brlcad Date: 2013-12-25 11:13:47 +0000 (Wed, 25 Dec 2013) Log Message: ----------- add a note that MAGNITUDE() is also known as the euclidean norm for anyone looking for it that way. Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2013-12-24 20:43:29 UTC (rev 59157) +++ brlcad/trunk/include/vmath.h 2013-12-25 11:13:47 UTC (rev 59158) @@ -1274,8 +1274,17 @@ #define MAGSQ(a) ((a)[X]*(a)[X] + (a)[Y]*(a)[Y] + (a)[Z]*(a)[Z]) #define MAG2SQ(a) ((a)[X]*(a)[X] + (a)[Y]*(a)[Y]) -/** @brief Return scalar magnitude of vector at `a' */ + +/** + * @brief Return scalar magnitude of the 3D vector `a'. This is + * otherwise known as the Euclidean norm of the provided vector.. + */ #define MAGNITUDE(a) sqrt(MAGSQ(a)) + +/** + * @brief Return scalar magnitude of the 2D vector at `a'. This is + * otherwise known as the Euclidean norm of the provided vector.. + */ #define MAGNITUDE2(a) sqrt(MAG2SQ(a)) /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2014-02-05 22:24:46
|
Revision: 59698 http://sourceforge.net/p/brlcad/code/59698 Author: brlcad Date: 2014-02-05 22:24:41 +0000 (Wed, 05 Feb 2014) Log Message: ----------- looks like quite a plethora of system headers actually have it this way too, but make the comment match the symbol name (otherwise, it should be M_1_SQRT2) Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2014-02-05 21:40:32 UTC (rev 59697) +++ brlcad/trunk/include/vmath.h 2014-02-05 22:24:41 UTC (rev 59698) @@ -153,7 +153,7 @@ # define M_PI_4 0.785398163397448309615660845819875721 /**< pi/4 */ #endif #ifndef M_SQRT1_2 -# define M_SQRT1_2 0.707106781186547524400844362104849039 /**< 1/sqrt(2) */ +# define M_SQRT1_2 0.707106781186547524400844362104849039 /**< sqrt(1/2) */ #endif #ifndef M_SQRT2 # define M_SQRT2 1.41421356237309504880168872420969808 /**< sqrt(2) */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2014-02-06 01:33:38
|
Revision: 59702 http://sourceforge.net/p/brlcad/code/59702 Author: brlcad Date: 2014-02-06 01:33:34 +0000 (Thu, 06 Feb 2014) Log Message: ----------- add 1/(2pi) and 2pi to our list of numeric literals, using same convention as minix Modified Paths: -------------- brlcad/trunk/include/vmath.h Modified: brlcad/trunk/include/vmath.h =================================================================== --- brlcad/trunk/include/vmath.h 2014-02-06 01:26:06 UTC (rev 59701) +++ brlcad/trunk/include/vmath.h 2014-02-06 01:33:34 UTC (rev 59702) @@ -110,6 +110,9 @@ # define M_ XXX /**< all with 36-digits of precision */ #endif +#ifndef M_1_2PI +# define M_1_2PI 0.159154943091895335768883763372514362 /**< 1/(2*pi) */ +#endif #ifndef M_1_PI # define M_1_PI 0.318309886183790671537767526745028724 /**< 1/pi */ #endif @@ -143,6 +146,9 @@ #ifndef M_PI # define M_PI 3.14159265358979323846264338327950288 /**< pi */ #endif +#ifndef M_2PI +# define M_2PI 6.28318530717958647692528676655900576 /**< 2*pi */ +#endif #ifndef M_PI_2 # define M_PI_2 1.57079632679489661923132169163975144 /**< pi/2 */ #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |