diff --git a/CMakeLists.txt b/CMakeLists.txt index c34131be6..bf264de91 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -431,6 +431,9 @@ MARK_AS_ADVANCED(OSG_USE_FLOAT_BOUNDINGSPHERE) OPTION(OSG_USE_FLOAT_BOUNDINGBOX "Set to ON to build OpenSceneGraph with float BoundingBox instead of double." ON) MARK_AS_ADVANCED(OSG_USE_FLOAT_BOUNDINGBOX) +OPTION(OSG_USE_FLOAT_QUAT "Set to ON to build OpenSceneGraph with float Quat instead of double." OFF) +MARK_AS_ADVANCED(OSG_USE_FLOAT_QUAT) + IF (WIN32) OPTION(OSG_USE_UTF8_FILENAME "Set to ON to use a UTF8 locale for filenames instead of the default locale." OFF) MARK_AS_ADVANCED(OSG_USE_UTF8_FILENAME) diff --git a/applications/osgversion/osgversion.cpp b/applications/osgversion/osgversion.cpp index 4bc16613a..2e6e0894d 100644 --- a/applications/osgversion/osgversion.cpp +++ b/applications/osgversion/osgversion.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #ifdef BUILD_CONTRIBUTORS extern void printContributors(const std::string& changeLog, bool printNumEntries); @@ -40,6 +41,7 @@ int main( int argc, char** argv) arguments.getApplicationUsage()->addCommandLineOption("Plane::value_type", "Print the value of Plane::value_type"); arguments.getApplicationUsage()->addCommandLineOption("BoundingSphere::value_type", "Print the value of BoundingSphere::value_type"); arguments.getApplicationUsage()->addCommandLineOption("BoundingBox::value_type", "Print the value of BoundingBox::value_type"); + arguments.getApplicationUsage()->addCommandLineOption("Quat::value_type", "Print the value of Quat::value_type"); #ifdef BUILD_CONTRIBUTORS arguments.getApplicationUsage()->addCommandLineOption("-r or --read ", "Read the ChangeLog to generate an estimated contributors list."); @@ -139,6 +141,12 @@ int main( int argc, char** argv) return 0; } + if (arguments.read("Quat::value_type")) + { + cout << ((sizeof(osg::Quat::value_type) == 4) ? "float" : "double") << endl; + return 0; + } + cout << osgGetLibraryName() << " " << osgGetVersion() << endl << endl; #ifdef BUILD_CONTRIBUTORS diff --git a/include/osg/Quat b/include/osg/Quat index c8ef76f1b..863a029e8 100644 --- a/include/osg/Quat +++ b/include/osg/Quat @@ -32,7 +32,11 @@ class OSG_EXPORT Quat public: /** Data type of vector components.*/ + #ifdef OSG_USE_FLOAT_QUAT + typedef float value_type; + #else typedef double value_type; + #endif /** Number of vector components. */ enum { num_components = 4 }; diff --git a/src/osg/Config.in b/src/osg/Config.in index 8f4c23359..583b16aa8 100644 --- a/src/osg/Config.in +++ b/src/osg/Config.in @@ -28,6 +28,7 @@ #cmakedefine OSG_USE_FLOAT_PLANE #cmakedefine OSG_USE_FLOAT_BOUNDINGSPHERE #cmakedefine OSG_USE_FLOAT_BOUNDINGBOX +#cmakedefine OSG_USE_FLOAT_QUAT #cmakedefine OSG_USE_REF_PTR_IMPLICIT_OUTPUT_CONVERSION #cmakedefine OSG_USE_REF_PTR_SAFE_DEREFERENCE #cmakedefine OSG_USE_UTF8_FILENAME diff --git a/src/osgDB/InputStream.cpp b/src/osgDB/InputStream.cpp index abbf2f6df..9aa3c1702 100644 --- a/src/osgDB/InputStream.cpp +++ b/src/osgDB/InputStream.cpp @@ -187,7 +187,10 @@ InputStream& InputStream::operator>>( osg::Vec4d& v ) InputStream& InputStream::operator>>( osg::Quat& q ) -{ *this >> q.x() >> q.y() >> q.z() >> q.w(); return *this; } +{ + double x, y, z, w; *this >> x >> y >> z >> w; + q.set( x, y, z, w ); return *this; +} InputStream& InputStream::operator>>( osg::Plane& p ) { diff --git a/src/osgDB/OutputStream.cpp b/src/osgDB/OutputStream.cpp index 8d8a7abe5..397c73776 100644 --- a/src/osgDB/OutputStream.cpp +++ b/src/osgDB/OutputStream.cpp @@ -172,7 +172,7 @@ OutputStream& OutputStream::operator<<( const osg::Vec4ui& v ) OutputStream& OutputStream::operator<<( const osg::Quat& q ) -{ *this << q.x() << q.y() << q.z() << q.w(); return *this; } +{ *this << (double)q.x() << (double)q.y() << (double)q.z() << (double)q.w(); return *this; } OutputStream& OutputStream::operator<<( const osg::Plane& p ) { *this << (double)p[0] << (double)p[1] << (double)p[2] << (double)p[3]; return *this; } diff --git a/src/osgManipulator/Projector.cpp b/src/osgManipulator/Projector.cpp index 79c417523..67314fc23 100644 --- a/src/osgManipulator/Projector.cpp +++ b/src/osgManipulator/Projector.cpp @@ -405,7 +405,7 @@ osg::Quat SpherePlaneProjector::getRotation(const osg::Vec3d& p1, bool p1OnSpher osg::Quat rotation; rotation.makeRotate(p1 - getSphere()->getCenter(), p2 - getSphere()->getCenter()); - osg::Vec3d axis; double angle; + osg::Vec3d axis; osg::Quat::value_type angle; rotation.getRotate(angle, axis); osg::Vec3d realAxis; diff --git a/src/osgPlugins/p3d/ReaderWriterP3D.cpp b/src/osgPlugins/p3d/ReaderWriterP3D.cpp index 8991174c7..211e6c801 100644 --- a/src/osgPlugins/p3d/ReaderWriterP3D.cpp +++ b/src/osgPlugins/p3d/ReaderWriterP3D.cpp @@ -217,7 +217,11 @@ public: qlhs.makeRotate(osg::DegreesToRadians(lhs[0]),lhs[1],lhs[2],lhs[3]); qrhs.makeRotate(osg::DegreesToRadians(rhs[0]),rhs[1],rhs[2],rhs[3]); osg::Quat quat = qlhs*qrhs; + #ifdef OSG_USE_FLOAT_QUAT + osg::Vec4f result; + #else osg::Vec4d result; + #endif quat.getRotate ( result[0], result[1], result[2], result[3]); result[0] = osg::RadiansToDegrees(result[0]); return result; diff --git a/src/osgPlugins/vrml/ConvertToVRML.cpp b/src/osgPlugins/vrml/ConvertToVRML.cpp index 4ada5d0e6..f4c10faa0 100644 --- a/src/osgPlugins/vrml/ConvertToVRML.cpp +++ b/src/osgPlugins/vrml/ConvertToVRML.cpp @@ -562,7 +562,7 @@ void ToVRML::apply(osg::MatrixTransform& node) { osg::Vec3 scale = mat.getScale(); osg::Quat quat; mat.get(quat); - double angle; + osg::Quat::value_type angle; osg::Vec3 axe; quat.getRotate(angle, axe); @@ -597,7 +597,7 @@ void ToVRML::apply(osg::PositionAttitudeTransform& node) { osg::Vec3 trans = node.getPosition(); osg::Vec3 scale = node.getScale(); osg::Quat quat = node.getAttitude(); - double angle; + osg::Quat::value_type angle; osg::Vec3 axe; quat.getRotate(angle, axe);