Commit 27113348 authored by Maciej Suminski's avatar Maciej Suminski
Browse files

Fixed blending function for OpenGL compositing. Corrected documentation,...

Fixed blending function for OpenGL compositing. Corrected documentation, removed unnecessary functions.
parent 67c0cd22
Loading
Loading
Loading
Loading
+47 −57
Original line number Diff line number Diff line
/*i
/*
 * This program source code file is part of KiCad, a free EDA CAD application.
 *
 * Copyright (C) 2013 CERN
@@ -103,8 +103,9 @@ unsigned int OPENGL_COMPOSITOR::GetBuffer()
{
    wxASSERT( m_initialized );

    if( m_buffers.size() < m_maxBuffers )
    {
    if( m_buffers.size() >= m_maxBuffers )
        return 0;       // Unfortunately we have no more free buffers left

    // GL_COLOR_ATTACHMENTn are consecutive integers
    GLuint attachmentPoint = GL_COLOR_ATTACHMENT0 + usedBuffers();
    GLuint textureTarget;
@@ -114,6 +115,7 @@ unsigned int OPENGL_COMPOSITOR::GetBuffer()
    glBindTexture( GL_TEXTURE_2D, textureTarget );

    // Set texture parameters
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, m_width, m_height, 0, GL_RGBA,
                  GL_UNSIGNED_BYTE, NULL );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
@@ -128,21 +130,18 @@ unsigned int OPENGL_COMPOSITOR::GetBuffer()
    m_currentFbo = 0;

    // Store the new buffer
        BUFFER_ITEM buffer = { textureTarget, attachmentPoint };
    OPENGL_BUFFER buffer = { textureTarget, attachmentPoint };
    m_buffers.push_back( buffer );

    return usedBuffers();
}

    // Unfortunately we have no more buffers left
    return 0;
}


void OPENGL_COMPOSITOR::SetBuffer( unsigned int aBufferHandle )
{
    if( aBufferHandle <= usedBuffers() )
    {
    if( aBufferHandle > usedBuffers() )
        return;

    // Change the rendering destination to the selected attachment point
    if( m_currentFbo != m_framebuffer )
    {
@@ -152,9 +151,8 @@ void OPENGL_COMPOSITOR::SetBuffer( unsigned int aBufferHandle )

    if( m_current != aBufferHandle - 1 )
    {
            glDrawBuffer( m_buffers[m_current].attachmentPoint );
        m_current = aBufferHandle - 1;
        }
        glDrawBuffer( m_buffers[m_current].attachmentPoint );
    }
}

@@ -168,15 +166,7 @@ void OPENGL_COMPOSITOR::ClearBuffer()
}


void OPENGL_COMPOSITOR::BlitBuffer( unsigned int aBufferHandle )
{
    wxASSERT( m_initialized );

    wxASSERT_MSG( false, wxT( "Not implemented yet" ) );
}


void OPENGL_COMPOSITOR::DrawBuffer( unsigned int aBufferHandle, double aDepth )
void OPENGL_COMPOSITOR::DrawBuffer( unsigned int aBufferHandle )
{
    wxASSERT( m_initialized );

@@ -202,18 +192,18 @@ void OPENGL_COMPOSITOR::DrawBuffer( unsigned int aBufferHandle, double aDepth )

    glBegin( GL_TRIANGLES );
    glTexCoord2f( 0.0f,  1.0f );
    glVertex3f(  -1.0f, -1.0f, aDepth );
    glVertex2f(  -1.0f, -1.0f );
    glTexCoord2f( 1.0f,  1.0f );
    glVertex3f(   1.0f, -1.0f, aDepth );
    glVertex2f(   1.0f, -1.0f );
    glTexCoord2f( 1.0f,  0.0f );
    glVertex3f(   1.0f,  1.0f, aDepth );
    glVertex2f(   1.0f,  1.0f );

    glTexCoord2f( 0.0f,  1.0f );
    glVertex3f(  -1.0f, -1.0f, aDepth );
    glVertex2f(  -1.0f, -1.0f );
    glTexCoord2f( 1.0f,  0.0f );
    glVertex3f(   1.0f,  1.0f, aDepth );
    glVertex2f(   1.0f,  1.0f );
    glTexCoord2f( 0.0f,  0.0f );
    glVertex3f(  -1.0f,  1.0f, aDepth );
    glVertex2f(  -1.0f,  1.0f );
    glEnd();

    glPopMatrix();
@@ -229,7 +219,7 @@ void OPENGL_COMPOSITOR::clean()
    glDeleteFramebuffers( 1, &m_framebuffer );
    glDeleteRenderbuffers( 1, &m_depthBuffer );

    Buffers::const_iterator it;
    OPENGL_BUFFERS::const_iterator it;
    for( it = m_buffers.begin(); it != m_buffers.end(); ++it )
    {
        glDeleteTextures( 1, &it->textureTarget );
+2 −2
Original line number Diff line number Diff line
@@ -333,8 +333,8 @@ void OPENGL_GAL::EndDrawing()

    // Draw the remaining contents, blit the rendering targets to the screen, swap the buffers
    glFlush();
    compositor.DrawBuffer( mainBuffer, -1.0 );
    compositor.DrawBuffer( overlayBuffer, 0.0 );
    compositor.DrawBuffer( mainBuffer );
    compositor.DrawBuffer( overlayBuffer );
    SwapBuffers();

    delete clientDC;
+1 −10
Original line number Diff line number Diff line
@@ -80,22 +80,13 @@ public:
     */
    virtual void ClearBuffer() = 0;

    /**
     * Function BlitBuffer()
     * pastes the content of the buffer to the current buffer (set by SetBuffer() function).
     *
     * @param aBufferHandle is the handle to the buffer that is going to be pasted.
     */
   virtual void BlitBuffer( unsigned int aBufferHandle ) = 0;

    /**
     * Function DrawBuffer()
     * draws the selected buffer on the screen.
     *
     * @param aBufferHandle is the handle of the buffer to be drawn.
     * @param aDepth is the depth on which the buffer should be drawn. // TODO mention if higher depth value means close to the screen or is it opposite
     */
    virtual void DrawBuffer( unsigned int aBufferHandle, double aDepth ) = 0;
    virtual void DrawBuffer( unsigned int aBufferHandle ) = 0;

protected:
    unsigned int m_width;           ///< Width of the buffer (in pixels)
+17 −18
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@

#include <gal/compositor.h>
#include <GL/glew.h>
#include <vector>
#include <deque>

namespace KiGfx
{
@@ -44,41 +44,40 @@ public:
    OPENGL_COMPOSITOR();
    virtual ~OPENGL_COMPOSITOR();

    ///< @copydoc COMPOSITOR::Initialize()
    /// @copydoc COMPOSITOR::Initialize()
    virtual void Initialize();

    ///< @copydoc COMPOSITOR::Resize()
    /// @copydoc COMPOSITOR::Resize()
    virtual void Resize( unsigned int aWidth, unsigned int aHeight );

    ///< @copydoc COMPOSITOR::GetBuffer()
    /// @copydoc COMPOSITOR::GetBuffer()
    virtual unsigned int GetBuffer();

    ///< @copydoc COMPOSITOR::SetBuffer()
    /// @copydoc COMPOSITOR::SetBuffer()
    virtual void SetBuffer( unsigned int aBufferHandle );

    ///< @copydoc COMPOSITOR::ClearBuffer()
    /// @copydoc COMPOSITOR::ClearBuffer()
    virtual void ClearBuffer();

    ///< @copydoc COMPOSITOR::BlitBuffer()
    virtual void BlitBuffer( unsigned int aBufferHandle );

    ///< @copydoc COMPOSITOR::DrawBuffer()
    virtual void DrawBuffer( unsigned int aBufferHandle, double aDepth );
    /// @copydoc COMPOSITOR::DrawBuffer()
    virtual void DrawBuffer( unsigned int aBufferHandle );

protected:
    typedef struct
    {
        GLuint textureTarget;                ///< Main texture handle
        GLuint attachmentPoint;
    } BUFFER_ITEM;
        GLuint attachmentPoint;              ///< Point to which an image from texture is attached
    } OPENGL_BUFFER;

    bool                        m_initialized;
    unsigned int                m_current;
    bool                        m_initialized;            ///< Initialization status flag
    unsigned int                m_current;                ///< Currently used buffer handle
    GLuint                      m_framebuffer;            ///< Main FBO handle
    GLuint                      m_depthBuffer;            ///< Depth buffer handle
    unsigned int                m_maxBuffers;             ///< Maximal amount of buffers
    typedef std::vector<BUFFER_ITEM> Buffers;
    Buffers                     m_buffers;
    typedef std::deque<OPENGL_BUFFER> OPENGL_BUFFERS;

    /// Stores information about initialized buffers
    OPENGL_BUFFERS              m_buffers;

    /// Store the currently used FBO name in case there was more than one compositor used
    static GLuint               m_currentFbo;
@@ -89,7 +88,7 @@ protected:
     */
    void clean();

    ///< Returns number of used buffers
    /// Returns number of used buffers
    unsigned int usedBuffers()
    {
        return m_buffers.size();