Skip to content

Commit

Permalink
Gerbview: Fix diff mode issues with OpenGL transparency
Browse files Browse the repository at this point in the history
  • Loading branch information
mikebwilliams authored and craftyjon committed Jan 2, 2022
1 parent 356cddd commit 404659d
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 2 deletions.
22 changes: 20 additions & 2 deletions common/gal/opengl/opengl_gal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,8 +204,10 @@ OPENGL_GAL::OPENGL_GAL( GAL_DISPLAY_OPTIONS& aDisplayOptions, wxWindow* aParent,
m_cachedManager( nullptr ),
m_nonCachedManager( nullptr ),
m_overlayManager( nullptr ),
m_tempManager( nullptr ),
m_mainBuffer( 0 ),
m_overlayBuffer( 0 ),
m_tempBuffer( 0 ),
m_isContextLocked( false ),
m_lockClientCookie( 0 )
{
Expand Down Expand Up @@ -300,6 +302,7 @@ OPENGL_GAL::~OPENGL_GAL()
delete m_cachedManager;
delete m_nonCachedManager;
delete m_overlayManager;
delete m_tempManager;
}

GL_CONTEXT_MANAGER::Get().UnlockCtx( m_glPrivContext );
Expand Down Expand Up @@ -442,6 +445,7 @@ void OPENGL_GAL::BeginDrawing()
// Prepare rendering target buffers
m_compositor->Initialize();
m_mainBuffer = m_compositor->CreateBuffer();
m_tempBuffer = m_compositor->CreateBuffer();
try
{
m_overlayBuffer = m_compositor->CreateBuffer();
Expand Down Expand Up @@ -493,10 +497,12 @@ void OPENGL_GAL::BeginDrawing()
// Remove all previously stored items
m_nonCachedManager->Clear();
m_overlayManager->Clear();
m_tempManager->Clear();

m_cachedManager->BeginDrawing();
m_nonCachedManager->BeginDrawing();
m_overlayManager->BeginDrawing();
m_tempManager->BeginDrawing();

if( !m_isBitmapFontInitialized )
{
Expand Down Expand Up @@ -1716,6 +1722,7 @@ void OPENGL_GAL::SetTarget( RENDER_TARGET aTarget )
case TARGET_CACHED: m_currentManager = m_cachedManager; break;
case TARGET_NONCACHED: m_currentManager = m_nonCachedManager; break;
case TARGET_OVERLAY: m_currentManager = m_overlayManager; break;
case TARGET_TEMP: m_currentManager = m_tempManager; break;
}

m_currentTarget = aTarget;
Expand All @@ -1742,6 +1749,10 @@ void OPENGL_GAL::ClearTarget( RENDER_TARGET aTarget )
m_compositor->SetBuffer( m_mainBuffer );
break;

case TARGET_TEMP:
m_compositor->SetBuffer( m_tempBuffer );
break;

case TARGET_OVERLAY:
if( m_overlayBuffer )
m_compositor->SetBuffer( m_overlayBuffer );
Expand All @@ -1763,6 +1774,7 @@ bool OPENGL_GAL::HasTarget( RENDER_TARGET aTarget )
switch( aTarget )
{
default:
case TARGET_TEMP:
case TARGET_CACHED:
case TARGET_NONCACHED: return true;
case TARGET_OVERLAY: return ( m_overlayBuffer != 0 );
Expand All @@ -1773,14 +1785,18 @@ bool OPENGL_GAL::HasTarget( RENDER_TARGET aTarget )
void OPENGL_GAL::StartDiffLayer()
{
m_currentManager->EndDrawing();
SetTarget( TARGET_TEMP );
ClearTarget( TARGET_TEMP );
}


void OPENGL_GAL::EndDiffLayer()
{
glBlendFunc( GL_SRC_ALPHA, GL_ONE );
glBlendEquation( GL_MAX );
m_currentManager->EndDrawing();
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glBlendEquation( GL_FUNC_ADD );

m_compositor->DrawBuffer( m_tempBuffer, m_mainBuffer );
}


Expand Down Expand Up @@ -2307,11 +2323,13 @@ void OPENGL_GAL::init()
m_cachedManager = new VERTEX_MANAGER( true );
m_nonCachedManager = new VERTEX_MANAGER( false );
m_overlayManager = new VERTEX_MANAGER( false );
m_tempManager = new VERTEX_MANAGER( false );

// Make VBOs use shaders
m_cachedManager->SetShader( *m_shader );
m_nonCachedManager->SetShader( *m_shader );
m_overlayManager->SetShader( *m_shader );
m_tempManager->SetShader( *m_shader );

m_isInitialized = true;
}
Expand Down
2 changes: 2 additions & 0 deletions include/gal/opengl/opengl_gal.h
Original file line number Diff line number Diff line change
Expand Up @@ -335,11 +335,13 @@ class OPENGL_GAL : public GAL, public HIDPI_GL_CANVAS
VERTEX_MANAGER* m_cachedManager; ///< Container for storing cached VERTEX_ITEMs
VERTEX_MANAGER* m_nonCachedManager; ///< Container for storing non-cached VERTEX_ITEMs
VERTEX_MANAGER* m_overlayManager; ///< Container for storing overlaid VERTEX_ITEMs
VERTEX_MANAGER* m_tempManager; ///< Container for storing temp (diff mode) VERTEX_ITEMs

// Framebuffer & compositing
OPENGL_COMPOSITOR* m_compositor; ///< Handles multiple rendering targets
unsigned int m_mainBuffer; ///< Main rendering target
unsigned int m_overlayBuffer; ///< Auxiliary rendering target (for menus etc.)
unsigned int m_tempBuffer; ///< Temporary rendering target (for diffing etc.)
RENDER_TARGET m_currentTarget; ///< Current rendering target

// Shader
Expand Down

0 comments on commit 404659d

Please sign in to comment.