diff --git a/src/graphicsEngine/WGEOffscreenFinalPass.cpp b/src/graphicsEngine/WGEOffscreenFinalPass.cpp index f285fcaef445adf2badb36ee43c15e0beeb5c78c..e0636931efcd5d8729ef794e1eac119047cb7c4c 100644 --- a/src/graphicsEngine/WGEOffscreenFinalPass.cpp +++ b/src/graphicsEngine/WGEOffscreenFinalPass.cpp @@ -34,6 +34,17 @@ WGEOffscreenFinalPass::WGEOffscreenFinalPass( size_t textureWidth, size_t textur // initialize members setRenderTargetImplementation( osg::Camera::FRAME_BUFFER ); setRenderOrder( osg::Camera::NESTED_RENDER, 0 ); + + // render before the hud + if ( m_hud ) + { + getOrCreateStateSet()->setRenderBinDetails( m_hud->getRenderBin() - 1, "RenderBin" ); + } + else + { + getOrCreateStateSet()->setRenderBinDetails( 10000, "RenderBin" ); + } + osg::StateSet* state = this->getOrCreateStateSet(); state->setMode( GL_DEPTH_TEST, osg::StateAttribute::ON ); } @@ -45,6 +56,17 @@ WGEOffscreenFinalPass::WGEOffscreenFinalPass( size_t textureWidth, size_t textur // initialize members setRenderTargetImplementation( osg::Camera::FRAME_BUFFER ); setRenderOrder( osg::Camera::NESTED_RENDER, 0 ); + + // render before the hud + if ( m_hud ) + { + getOrCreateStateSet()->setRenderBinDetails( m_hud->getRenderBin() - 1, "RenderBin" ); + } + else + { + getOrCreateStateSet()->setRenderBinDetails( 10000, "RenderBin" ); + } + osg::StateSet* state = this->getOrCreateStateSet(); state->setMode( GL_DEPTH_TEST, osg::StateAttribute::ON ); } diff --git a/src/graphicsEngine/WGEOffscreenRenderPass.cpp b/src/graphicsEngine/WGEOffscreenRenderPass.cpp index 6c8fd89ccf7fbaf4dc758b17b8dcb5ca5a0f0906..4b7f200f6c84c64c62bbb97e6752a691937ae0e2 100644 --- a/src/graphicsEngine/WGEOffscreenRenderPass.cpp +++ b/src/graphicsEngine/WGEOffscreenRenderPass.cpp @@ -91,7 +91,11 @@ osg::ref_ptr< osg::Texture2D > WGEOffscreenRenderPass::attach( BufferComponent b } else { +#if defined(__APPLE__) + tex = createTexture( GL_RGBA ); // on MacOS X, only RGBA textures work as attachment for FBO's +#else tex = createTexture( internalFormat ); +#endif } attach( buffer, tex ); return tex; diff --git a/src/graphicsEngine/WGETextureHud.cpp b/src/graphicsEngine/WGETextureHud.cpp index 36f06164cc62dcf92d9277863d139e37950266b4..357fc840873fbb8dce1948a165c47a84b565808c 100644 --- a/src/graphicsEngine/WGETextureHud.cpp +++ b/src/graphicsEngine/WGETextureHud.cpp @@ -44,10 +44,11 @@ WGETextureHud::WGETextureHud(): osg::Projection(), m_group( new WGEGroupNode() ), m_maxElementWidth( 256 ), + m_renderBin( 10000 ), m_viewport( new osg::Viewport() ), m_coupleTexViewport( false ) { - getOrCreateStateSet()->setRenderBinDetails( 1000, "RenderBin" ); + getOrCreateStateSet()->setRenderBinDetails( m_renderBin, "RenderBin" ); m_group->addUpdateCallback( new SafeUpdateCallback( this ) ); addChild( m_group ); } @@ -310,3 +311,8 @@ osg::ref_ptr< osg::Texture2D > WGETextureHud::WGETextureHudEntry::getTexture() c return m_texture; } +size_t WGETextureHud::getRenderBin() const +{ + return m_renderBin; +} + diff --git a/src/graphicsEngine/WGETextureHud.h b/src/graphicsEngine/WGETextureHud.h index a7ef5c98d7832702ee61e6b80fc954f6818bf984..dd4cd97e62d2a573ae53a380a47d94a7e87c5c22 100644 --- a/src/graphicsEngine/WGETextureHud.h +++ b/src/graphicsEngine/WGETextureHud.h @@ -183,6 +183,13 @@ public: */ void coupleViewportWithTextureViewport( bool couple = true ); + /** + * Returns the render bin used by the HUD. + * + * \return the bin number + */ + size_t getRenderBin() const; + protected: /** @@ -196,6 +203,11 @@ protected: */ unsigned int m_maxElementWidth; + /** + * The render bin to use + */ + size_t m_renderBin; + /** * The current viewport of */ diff --git a/src/graphicsEngine/shaders/WGEUtils.glsl b/src/graphicsEngine/shaders/WGEUtils.glsl index d3e88c0007a4108b3d9961f1735e0a5f812c9780..7052f56d3f8d6609610763e01b68db11edac74fa 100644 --- a/src/graphicsEngine/shaders/WGEUtils.glsl +++ b/src/graphicsEngine/shaders/WGEUtils.glsl @@ -45,8 +45,22 @@ float scaleZeroOne( in float threshold, in float min, in float max ) * * \return true if zero. */ -bool isZero( in float value, in float epsilon = 0.001 ) +bool isZero( in float value, in float epsilon ) { return ( abs( value ) <= epsilon ); } +/** + * Evaluates a given value whether it is zero, or more exactly, if it can be seen as zero. + * \note This version is needed for portability as the GLSL compiler on MacOS X does not allow argument default values in functions. + * + * \param value the value to check + * \param epsilon the epsilon to use. Default is 0.001. Much lower is not recommended since floating point precision in GLSL is not that high. + * + * \return true if zero. + */ +bool isZero( in float value ) +{ + return ( abs( value ) <= 0.001 ); +} +