diff --git a/include/osg/Math b/include/osg/Math index ee5a1e350..2bd0d08ba 100644 --- a/include/osg/Math +++ b/include/osg/Math @@ -241,7 +241,14 @@ extern OSG_EXPORT double asciiToDouble(const char* str); /** Convert a ascii number to a float, ignoring locale settings.*/ inline float asciiToFloat(const char* str) { return static_cast(asciiToDouble(str)); } +/** Detect first ascii POSITIVE number in string and convert to double.*/ +extern OSG_EXPORT double findAsciiToDouble(const char* str); + +/** Detect first ascii POSITIVE number in string and convert to double.*/ +inline float findAsciiToFloat(const char* str) { return static_cast(findAsciiToDouble(str)); } + } + #endif // __OSG_MATH diff --git a/src/osg/GL2Extensions.cpp b/src/osg/GL2Extensions.cpp index 29bd642b8..1a34111d7 100644 --- a/src/osg/GL2Extensions.cpp +++ b/src/osg/GL2Extensions.cpp @@ -517,7 +517,7 @@ void GL2Extensions::setupGL2Extensions(unsigned int contextID) return; } - _glVersion = asciiToFloat( version ); + _glVersion = findAsciiToFloat( version ); _glslLanguageVersion = 0.0f; bool shadersBuiltIn = OSG_GLES2_FEATURES || OSG_GL3_FEATURES; @@ -540,12 +540,7 @@ void GL2Extensions::setupGL2Extensions(unsigned int contextID) const char* langVerStr = (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION); if( (glGetError() == GL_NO_ERROR) && langVerStr ) { - std::string glslvs( langVerStr ); - #if defined(OSG_GLES1_AVAILABLE) || defined(OSG_GLES2_AVAILABLE) - _glslLanguageVersion = ( asciiToFloat( glslvs.substr( glslvs.find( "GLSL ES " )+8 ).c_str() ) ); - #else - _glslLanguageVersion = ( asciiToFloat( glslvs.substr( glslvs.find( "GLSL "+5 ) ).c_str() ) ); - #endif + _glslLanguageVersion = (findAsciiToFloat(langVerStr)); } else _glslLanguageVersion = 1.0f; diff --git a/src/osg/GLExtensions.cpp b/src/osg/GLExtensions.cpp index 4dd5e9112..52ddf9383 100644 --- a/src/osg/GLExtensions.cpp +++ b/src/osg/GLExtensions.cpp @@ -66,12 +66,7 @@ float osg::getGLVersionNumber() char *versionstring = (char*) glGetString( GL_VERSION ); if (!versionstring) return 0.0; - std::string vs( versionstring ); - #if defined(OSG_GLES1_AVAILABLE) || defined(OSG_GLES2_AVAILABLE) - return( asciiToFloat( vs.substr( vs.find( "ES " )+3 ).c_str() ) ); - #else - return( asciiToFloat( vs.substr( vs.find( " " )+1 ).c_str() ) ); - #endif + return (findAsciiToFloat(versionstring)); } bool osg::isExtensionInExtensionString(const char *extension, const char *extensionString) diff --git a/src/osg/Math.cpp b/src/osg/Math.cpp index 2793eab57..117ef8e5e 100644 --- a/src/osg/Math.cpp +++ b/src/osg/Math.cpp @@ -15,6 +15,7 @@ #include + double osg::asciiToDouble(const char* str) { const char* ptr = str; @@ -112,3 +113,20 @@ double osg::asciiToDouble(const char* str) } } +double osg::findAsciiToDouble(const char* str) +{ + const char* ptr = str; + double value = 0.0; + + while(*ptr != 0) { + + if(*ptr>='0' && *ptr<='9') { + value = asciiToDouble(ptr); + return value; + } + + ++ptr; + } + + return 0.0; +}