From: nds Date: Mon, 7 Sep 2020 17:47:21 +0000 (+0300) Subject: 0031457: Visualization - interface to find an active frame buffer X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=refs%2Fheads%2FCR31457_1;p=occt-copy.git 0031457: Visualization - interface to find an active frame buffer --- diff --git a/src/OpenGl/OpenGl_Context.cxx b/src/OpenGl/OpenGl_Context.cxx index 257f8d425f..7c66f102ba 100644 --- a/src/OpenGl/OpenGl_Context.cxx +++ b/src/OpenGl/OpenGl_Context.cxx @@ -458,6 +458,7 @@ void OpenGl_Context::SetReadBuffer (const Standard_Integer theReadBuffer) && arbFBO != NULL) { arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER); + SetActiveFrameBuffer (NULL); } ::glReadBuffer (myReadBuffer); #else @@ -477,6 +478,7 @@ void OpenGl_Context::SetDrawBuffer (const Standard_Integer theDrawBuffer) && arbFBO != NULL) { arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER); + SetActiveFrameBuffer (NULL); } ::glDrawBuffer (aDrawBuffer); @@ -517,6 +519,7 @@ void OpenGl_Context::SetDrawBuffers (const Standard_Integer theNb, const Standar if (arbFBO != NULL && useDefaultFbo) { arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER); + SetActiveFrameBuffer (NULL); } myFuncs->glDrawBuffers (theNb, (const GLenum*)theDrawBuffers); diff --git a/src/OpenGl/OpenGl_Context.hxx b/src/OpenGl/OpenGl_Context.hxx index 916478e1a4..1c788df03f 100644 --- a/src/OpenGl/OpenGl_Context.hxx +++ b/src/OpenGl/OpenGl_Context.hxx @@ -916,6 +916,18 @@ public: //! @name methods to alter or retrieve current state //! Bind default Vertex Array Object Standard_EXPORT void BindDefaultVao(); + //! Active Frame Buffer Object. + const Handle(OpenGl_FrameBuffer)& ActiveFrameBuffer() const + { + return myActiveFbo; + } + + //! Setup Active Frame Buffer Object. + void SetActiveFrameBuffer (const Handle(OpenGl_FrameBuffer)& theFbo) + { + myActiveFbo = theFbo; + } + //! Default Frame Buffer Object. const Handle(OpenGl_FrameBuffer)& DefaultFrameBuffer() const { @@ -1173,6 +1185,7 @@ private: //! @name fields tracking current state //!< currently active sampler objects Standard_Integer myActiveMockTextures; //!< currently active mock sampler objects Handle(OpenGl_FrameBuffer) myDefaultFbo; //!< default Frame Buffer Object + Handle(OpenGl_FrameBuffer) myActiveFbo; //!< active Frame Buffer Object Handle(OpenGl_LineAttributes) myHatchStyles; //!< resource holding predefined hatch styles patterns Standard_Integer myActiveHatchType; //!< currently activated type of polygon hatch Standard_Boolean myHatchIsEnabled; //!< current enabled state of polygon hatching rasterization diff --git a/src/OpenGl/OpenGl_FrameBuffer.cxx b/src/OpenGl/OpenGl_FrameBuffer.cxx index a05e321660..5459b69ac2 100644 --- a/src/OpenGl/OpenGl_FrameBuffer.cxx +++ b/src/OpenGl/OpenGl_FrameBuffer.cxx @@ -196,6 +196,7 @@ Standard_Boolean OpenGl_FrameBuffer::Init (const Handle(OpenGl_Context)& theGlCo // Build FBO and setup it as texture theGlContext->arbFBO->glGenFramebuffers (1, &myGlFBufferId); theGlContext->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, myGlFBufferId); + theGlContext->SetActiveFrameBuffer (this); for (Standard_Integer aColorBufferIdx = 0; aColorBufferIdx < myColorTextures.Length(); ++aColorBufferIdx) { @@ -346,6 +347,7 @@ Standard_Boolean OpenGl_FrameBuffer::Init (const Handle(OpenGl_Context)& theGlCo // Build FBO and setup it as texture theGlContext->arbFBO->glGenFramebuffers (1, &myGlFBufferId); theGlContext->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, myGlFBufferId); + theGlContext->SetActiveFrameBuffer (this); for (Standard_Integer aColorBufferIdx = 0; aColorBufferIdx < myColorTextures.Length(); ++aColorBufferIdx) { const Handle(OpenGl_Texture)& aColorTexture = myColorTextures (aColorBufferIdx); @@ -512,6 +514,7 @@ Standard_Boolean OpenGl_FrameBuffer::InitWithRB (const Handle(OpenGl_Context)& t // create FBO theGlCtx->arbFBO->glGenFramebuffers (1, &myGlFBufferId); theGlCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, myGlFBufferId); + theGlCtx->SetActiveFrameBuffer (this); theGlCtx->arbFBO->glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, myGlColorRBufferId); if (myGlDepthRBufferId != NO_RENDERBUFFER) @@ -692,6 +695,7 @@ void OpenGl_FrameBuffer::BindBuffer (const Handle(OpenGl_Context)& theGlCtx) { theGlCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, myGlFBufferId); theGlCtx->SetFrameBufferSRGB (true); + theGlCtx->SetActiveFrameBuffer (this); } // ======================================================================= @@ -702,6 +706,7 @@ void OpenGl_FrameBuffer::BindDrawBuffer (const Handle(OpenGl_Context)& theGlCtx) { theGlCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, myGlFBufferId); theGlCtx->SetFrameBufferSRGB (true); + theGlCtx->SetActiveFrameBuffer (this); } // ======================================================================= @@ -711,6 +716,7 @@ void OpenGl_FrameBuffer::BindDrawBuffer (const Handle(OpenGl_Context)& theGlCtx) void OpenGl_FrameBuffer::BindReadBuffer (const Handle(OpenGl_Context)& theGlCtx) { theGlCtx->arbFBO->glBindFramebuffer (GL_READ_FRAMEBUFFER, myGlFBufferId); + theGlCtx->SetActiveFrameBuffer (this); } // ======================================================================= @@ -728,6 +734,7 @@ void OpenGl_FrameBuffer::UnbindBuffer (const Handle(OpenGl_Context)& theGlCtx) { theGlCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, NO_FRAMEBUFFER); theGlCtx->SetFrameBufferSRGB (false); + theGlCtx->SetActiveFrameBuffer (NULL); } } diff --git a/src/OpenGl/OpenGl_View_Redraw.cxx b/src/OpenGl/OpenGl_View_Redraw.cxx index bbe25aa223..aa2b89e37e 100644 --- a/src/OpenGl/OpenGl_View_Redraw.cxx +++ b/src/OpenGl/OpenGl_View_Redraw.cxx @@ -1269,6 +1269,7 @@ void OpenGl_View::renderStructs (Graphic3d_Camera::Projection theProjection, { aCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, 0); aCtx->SetFrameBufferSRGB (false); + aCtx->SetActiveFrameBuffer (NULL); } // Render non-polygonal elements in default layer @@ -1285,6 +1286,7 @@ void OpenGl_View::renderStructs (Graphic3d_Camera::Projection theProjection, { aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, 0); aCtx->SetFrameBufferSRGB (false); + aCtx->SetActiveFrameBuffer (NULL); } // Reset OpenGl aspects state to default to avoid enabling of @@ -1483,6 +1485,7 @@ bool OpenGl_View::blitBuffers (OpenGl_FrameBuffer* theReadFbo, { aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER); aCtx->SetFrameBufferSRGB (false); + aCtx->SetActiveFrameBuffer (NULL); } const Standard_Integer aViewport[4] = { 0, 0, aDrawSizeX, aDrawSizeY }; aCtx->ResizeViewport (aViewport); @@ -1528,6 +1531,7 @@ bool OpenGl_View::blitBuffers (OpenGl_FrameBuffer* theReadFbo, } aCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER); aCtx->SetFrameBufferSRGB (false); + aCtx->SetActiveFrameBuffer (NULL); } // we don't copy stencil buffer here... does it matter for performance? @@ -1569,6 +1573,7 @@ bool OpenGl_View::blitBuffers (OpenGl_FrameBuffer* theReadFbo, { aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER); aCtx->SetFrameBufferSRGB (false); + aCtx->SetActiveFrameBuffer (NULL); } } else