X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fmath%2FSGVec3.hxx;h=dbc8af543bf9a5d39a933be30d55e32b9dfc9c43;hb=914d3e6a2b323cf9f186cbef2aef7865ea07b309;hp=9b81ec57266f793c2f5e2dd569fcf8a6147df43e;hpb=9cbbe5559844317f44744788ddb308101a1e75e9;p=simgear.git diff --git a/simgear/math/SGVec3.hxx b/simgear/math/SGVec3.hxx index 9b81ec57..dbc8af54 100644 --- a/simgear/math/SGVec3.hxx +++ b/simgear/math/SGVec3.hxx @@ -18,10 +18,7 @@ #ifndef SGVec3_H #define SGVec3_H -#ifndef NO_OPENSCENEGRAPH_INTERFACE -#include -#include -#endif +#include /// 3D Vector Class template @@ -29,6 +26,11 @@ class SGVec3 { public: typedef T value_type; +#ifdef __GNUC__ +// Avoid "_data not initialized" warnings (see comment below). +# pragma GCC diagnostic ignored "-Wuninitialized" +#endif + /// Default constructor. Does not initialize at all. /// If you need them zero initialized, use SGVec3::zeros() SGVec3(void) @@ -41,6 +43,12 @@ public: data()[i] = SGLimits::quiet_NaN(); #endif } + +#ifdef __GNUC__ + // Restore warning settings. +# pragma GCC diagnostic warning "-Wuninitialized" +#endif + /// Constructor. Initialize by the given values SGVec3(T x, T y, T z) { data()[0] = x; data()[1] = y; data()[2] = z; } @@ -358,9 +366,11 @@ template inline SGVec3 normalize(const SGVec3& v) -{ T normv = norm(v); - if (normv > 0.0) return (1/norm(v))*v; - else return v; +{ + T normv = norm(v); + if (normv <= SGLimits::min()) + return SGVec3::zeros(); + return (1/normv)*v; } /// Return true if exactly the same @@ -452,6 +462,18 @@ T distSqr(const SGVec3& v1, const SGVec3& v2) { SGVec3 tmp = v1 - v2; return dot(tmp, tmp); } +// calculate the projection of u along the direction of d. +template +inline +SGVec3 +projection(const SGVec3& u, const SGVec3& d) +{ + T denom = dot(d, d); + T ud = dot(u, d); + if (SGLimits::min() < denom) return u; + else return d * (dot(u, d) / denom); +} + #ifndef NDEBUG template inline @@ -480,35 +502,4 @@ SGVec3d toVec3d(const SGVec3f& v) { return SGVec3d(v(0), v(1), v(2)); } -// calculate the projection of u along the direction of d. -template -inline SGVec3 SGProjection(const SGVec3& u, const SGVec3& d) -{ - T denom = dot(d, d); - if (denom == 0.) return u; - else return d * (dot(u,d) / denom); -} - -#ifndef NO_OPENSCENEGRAPH_INTERFACE -inline -SGVec3d -toSG(const osg::Vec3d& v) -{ return SGVec3d(v[0], v[1], v[2]); } - -inline -SGVec3f -toSG(const osg::Vec3f& v) -{ return SGVec3f(v[0], v[1], v[2]); } - -inline -osg::Vec3d -toOsg(const SGVec3d& v) -{ return osg::Vec3d(v[0], v[1], v[2]); } - -inline -osg::Vec3f -toOsg(const SGVec3f& v) -{ return osg::Vec3f(v[0], v[1], v[2]); } -#endif - #endif