2014-11-28 14:56:08 -05:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
|
|
/*
|
|
|
|
* This file is part of the LibreOffice project.
|
|
|
|
*
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
*/
|
|
|
|
|
2016-04-28 14:55:45 +09:00
|
|
|
#include "opengl/program.hxx"
|
|
|
|
#include "opengl/RenderState.hxx"
|
2014-11-28 14:56:08 -05:00
|
|
|
|
|
|
|
#include <vcl/opengl/OpenGLHelper.hxx>
|
2016-04-28 14:55:45 +09:00
|
|
|
#include <vcl/opengl/OpenGLContext.hxx>
|
2014-11-28 14:56:08 -05:00
|
|
|
|
|
|
|
#include <glm/glm.hpp>
|
|
|
|
#include <glm/gtc/type_ptr.hpp>
|
2015-07-08 18:43:32 +09:00
|
|
|
#include <glm/gtc/matrix_transform.hpp>
|
2014-11-28 14:56:08 -05:00
|
|
|
|
|
|
|
OpenGLProgram::OpenGLProgram() :
|
|
|
|
mnId( 0 ),
|
|
|
|
mnEnabledAttribs( 0 ),
|
|
|
|
mnPositionAttrib( SAL_MAX_UINT32 ),
|
|
|
|
mnTexCoordAttrib( SAL_MAX_UINT32 ),
|
|
|
|
mnAlphaCoordAttrib( SAL_MAX_UINT32 ),
|
2015-08-24 15:00:26 +09:00
|
|
|
mnMaskCoordAttrib( SAL_MAX_UINT32 ),
|
2016-05-29 12:37:41 +09:00
|
|
|
mnExtrusionVectorsAttrib( SAL_MAX_UINT32 ),
|
|
|
|
mnVertexColorsAttrib( SAL_MAX_UINT32 ),
|
|
|
|
mbBlending(false),
|
2015-08-20 16:22:43 +02:00
|
|
|
mfLastWidth(0.0),
|
|
|
|
mfLastHeight(0.0),
|
|
|
|
mfLastPixelOffset(0.0)
|
2014-11-28 14:56:08 -05:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
OpenGLProgram::~OpenGLProgram()
|
|
|
|
{
|
|
|
|
maUniformLocations.clear();
|
|
|
|
if( mnId != 0 )
|
2015-11-17 09:20:25 +02:00
|
|
|
{
|
2014-11-28 14:56:08 -05:00
|
|
|
glDeleteProgram( mnId );
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
|
|
|
}
|
2014-11-28 14:56:08 -05:00
|
|
|
}
|
|
|
|
|
2015-09-13 12:15:13 +02:00
|
|
|
bool OpenGLProgram::Load( const OUString& rVertexShader,
|
|
|
|
const OUString& rFragmentShader,
|
|
|
|
const rtl::OString& preamble,
|
|
|
|
const rtl::OString& rDigest )
|
2014-11-28 14:56:08 -05:00
|
|
|
{
|
2015-09-13 12:15:13 +02:00
|
|
|
mnId = OpenGLHelper::LoadShaders( rVertexShader, rFragmentShader, preamble, rDigest );
|
2014-11-28 14:56:08 -05:00
|
|
|
return ( mnId != 0 );
|
|
|
|
}
|
|
|
|
|
2016-05-12 13:37:11 +09:00
|
|
|
void OpenGLProgram::Reuse()
|
|
|
|
{
|
|
|
|
mbBlending = false;
|
|
|
|
}
|
|
|
|
|
2014-11-28 14:56:08 -05:00
|
|
|
bool OpenGLProgram::Use()
|
|
|
|
{
|
2016-05-12 13:37:11 +09:00
|
|
|
if (!mnId)
|
2014-11-28 14:56:08 -05:00
|
|
|
return false;
|
|
|
|
|
2016-05-12 13:37:11 +09:00
|
|
|
glUseProgram(mnId);
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
2016-05-12 13:37:11 +09:00
|
|
|
Reuse();
|
2014-11-28 14:56:08 -05:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool OpenGLProgram::Clean()
|
|
|
|
{
|
|
|
|
// unbind all textures
|
2016-04-28 14:55:45 +09:00
|
|
|
for (OpenGLTexture& rTexture : maTextures)
|
2014-11-28 14:56:08 -05:00
|
|
|
{
|
2016-04-28 14:55:45 +09:00
|
|
|
rTexture.Unbind();
|
2014-11-28 14:56:08 -05:00
|
|
|
}
|
2016-04-28 14:55:45 +09:00
|
|
|
maTextures.clear();
|
2014-11-28 14:56:08 -05:00
|
|
|
|
|
|
|
// disable any enabled vertex attrib array
|
|
|
|
if( mnEnabledAttribs )
|
|
|
|
{
|
|
|
|
for( int i = 0; i < 32; i++ )
|
|
|
|
{
|
|
|
|
if( mnEnabledAttribs & ( 1 << i ) )
|
2015-11-17 09:20:25 +02:00
|
|
|
{
|
2014-11-28 14:56:08 -05:00
|
|
|
glDisableVertexAttribArray( i );
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
|
|
|
}
|
2014-11-28 14:56:08 -05:00
|
|
|
}
|
|
|
|
mnEnabledAttribs = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2016-05-27 17:54:50 +09:00
|
|
|
bool OpenGLProgram::EnableVertexAttrib(GLuint& rAttrib, const OString& rName)
|
2014-11-28 14:56:08 -05:00
|
|
|
{
|
|
|
|
if( rAttrib == SAL_MAX_UINT32 )
|
2015-11-17 09:20:25 +02:00
|
|
|
{
|
2016-05-27 17:54:50 +09:00
|
|
|
GLint aLocation = glGetAttribLocation(mnId, rName.getStr());
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
2016-05-27 17:54:50 +09:00
|
|
|
if (aLocation < 0)
|
|
|
|
return false;
|
|
|
|
rAttrib = GLuint(aLocation);
|
2015-11-17 09:20:25 +02:00
|
|
|
}
|
2014-11-28 14:56:08 -05:00
|
|
|
if( (mnEnabledAttribs & ( 1 << rAttrib )) == 0 )
|
|
|
|
{
|
|
|
|
glEnableVertexAttribArray( rAttrib );
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
2014-11-28 14:56:08 -05:00
|
|
|
mnEnabledAttribs |= ( 1 << rAttrib );
|
|
|
|
}
|
2016-05-27 17:54:50 +09:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2016-06-07 20:45:14 +09:00
|
|
|
void OpenGLProgram::SetVertexAttrib(GLuint& rAttrib, const OString& rName, GLint nSize,
|
|
|
|
GLenum eType, GLboolean bNormalized, GLsizei aStride,
|
|
|
|
const GLvoid* pPointer)
|
2016-05-27 17:54:50 +09:00
|
|
|
{
|
|
|
|
if (EnableVertexAttrib(rAttrib, rName))
|
|
|
|
{
|
2016-06-07 20:45:14 +09:00
|
|
|
glVertexAttribPointer(rAttrib, nSize, eType, bNormalized, aStride, pPointer);
|
2016-05-27 17:54:50 +09:00
|
|
|
CHECK_GL_ERROR();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
VCL_GL_INFO("Vertex attribute '" << rName << "' doesn't exist in this program (" << mnId << ")");
|
|
|
|
}
|
2014-11-28 14:56:08 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void OpenGLProgram::SetVertices( const GLvoid* pData )
|
|
|
|
{
|
2016-06-07 20:45:14 +09:00
|
|
|
SetVertexAttrib(mnPositionAttrib, "position", 2, GL_FLOAT, GL_FALSE, 0, pData);
|
2014-11-28 14:56:08 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void OpenGLProgram::SetTextureCoord( const GLvoid* pData )
|
|
|
|
{
|
2016-06-07 20:45:14 +09:00
|
|
|
SetVertexAttrib(mnTexCoordAttrib, "tex_coord_in", 2, GL_FLOAT, GL_FALSE, 0, pData);
|
2014-11-28 14:56:08 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void OpenGLProgram::SetAlphaCoord( const GLvoid* pData )
|
|
|
|
{
|
2016-06-07 20:45:14 +09:00
|
|
|
SetVertexAttrib(mnAlphaCoordAttrib, "alpha_coord_in", 2, GL_FLOAT, GL_FALSE, 0, pData);
|
2014-11-28 14:56:08 -05:00
|
|
|
}
|
|
|
|
|
2015-08-24 15:00:26 +09:00
|
|
|
void OpenGLProgram::SetMaskCoord(const GLvoid* pData)
|
|
|
|
{
|
2016-06-07 20:45:14 +09:00
|
|
|
SetVertexAttrib(mnMaskCoordAttrib, "mask_coord_in", 2, GL_FLOAT, GL_FALSE, 0, pData);
|
2015-08-24 15:00:26 +09:00
|
|
|
}
|
|
|
|
|
2016-02-24 00:44:58 +01:00
|
|
|
void OpenGLProgram::SetExtrusionVectors(const GLvoid* pData)
|
|
|
|
{
|
2016-06-07 20:45:14 +09:00
|
|
|
SetVertexAttrib(mnExtrusionVectorsAttrib, "extrusion_vectors", 3, GL_FLOAT, GL_FALSE, 0, pData);
|
2016-05-29 12:37:41 +09:00
|
|
|
}
|
|
|
|
|
2016-06-07 20:45:14 +09:00
|
|
|
void OpenGLProgram::SetVertexColors(std::vector<GLubyte>& rColorVector)
|
2016-05-29 12:37:41 +09:00
|
|
|
{
|
2016-06-07 20:45:14 +09:00
|
|
|
SetVertexAttrib(mnVertexColorsAttrib, "vertex_color_in", 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, rColorVector.data());
|
2016-02-24 00:44:58 +01:00
|
|
|
}
|
|
|
|
|
2016-05-20 14:59:24 +09:00
|
|
|
void OpenGLProgram::SetShaderType(TextureShaderType eTextureShaderType)
|
|
|
|
{
|
|
|
|
SetUniform1i("type", GLint(eTextureShaderType));
|
|
|
|
}
|
|
|
|
|
|
|
|
void OpenGLProgram::SetShaderType(DrawShaderType eDrawShaderType)
|
|
|
|
{
|
|
|
|
SetUniform1i("type", GLint(eDrawShaderType));
|
|
|
|
}
|
|
|
|
|
2014-11-28 14:56:08 -05:00
|
|
|
GLuint OpenGLProgram::GetUniformLocation( const OString& rName )
|
|
|
|
{
|
2015-01-01 19:58:59 +00:00
|
|
|
auto it = maUniformLocations.find( rName );
|
2014-11-28 14:56:08 -05:00
|
|
|
if( it == maUniformLocations.end() )
|
|
|
|
{
|
2015-03-26 15:32:26 +01:00
|
|
|
GLuint nLocation = glGetUniformLocation( mnId, rName.getStr() );
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
2014-11-28 14:56:08 -05:00
|
|
|
maUniformLocations[rName] = nLocation;
|
|
|
|
return nLocation;
|
|
|
|
}
|
|
|
|
|
|
|
|
return it->second;
|
|
|
|
}
|
|
|
|
|
2016-05-12 13:37:11 +09:00
|
|
|
void OpenGLProgram::DrawArrays(GLenum aMode, std::vector<GLfloat>& aVertices)
|
|
|
|
{
|
|
|
|
if (!mbBlending)
|
|
|
|
OpenGLContext::getVCLContext()->state()->blend().disable();
|
|
|
|
|
|
|
|
SetVertices(aVertices.data());
|
|
|
|
glDrawArrays(aMode, 0, aVertices.size() / 2);
|
|
|
|
}
|
|
|
|
|
2016-06-07 20:45:14 +09:00
|
|
|
void OpenGLProgram::DrawElements(GLenum aMode, GLuint nNumberOfVertices)
|
|
|
|
{
|
|
|
|
if (!mbBlending)
|
|
|
|
OpenGLContext::getVCLContext()->state()->blend().disable();
|
|
|
|
|
|
|
|
glDrawElements(aMode, nNumberOfVertices, GL_UNSIGNED_INT, nullptr);
|
|
|
|
}
|
|
|
|
|
2014-12-02 16:41:02 -05:00
|
|
|
void OpenGLProgram::SetUniform1f( const OString& rName, GLfloat v1 )
|
|
|
|
{
|
|
|
|
GLuint nUniform = GetUniformLocation( rName );
|
|
|
|
glUniform1f( nUniform, v1 );
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
2014-12-02 16:41:02 -05:00
|
|
|
}
|
|
|
|
|
2014-11-28 14:56:08 -05:00
|
|
|
void OpenGLProgram::SetUniform2f( const OString& rName, GLfloat v1, GLfloat v2 )
|
|
|
|
{
|
|
|
|
GLuint nUniform = GetUniformLocation( rName );
|
|
|
|
glUniform2f( nUniform, v1, v2 );
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
2014-11-28 14:56:08 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void OpenGLProgram::SetUniform1fv( const OString& rName, GLsizei nCount, GLfloat* aValues )
|
|
|
|
{
|
|
|
|
GLuint nUniform = GetUniformLocation( rName );
|
|
|
|
glUniform1fv( nUniform, nCount, aValues );
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
2014-11-28 14:56:08 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void OpenGLProgram::SetUniform2fv( const OString& rName, GLsizei nCount, GLfloat* aValues )
|
|
|
|
{
|
|
|
|
GLuint nUniform = GetUniformLocation( rName );
|
|
|
|
glUniform2fv( nUniform, nCount, aValues );
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
2014-11-28 14:56:08 -05:00
|
|
|
}
|
|
|
|
|
2015-01-17 20:00:52 +01:00
|
|
|
void OpenGLProgram::SetUniform1i( const OString& rName, GLint v1 )
|
|
|
|
{
|
|
|
|
GLuint nUniform = GetUniformLocation( rName );
|
|
|
|
glUniform1i( nUniform, v1 );
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
2015-01-17 20:00:52 +01:00
|
|
|
}
|
|
|
|
|
2014-11-28 14:56:08 -05:00
|
|
|
void OpenGLProgram::SetColor( const OString& rName, SalColor nColor, sal_uInt8 nTransparency )
|
|
|
|
{
|
|
|
|
GLuint nUniform = GetUniformLocation( rName );
|
|
|
|
glUniform4f( nUniform,
|
|
|
|
((float) SALCOLOR_RED( nColor )) / 255,
|
|
|
|
((float) SALCOLOR_GREEN( nColor )) / 255,
|
|
|
|
((float) SALCOLOR_BLUE( nColor )) / 255,
|
|
|
|
(100 - nTransparency) * (1.0 / 100) );
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
2014-11-28 14:56:08 -05:00
|
|
|
|
|
|
|
if( nTransparency > 0 )
|
|
|
|
SetBlendMode( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
|
|
|
|
}
|
|
|
|
|
|
|
|
void OpenGLProgram::SetColorf( const OString& rName, SalColor nColor, double fTransparency )
|
|
|
|
{
|
|
|
|
GLuint nUniform = GetUniformLocation( rName );
|
|
|
|
glUniform4f( nUniform,
|
|
|
|
((float) SALCOLOR_RED( nColor )) / 255,
|
|
|
|
((float) SALCOLOR_GREEN( nColor )) / 255,
|
|
|
|
((float) SALCOLOR_BLUE( nColor )) / 255,
|
|
|
|
(1.0f - fTransparency) );
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
2014-11-28 14:56:08 -05:00
|
|
|
|
|
|
|
if( fTransparency > 0.0 )
|
|
|
|
SetBlendMode( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
|
|
|
|
}
|
|
|
|
|
2014-12-02 16:41:02 -05:00
|
|
|
void OpenGLProgram::SetColor( const OString& rName, const Color& rColor )
|
|
|
|
{
|
|
|
|
GLuint nUniform = GetUniformLocation( rName );
|
|
|
|
glUniform4f( nUniform,
|
|
|
|
((float) rColor.GetRed()) / 255,
|
|
|
|
((float) rColor.GetGreen()) / 255,
|
|
|
|
((float) rColor.GetBlue()) / 255,
|
|
|
|
1.0f - ((float) rColor.GetTransparency()) / 255 );
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
2014-12-02 16:41:02 -05:00
|
|
|
|
|
|
|
if( rColor.GetTransparency() > 0 )
|
|
|
|
SetBlendMode( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
|
|
|
|
}
|
|
|
|
|
2014-11-28 14:56:08 -05:00
|
|
|
void OpenGLProgram::SetColorWithIntensity( const OString& rName, const Color& rColor, long nFactor )
|
|
|
|
{
|
|
|
|
GLuint nUniform = GetUniformLocation( rName );
|
|
|
|
glUniform4f( nUniform,
|
|
|
|
((float) rColor.GetRed()) * nFactor / 25500.0,
|
|
|
|
((float) rColor.GetGreen()) * nFactor / 25500.0,
|
|
|
|
((float) rColor.GetBlue()) * nFactor / 25500.0,
|
|
|
|
1.0f );
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
2014-11-28 14:56:08 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void OpenGLProgram::SetTexture( const OString& rName, OpenGLTexture& rTexture )
|
|
|
|
{
|
|
|
|
GLuint nUniform = GetUniformLocation( rName );
|
|
|
|
int nIndex = maTextures.size();
|
|
|
|
|
|
|
|
glUniform1i( nUniform, nIndex );
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
2016-04-28 14:55:45 +09:00
|
|
|
|
|
|
|
std::unique_ptr<RenderState>& rState = OpenGLContext::getVCLContext()->state();
|
|
|
|
rState->texture().active(nIndex);
|
|
|
|
|
2014-11-28 14:56:08 -05:00
|
|
|
rTexture.Bind();
|
2016-04-28 14:55:45 +09:00
|
|
|
maTextures.push_back(rTexture);
|
2014-11-28 14:56:08 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void OpenGLProgram::SetTransform(
|
|
|
|
const OString& rName,
|
|
|
|
const OpenGLTexture& rTexture,
|
|
|
|
const basegfx::B2DPoint& rNull,
|
|
|
|
const basegfx::B2DPoint& rX,
|
|
|
|
const basegfx::B2DPoint& rY )
|
|
|
|
{
|
2014-12-04 16:22:46 +00:00
|
|
|
auto nTexWidth = rTexture.GetWidth();
|
|
|
|
auto nTexHeight = rTexture.GetHeight();
|
|
|
|
if (nTexWidth == 0 || nTexHeight == 0)
|
|
|
|
return;
|
|
|
|
|
2014-11-28 14:56:08 -05:00
|
|
|
GLuint nUniform = GetUniformLocation( rName );
|
|
|
|
const basegfx::B2DVector aXRel = rX - rNull;
|
|
|
|
const basegfx::B2DVector aYRel = rY - rNull;
|
|
|
|
const float aValues[] = {
|
2014-12-04 16:22:46 +00:00
|
|
|
(float) aXRel.getX()/nTexWidth, (float) aXRel.getY()/nTexWidth, 0, 0,
|
|
|
|
(float) aYRel.getX()/nTexHeight, (float) aYRel.getY()/nTexHeight, 0, 0,
|
|
|
|
0, 0, 1, 0,
|
|
|
|
(float) rNull.getX(), (float) rNull.getY(), 0, 1 };
|
2016-04-20 10:34:01 +02:00
|
|
|
glm::mat4 aMatrix = glm::make_mat4( aValues );
|
|
|
|
glUniformMatrix4fv( nUniform, 1, GL_FALSE, glm::value_ptr( aMatrix ) );
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
2014-11-28 14:56:08 -05:00
|
|
|
}
|
|
|
|
|
2016-05-20 14:59:24 +09:00
|
|
|
void OpenGLProgram::SetIdentityTransform(const OString& rName)
|
|
|
|
{
|
|
|
|
GLuint nUniform = GetUniformLocation(rName);
|
|
|
|
glm::mat4 aMatrix = glm::mat4();
|
|
|
|
glUniformMatrix4fv(nUniform, 1, GL_FALSE, glm::value_ptr( aMatrix ) );
|
|
|
|
CHECK_GL_ERROR();
|
|
|
|
}
|
|
|
|
|
2015-07-08 18:43:32 +09:00
|
|
|
void OpenGLProgram::ApplyMatrix(float fWidth, float fHeight, float fPixelOffset)
|
|
|
|
{
|
2015-08-20 16:22:43 +02:00
|
|
|
|
|
|
|
if (mfLastWidth == fWidth && mfLastHeight == fHeight && mfLastPixelOffset == fPixelOffset)
|
|
|
|
return;
|
|
|
|
|
|
|
|
mfLastWidth = fWidth;
|
|
|
|
mfLastHeight = fHeight;
|
|
|
|
mfLastPixelOffset = fPixelOffset;
|
|
|
|
|
2015-07-08 18:43:32 +09:00
|
|
|
OString sProjectionMatrix("mvp");
|
|
|
|
GLuint nUniform = GetUniformLocation(sProjectionMatrix);
|
|
|
|
|
2016-04-20 10:34:01 +02:00
|
|
|
glm::mat4 aMVP = glm::ortho(0.0f, fWidth, fHeight, 0.0f, 0.0f, 1.0f);
|
2015-07-08 18:43:32 +09:00
|
|
|
|
|
|
|
if (fPixelOffset != 0.0f)
|
2016-04-20 10:34:01 +02:00
|
|
|
aMVP = glm::translate(aMVP, glm::vec3(fPixelOffset, fPixelOffset, 0.0f));
|
2015-07-08 18:43:32 +09:00
|
|
|
|
2016-04-20 10:34:01 +02:00
|
|
|
glUniformMatrix4fv(nUniform, 1, GL_FALSE, glm::value_ptr(aMVP));
|
2015-11-17 09:20:25 +02:00
|
|
|
CHECK_GL_ERROR();
|
2015-07-08 18:43:32 +09:00
|
|
|
}
|
|
|
|
|
2016-05-12 13:37:11 +09:00
|
|
|
void OpenGLProgram::SetBlendMode(GLenum nSFactor, GLenum nDFactor)
|
2014-11-28 14:56:08 -05:00
|
|
|
{
|
2016-05-12 13:37:11 +09:00
|
|
|
OpenGLContext::getVCLContext()->state()->blend().enable();
|
|
|
|
OpenGLContext::getVCLContext()->state()->blend().func(nSFactor, nDFactor);
|
2014-11-28 14:56:08 -05:00
|
|
|
mbBlending = true;
|
|
|
|
}
|
|
|
|
|
2015-08-26 13:50:57 +02:00
|
|
|
bool OpenGLProgram::DrawTexture( const OpenGLTexture& rTexture )
|
2014-11-28 14:56:08 -05:00
|
|
|
{
|
2015-07-08 18:43:32 +09:00
|
|
|
if (!rTexture)
|
2014-11-28 14:56:08 -05:00
|
|
|
return false;
|
|
|
|
|
2015-07-08 18:43:32 +09:00
|
|
|
float fWidth = rTexture.GetWidth();
|
|
|
|
float fHeight = rTexture.GetHeight();
|
|
|
|
|
|
|
|
float fMinX = 0.0f;
|
|
|
|
float fMaxX = fWidth;
|
|
|
|
float fMinY = 0.0f;
|
|
|
|
float fMaxY = fHeight;
|
|
|
|
|
2016-05-12 13:37:11 +09:00
|
|
|
std::vector<GLfloat> aPosition {
|
|
|
|
fMinX, fMaxY,
|
|
|
|
fMinX, fMinY,
|
|
|
|
fMaxX, fMinY,
|
|
|
|
fMaxX, fMaxY
|
|
|
|
};
|
2015-07-08 18:43:32 +09:00
|
|
|
GLfloat aTexCoord[8];
|
|
|
|
|
2014-11-28 14:56:08 -05:00
|
|
|
rTexture.GetWholeCoord( aTexCoord );
|
|
|
|
SetTextureCoord( aTexCoord );
|
2015-08-03 10:13:38 +09:00
|
|
|
ApplyMatrix(fWidth, fHeight);
|
2016-05-12 13:37:11 +09:00
|
|
|
DrawArrays(GL_TRIANGLE_FAN, aPosition);
|
2014-11-28 14:56:08 -05:00
|
|
|
CHECK_GL_ERROR();
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|