diff --git a/src/libRender/RadiumNBR/NodeBasedRenderer.cpp b/src/libRender/RadiumNBR/NodeBasedRenderer.cpp index 184a3d9baf6b6077c94a2c099f252e5e2b0616ec..285b4aa4bfcaddc3cfb3fa3676a4b577ebdd84f6 100644 --- a/src/libRender/RadiumNBR/NodeBasedRenderer.cpp +++ b/src/libRender/RadiumNBR/NodeBasedRenderer.cpp @@ -128,8 +128,11 @@ void NodeBasedRenderer::initializeInternal() { // TODO, do we really need to setup an index for the two following passes // build the Ui pass // todo find a way to replace the "31" by another id - m_uiPass = std::make_unique<UIPass>( &m_uiRenderObjects, 31 ); + m_uiPass = std::make_unique<UIPass>( &m_uiRenderObjects ); m_uiPass->setResourcesDir( resourcesPath ); + m_uiPass->setInputs( *( sharedTextures().find( "Depth (RadiumNBR)" ) ) ); + m_uiPass->setOutput( m_fancyTexture.get() ); + m_uiPass->initializePass( m_width, m_height, m_shaderProgramManager ); // configure the pass m_uiPass->deactivate(); diff --git a/src/libRender/RadiumNBR/Passes/DebugPass.cpp b/src/libRender/RadiumNBR/Passes/DebugPass.cpp index 5bfe18296f84ed94b4c6200cae7e4b316c73b915..203419e6e759d1803600563659c67238d85bd981 100644 --- a/src/libRender/RadiumNBR/Passes/DebugPass.cpp +++ b/src/libRender/RadiumNBR/Passes/DebugPass.cpp @@ -24,7 +24,7 @@ DebugPass::~DebugPass() = default; bool DebugPass::buildRenderTechnique( const Ra::Engine::Rendering::RenderObject* ro, Ra::Engine::Rendering::RenderTechnique& rt ) const { - // This method is never called for DebugObject. + // This method is never called for DebugObjects. // Rendering use the Default Radium pass return true; } @@ -42,17 +42,6 @@ bool DebugPass::update() { } void DebugPass::resize( size_t width, size_t height ) { - // Only resize the owned textures. Imported one are resized by their owner - for ( auto& t : m_localTextures ) - { - t.second->resize( width, height ); - } - - for ( auto& t : m_sharedTextures ) - { - t.second->resize( width, height ); - } - m_fbo->bind(); m_fbo->attachTexture( GL_DEPTH_ATTACHMENT, m_importedTextures["Debug::Depth"]->texture() ); // no need to resize the output texture, it belongs to the Ra::Engine::Rendering::Renderer and @@ -69,13 +58,12 @@ void DebugPass::resize( size_t width, size_t height ) { void DebugPass::execute( const Ra::Engine::Data::ViewingParameters& viewParams ) const { m_fbo->bind(); + glDrawBuffers( 1, buffers ); GL_ASSERT( glDisable( GL_BLEND ) ); GL_ASSERT( glEnable( GL_DEPTH_TEST ) ); GL_ASSERT( glDepthMask( GL_FALSE ) ); GL_ASSERT( glDepthFunc( GL_LESS ) ); - glDrawBuffers( 1, buffers ); - for ( const auto& ro : *m_objectsToRender ) { ro->render( {}, viewParams ); diff --git a/src/libRender/RadiumNBR/Passes/UiPass.cpp b/src/libRender/RadiumNBR/Passes/UiPass.cpp index 141dfbebcd92b1c56da8e34147c11e70b213e3f1..4e4c2d43168731c6aa0650b1b7382f2c8eb6d13e 100644 --- a/src/libRender/RadiumNBR/Passes/UiPass.cpp +++ b/src/libRender/RadiumNBR/Passes/UiPass.cpp @@ -5,50 +5,116 @@ using namespace Ra::Core::Utils; // log //#endif +#include <Engine/Data/DisplayableObject.hpp> #include <Engine/Data/Material.hpp> #include <Engine/Data/ShaderConfigFactory.hpp> #include <Engine/Data/ShaderProgramManager.hpp> #include <Engine/Data/Texture.hpp> +#include <Engine/Data/ViewingParameters.hpp> #include <Engine/Rendering/RenderObject.hpp> #include <globjects/Framebuffer.h> namespace RadiumNBR { using namespace gl; - -UIPass::UIPass( const std::vector<RenderObjectPtr>* objectsToRender, - const Ra::Core::Utils::Index& idx ) : - RenderPass( "User Interface pass", idx, objectsToRender ) {} +static const GLenum buffers[] = {GL_COLOR_ATTACHMENT0}; +#define UI_PASS_ID 31 +UIPass::UIPass( const std::vector<RenderObjectPtr>* objectsToRender) : + RenderPass( "User Interface pass", UI_PASS_ID, objectsToRender ) {} UIPass::~UIPass() = default; bool UIPass::buildRenderTechnique( const Ra::Engine::Rendering::RenderObject* ro, Ra::Engine::Rendering::RenderTechnique& rt ) const { - return false; + // This method is never called for UiObjects. + // Rendering use the Default Radium pass + return true; } bool UIPass::initializePass( size_t width, size_t height, Ra::Engine::Data::ShaderProgramManager* shaderMngr ) { - return false; + m_shaderMngr = shaderMngr; + m_fbo = std::make_unique<globjects::Framebuffer>(); + return true; } bool UIPass::update() { return false; } -void UIPass::resize( size_t width, size_t height ) {} +void UIPass::resize( size_t width, size_t height ) { + m_fbo->bind(); + m_fbo->attachTexture( GL_DEPTH_ATTACHMENT, m_importedTextures["Ui::Depth"]->texture() ); + // no need to resize the output texture, it belongs to the Ra::Engine::Rendering::Renderer and + // is already resized + m_fbo->attachTexture( GL_COLOR_ATTACHMENT0, m_outputTexture->texture() ); +#ifdef PASSES_LOG + if ( m_fbo->checkStatus() != GL_FRAMEBUFFER_COMPLETE ) + { LOG( logERROR ) << "FBO Error (EmissivityPass::resize): " << m_fbo->checkStatus(); } +#endif + // finished with fbo, undbind to bind default + globjects::Framebuffer::unbind(); +} void UIPass::execute( const Ra::Engine::Data::ViewingParameters& viewParams ) const { + /* LOG( Ra::Core::Utils::logINFO ) << " requested to render " << m_objectsToRender->size() << " UI objects"; + */ + m_fbo->bind(); + glDrawBuffers( 1, buffers ); + GL_ASSERT( glDepthMask( GL_TRUE ) ); + GL_ASSERT( glEnable( GL_DEPTH_TEST ) ); + GL_ASSERT( glDepthFunc( GL_LESS ) ); + GL_ASSERT( glClear( GL_DEPTH_BUFFER_BIT ) ); + + for ( const auto& ro : *m_objectsToRender ) + { + if ( ro->isVisible() ) + { + auto shader = ro->getRenderTechnique()->getShader(); + + // bind data + shader->bind(); + + Ra::Core::Matrix4 M = ro->getTransformAsMatrix(); + Ra::Core::Matrix4 MV = viewParams.viewMatrix * M; + Ra::Core::Vector3 V = MV.block<3, 1>( 0, 3 ); + Scalar d = V.norm(); + + Ra::Core::Matrix4 S = Ra::Core::Matrix4::Identity(); + S.coeffRef( 0, 0 ) = S.coeffRef( 1, 1 ) = S.coeffRef( 2, 2 ) = d; + + M = M * S; + + shader->setUniform( "transform.proj", viewParams.projMatrix ); + shader->setUniform( "transform.view", viewParams.viewMatrix ); + shader->setUniform( "transform.model", M ); + + auto shaderParameter = ro->getRenderTechnique()->getParametersProvider(); + if ( shaderParameter != nullptr ) shaderParameter->getParameters().bind( shader ); + + // render + ro->getMesh()->render( shader ); + } + } + + // DebugRender::getInstance()->render( renderData.viewMatrix, renderData.projMatrix ); + + m_fbo->unbind(); + } /// Add the output colorBuffer -void UIPass::setOutput( const SharedTextures& colorBuffer ) {} +void UIPass::setOutput( const Ra::Engine::Data::Texture* colorBuffer ) { + m_outputTexture = colorBuffer; +} /// These inputs must be computed before executing this pass /// depth buffer ? // TODO verify we need this -void UIPass::setInputs( const SharedTextures& depthBuffer ) {} +void UIPass::setInputs( const SharedTextures& depthBuffer ) { + addImportedTextures( {"Ui::Depth", depthBuffer.second} ); +} } // namespace RadiumNBR diff --git a/src/libRender/RadiumNBR/Passes/UiPass.hpp b/src/libRender/RadiumNBR/Passes/UiPass.hpp index 4e92a4bebe51aee6e8ac719fa1b51ed06de7dd54..0895cadfe99740d1d0b9f5a2962915c45174866d 100644 --- a/src/libRender/RadiumNBR/Passes/UiPass.hpp +++ b/src/libRender/RadiumNBR/Passes/UiPass.hpp @@ -16,8 +16,7 @@ namespace RadiumNBR { class UIPass : public RenderPass { public: - UIPass( const std::vector<RenderObjectPtr>* objectsToRender, - const Ra::Core::Utils::Index& idx ); + UIPass( const std::vector<RenderObjectPtr>* objectsToRender); ~UIPass() override; bool buildRenderTechnique( const Ra::Engine::Rendering::RenderObject* ro, @@ -30,7 +29,7 @@ class UIPass : public RenderPass void execute( const Ra::Engine::Data::ViewingParameters& viewParams ) const override; /// Add the output colorBuffer - void setOutput( const SharedTextures& colorBuffer ); + void setOutput( const Ra::Engine::Data::Texture* colorBuffer ); /// These inputs must be computed before executing this pass /// depth buffer ? // TODO verify we need this @@ -44,6 +43,6 @@ class UIPass : public RenderPass Ra::Engine::Data::ShaderProgramManager* m_shaderMngr{nullptr}; /// The color texture for output.Stored here for easy access. - SharedTextures m_outputTexture; + const Ra::Engine::Data::Texture* m_outputTexture; }; } // namespace RadiumNBR