2011-08-28 15:17:58 +02:00
/*
2012-01-02 17:58:37 +01:00
* Copyright ( c ) 2010 - 2012 OTClient < https : //github.com/edubart/otclient>
2011-08-28 15:17:58 +02:00
*
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the " Software " ) , to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE .
*/
2011-08-14 04:09:11 +02:00
# include "fontmanager.h"
2011-08-15 16:06:15 +02:00
# include <framework/graphics/graphics.h>
# include <framework/graphics/texture.h>
2011-12-25 00:14:12 +01:00
# include <framework/platform/platformwindow.h>
2011-08-15 16:06:15 +02:00
2010-11-18 23:13:35 +01:00
Graphics g_graphics ;
void Graphics : : init ( )
{
2012-03-21 13:41:43 +01:00
logInfo ( " GPU " , glGetString ( GL_RENDERER ) ) ;
logInfo ( " OpenGL " , glGetString ( GL_VERSION ) ) ;
2011-12-29 19:18:12 +01:00
# ifndef OPENGL_ES2
// init GL extensions
GLenum err = glewInit ( ) ;
if ( err ! = GLEW_OK )
logFatal ( " Unable to init GLEW: " , glewGetErrorString ( err ) ) ;
2012-03-21 13:41:43 +01:00
2012-04-03 22:12:05 +02:00
const char * requiredExtensions [ ] = {
" GL_ARB_vertex_program " ,
" GL_ARB_vertex_shader " ,
" GL_ARB_fragment_shader " ,
" GL_ARB_texture_non_power_of_two " ,
" GL_ARB_multitexture "
} ;
std : : stringstream ss ;
bool unsupported = false ;
for ( auto ext : requiredExtensions ) {
if ( ! glewIsSupported ( ext ) ) {
ss < < ext < < std : : endl ;
unsupported = true ;
}
}
if ( unsupported )
2012-04-04 00:24:15 +02:00
logFatal ( " The following OpenGL 2.0 extensions are not supported by your system graphics, please try updating your video drivers or buy a new hardware: \n " ,
ss . str ( ) ,
" Graphics card: " , glGetString ( GL_RENDERER ) ,
" \n OpenGL driver: " , glGetString ( GL_VERSION ) ) ;
2012-03-21 18:30:57 +01:00
2012-04-04 04:41:12 +02:00
if ( GLEW_EXT_framebuffer_object & & ! GLEW_ARB_framebuffer_object ) {
glGenFramebuffers = glGenFramebuffersEXT ;
glDeleteFramebuffers = glDeleteFramebuffersEXT ;
glBindFramebuffer = glBindFramebufferEXT ;
glFramebufferTexture2D = glFramebufferTexture2DEXT ;
glCheckFramebufferStatus = glCheckFramebufferStatusEXT ;
}
m_useFBO = m_useFBO & & ( GLEW_ARB_framebuffer_object | | GLEW_EXT_framebuffer_object ) ;
2012-03-21 18:30:57 +01:00
m_generateHardwareMipmaps = m_generateHardwareMipmaps & & m_useFBO ; // glGenerateMipmap is supported when FBO is
2011-12-29 19:18:12 +01:00
# endif
2011-05-12 00:16:11 +02:00
glEnable ( GL_BLEND ) ;
2012-03-28 20:10:59 +02:00
//glClear(GL_ACCUM_BUFFER_BIT);
2010-11-19 13:37:02 +01:00
2011-08-15 21:15:49 +02:00
m_emptyTexture = TexturePtr ( new Texture ) ;
2011-12-07 01:31:55 +01:00
g_painter . init ( ) ;
2010-11-18 23:13:35 +01:00
}
void Graphics : : terminate ( )
{
2011-08-14 04:09:11 +02:00
g_fonts . releaseFonts ( ) ;
2011-12-07 01:31:55 +01:00
g_painter . terminate ( ) ;
2011-08-15 21:15:49 +02:00
m_emptyTexture . reset ( ) ;
2010-11-18 23:13:35 +01:00
}
2012-03-22 17:07:23 +01:00
bool Graphics : : parseOption ( const std : : string & option )
{
if ( option = = " -no-fbos " )
m_useFBO = false ;
else if ( option = = " -no-mipmapping " )
m_generateMipmaps = false ;
else if ( option = = " -no-smoothing " )
m_useBilinearFiltering = false ;
else if ( option = = " -realtime-mipmapping " )
m_generateRealtimeMipmaps = true ;
else if ( option = = " -no-hardware-buffering " )
m_useHardwareBuffers = false ;
else
return false ;
return true ;
}
2011-04-08 07:10:00 +02:00
void Graphics : : resize ( const Size & size )
2010-11-23 16:30:43 +01:00
{
2011-12-25 00:14:12 +01:00
setViewportSize ( size ) ;
2012-03-28 20:10:59 +02:00
//glClear(GL_ACCUM_BUFFER_BIT);
2011-12-25 00:14:12 +01:00
// The projection matrix converts from Painter's coordinate system to GL's coordinate system
// * GL's viewport is 2x2, Painter's is width x height
// * GL has +y -> -y going from bottom -> top, Painter is the other way round
// * GL has [0,0] in the center, Painter has it in the top-left
//
// This results in the Projection matrix below.
//
// Projection Matrix Painter Coord GL Coord
// ------------------------------------------------ --------- ---------
// | 2.0 / width | 0.0 | -1.0 | | x | | x' |
// | 0.0 | -2.0 / height | 1.0 | * | y | = | y' |
// | 0.0 | 0.0 | 0.0 | | 1 | | 0 |
// ------------------------------------------------ --------- ---------
Matrix3 projectionMatrix = { 2.0f / size . width ( ) , 0.0f , - 1.0f ,
0.0f , - 2.0f / size . height ( ) , 1.0f ,
0.0f , 0.0f , 0.0f } ;
projectionMatrix . transpose ( ) ;
g_painter . setProjectionMatrix ( projectionMatrix ) ;
2010-11-18 23:13:35 +01:00
}
void Graphics : : beginRender ( )
{
2012-01-24 19:39:16 +01:00
glClearColor ( 0 , 0 , 0 , 1 ) ;
2010-11-18 23:13:35 +01:00
glClear ( GL_COLOR_BUFFER_BIT ) ;
}
void Graphics : : endRender ( )
{
2012-03-27 20:14:35 +02:00
// this is a simple blur effect
2012-03-28 20:10:59 +02:00
/*
2012-03-27 20:14:35 +02:00
static Timer timer ;
2012-03-28 19:32:34 +02:00
if ( timer . ticksElapsed ( ) > = 10 ) {
2012-03-28 20:10:59 +02:00
glAccum ( GL_MULT , 0.9 ) ;
glAccum ( GL_ACCUM , 0.1 ) ;
2012-03-27 20:14:35 +02:00
timer . restart ( ) ;
}
glAccum ( GL_RETURN , 1 ) ;
2012-03-28 20:10:59 +02:00
*/
2011-04-08 11:50:26 +02:00
}
2011-08-14 19:45:25 +02:00
2012-03-24 16:22:40 +01:00
void Graphics : : beginClipping ( const Rect & clipRect )
{
// setup stencil buffer for writing
glClear ( GL_STENCIL_BUFFER_BIT ) ;
glEnable ( GL_STENCIL_TEST ) ;
glStencilFunc ( GL_ALWAYS , 1 , 1 ) ;
glStencilOp ( GL_REPLACE , GL_REPLACE , GL_REPLACE ) ;
// draw the clipping area into the stencil buffer
glColorMask ( 0 , 0 , 0 , 0 ) ;
g_painter . drawFilledRect ( clipRect ) ;
2012-03-27 20:14:35 +02:00
// set stencil buffer for clipping
2012-03-24 16:22:40 +01:00
glColorMask ( 1 , 1 , 1 , 1 ) ;
glStencilFunc ( GL_EQUAL , 1 , 1 ) ;
glStencilOp ( GL_KEEP , GL_KEEP , GL_KEEP ) ;
}
void Graphics : : endClipping ( )
{
glDisable ( GL_STENCIL_TEST ) ;
}
2011-12-25 00:14:12 +01:00
void Graphics : : setViewportSize ( const Size & size )
{
glViewport ( 0 , 0 , size . width ( ) , size . height ( ) ) ;
m_viewportSize = size ;
}
2012-01-30 01:00:12 +01:00
int Graphics : : getMaxTextureSize ( )
{
static GLint maxTexSize = - 1 ;
if ( maxTexSize = = - 1 )
glGetIntegerv ( GL_MAX_TEXTURE_SIZE , & maxTexSize ) ;
return maxTexSize ;
}