Exemplo n.º 1
0
void MySprite::Draw(MyMatrix* matviewproj, ShaderGroup* pShaderOverride)
{
    if( m_pMaterial == 0 || m_pMaterial->GetShader() == 0 )
        return;

    MyAssert( m_pVertexBuffer != 0 && m_pIndexBuffer != 0 );

    if( m_pVertexBuffer->m_Dirty )
        m_pVertexBuffer->Rebuild( 0, m_pVertexBuffer->m_DataSize );
    if( m_pIndexBuffer->m_Dirty )
        m_pIndexBuffer->Rebuild( 0, m_pIndexBuffer->m_DataSize );
    MyAssert( m_pIndexBuffer->m_Dirty == false && m_pVertexBuffer->m_Dirty == false );

    Shader_Base* pShader = 0;
    if( pShaderOverride )
    {
        // if an override for the shader is sent in, it's already active and doesn't want anything other than position set.
        pShader = (Shader_Base*)pShaderOverride->GlobalPass( 0, 4 );

        MyAssert( pShader );
        if( pShader == 0 )
            return;

        pShader->SetupAttributes( m_pVertexBuffer, m_pIndexBuffer, false );
        pShader->ProgramPosition( matviewproj, &m_Position );

        MyDrawElements( GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0 );
        pShader->DeactivateShader( m_pVertexBuffer );
    }
    else
    {
        pShader = (Shader_Base*)m_pMaterial->GetShader()->GlobalPass();

        MyAssert( pShader );
        if( pShader == 0 )
            return;

        // Enable blending if necessary. TODO: sort draws and only set this once.
        if( m_pMaterial->IsTransparent( pShader ) )
        {
            glEnable( GL_BLEND );
            glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
        }

        if( pShader->ActivateAndProgramShader(
                m_pVertexBuffer, m_pIndexBuffer, GL_UNSIGNED_SHORT,
                matviewproj, &m_Position, m_pMaterial ) )
        {
            pShader->ProgramFramebufferSize( (float)g_GLStats.m_CurrentFramebufferWidth, (float)g_GLStats.m_CurrentFramebufferHeight );

            MyDrawElements( GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0 );
            pShader->DeactivateShader( m_pVertexBuffer );
        }

        // always disable blending
        glDisable( GL_BLEND );
    }
}
Exemplo n.º 2
0
void MySprite::DrawNoSetup()
{
    if( m_pMaterial == 0 )
        return;

#if USE_D3D
    g_pD3DContext->DrawIndexed( 6, 0, 0 );
    //g_pD3DContext->Draw( 6, 0 );
#else
    MyDrawElements( GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0 );
#endif
}
Exemplo n.º 3
0
void MySprite9::Draw(MyMatrix* matviewproj)
{
    if( m_pMaterial == 0 || m_pMaterial->GetShader() == 0 )

    MyAssert( m_pVertexBuffer != 0 && m_pIndexBuffer != 0 );

    if( m_pVertexBuffer->m_Dirty )
        m_pVertexBuffer->Rebuild( 0, m_pVertexBuffer->m_DataSize );
    if( m_pIndexBuffer->m_Dirty )
        m_pIndexBuffer->Rebuild( 0, m_pIndexBuffer->m_DataSize );
    MyAssert( m_pIndexBuffer->m_Dirty == false && m_pVertexBuffer->m_Dirty == false );

    Shader_Base* pShader = (Shader_Base*)m_pMaterial->GetShader()->GlobalPass();
    if( pShader == 0 )
        return;

    // Enable blending if necessary. TODO: sort draws and only set this once.
    if( m_pMaterial->IsTransparent( pShader ) )
    {
        glEnable( GL_BLEND );
        glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
    }

    if( pShader->ActivateAndProgramShader(
            m_pVertexBuffer, m_pIndexBuffer, GL_UNSIGNED_SHORT, 
            matviewproj, &m_Position, m_pMaterial ) )
    {
#if USE_D3D
        g_pD3DContext->DrawIndexed( 6, 0, 0 );
        //g_pD3DContext->Draw( 6, 0 );
#else
        MyDrawElements( GL_TRIANGLE_STRIP, 24, GL_UNSIGNED_SHORT, 0 );
#endif
        pShader->DeactivateShader( m_pVertexBuffer );
    }

    // always disable blending
    glDisable( GL_BLEND );
}
Exemplo n.º 4
0
void ParticleRenderer::Draw(MyMatrix* matviewproj)
{
#if MY_SHITTY_LAPTOP
    //return;
#endif

    if( m_pTexture == 0 || m_pTexture->m_TextureID == 0 || m_pShaderGroup == 0 || m_ParticleCount == 0 )
        return;

    //glEnable(GL_TEXTURE_2D);
#if MYFW_WINDOWS
//#define GL_POINT_SPRITE 0x8861
//#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642

#if !USE_INDEXED_TRIANGLES
    glEnable( GL_POINT_SPRITE );
    glEnable( GL_VERTEX_PROGRAM_POINT_SIZE );
#endif
#endif
    //glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
    //glEnable(GL_ARB_point_sprite);

    //glEnable( GL_BLEND );
    if( m_Additive )
    {
        glBlendFunc( GL_ONE, GL_ONE );
#if USE_D3D
        float blendfactor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
        g_pD3DContext->OMSetBlendState( g_pD3DBlendStateEnabledAdditive.Get(), blendfactor, 0xfff);
#endif
    }

    int numverts = m_ParticleCount;
#if USE_INDEXED_TRIANGLES
    numverts *= 4;
#endif

    if( m_pVertexBuffer->m_Dirty )
        m_pVertexBuffer->Rebuild( 0, sizeof(Vertex_PointSprite)*numverts );
    if( m_pIndexBuffer->m_Dirty )
        m_pIndexBuffer->Rebuild( 0, m_pIndexBuffer->m_DataSize );
    assert( m_pIndexBuffer->m_Dirty == false && m_pVertexBuffer->m_Dirty == false );

    //glBindBuffer( GL_ARRAY_BUFFER, m_pVertexBuffer->m_CurrentBufferID );
    //glBufferSubData( GL_ARRAY_BUFFER, 0, sizeof(Vertex_PointSprite)*numverts, pVerts );

    //if( ((Shader_PointSprite*)m_pShader)->ActivateAndProgramShader( matviewproj, &m_Position, (Vertex_XYZUV*)m_pVerts, m_pTexture->m_TextureID ) )
    //if( ((Shader_PointSprite*)m_pShader)->ActivateAndProgramShader( matviewproj, 0, (Vertex_PointSprite*)m_pVerts, m_pTexture->m_TextureID ) )
    //if( ((Shader_PointSprite*)m_pShader)->ActivateAndProgramShader( matviewproj, 0, (Vertex_PointSprite*)m_pVerts, m_pTexture->m_TextureID ) )
#if USE_INDEXED_TRIANGLES
    if( ((Shader_Base*)m_pShaderGroup->GlobalPass())->ActivateAndProgramShader(
        VertexFormat_PointSprite, m_pVertexBuffer, m_pIndexBuffer, GL_UNSIGNED_SHORT,
        matviewproj, 0, m_pTexture->m_TextureID ) )
    {
        MyDrawElements( GL_TRIANGLES, m_ParticleCount*6, GL_UNSIGNED_SHORT, 0 );
        m_pShaderGroup->GlobalPass()->DeactivateShader( m_pVertexBuffer );
    }
#else
    if( ((Shader_PointSprite*)m_pShaderGroup->GlobalPass())->ActivateAndProgramShader( 
        matviewproj, 0, m_VertexBufferID, 0, GL_UNSIGNED_SHORT, m_pTexture->m_TextureID ) )
    {
        MyDrawArrays( GL_POINTS, 0, m_ParticleCount );
        m_pShaderGroup->GlobalPass()->DeactivateShader();
    }
#endif

    //glEnable( GL_BLEND );
    if( m_Additive ) // revert back to regular enabled alpha blending.
    {
        glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
#if USE_D3D
        float blendfactor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
        g_pD3DContext->OMSetBlendState( g_pD3DBlendStateEnabled.Get(), blendfactor, 0xfff);
#endif
    }

    return;
}