Advertisement
Guest User

OpenGL ShaderHandler

a guest
Jun 4th, 2012
484
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.73 KB | None | 0 0
  1. ShaderHandler* ShaderHandler::mInstance = new ShaderHandler;
  2.  
  3.     ShaderHandler::ShaderHandler( void )
  4.     {
  5.         initialize();
  6.     }
  7.  
  8.     ShaderHandler::~ShaderHandler( void )
  9.     {
  10.         if( mPrograms )
  11.         {
  12.             mPrograms->clear();
  13.             delete mPrograms;
  14.         }
  15.  
  16.         if( mShaders )
  17.         {
  18.             mShaders->clear();
  19.             delete mShaders;
  20.         }
  21.  
  22.         if( mInstance ) delete mInstance;
  23.     }
  24.  
  25.     void ShaderHandler::compileAndLink( void )
  26.     {
  27.         GLuint program = glCreateProgram();
  28.  
  29.         if( !program ) Debug::Log::error( "ShaderHandler::compileAndLink could not create program!" );
  30.  
  31.         const size_t sSize = mShaders->size();
  32.  
  33.         size_t iShaders = 0;
  34.  
  35.         for( ; iShaders < sSize; ++iShaders )
  36.         {
  37.             glAttachShader( program, ( *mShaders )[ iShaders ] );
  38.         }
  39.  
  40.         glLinkProgram( program );
  41.  
  42.         GLint success;
  43.  
  44.         glGetProgramiv( program, GL_LINK_STATUS, &success );
  45.  
  46.         if( !success )
  47.         {
  48.             GLint len;
  49.  
  50.             glGetProgramiv( program, GL_INFO_LOG_LENGTH, &len );
  51.  
  52.             GLsizei bufsize = len + 1;
  53.  
  54.             char* log = new char[ bufsize ];
  55.  
  56.             glGetProgramInfoLog( program, bufsize, NULL, log );
  57.  
  58.             Debug::Log::error( "OpenGL Says: \n \t %s", log );
  59.         }
  60.  
  61.         mPrograms->push_back( program );
  62.     }
  63.  
  64.     void ShaderHandler::clear( void )
  65.     {
  66.         mShaders->clear();
  67.         mPrograms->clear();
  68.     }
  69.  
  70.     void ShaderHandler::createShaders( QVector< Shader > &shaders )
  71.     {
  72.         QVectorIterator< Shader > iShaders( shaders );
  73.  
  74.         while( iShaders.hasNext() )
  75.         {
  76.             Shader s = iShaders.next();
  77.  
  78.             if( !s.Source ) continue;
  79.  
  80.             GLuint shaderMem = glCreateShader( s.Type );
  81.  
  82.             if( !shaderMem )
  83.             {
  84.                 Debug::Log::error( "Cannot create shader memory in ShaderHandler::createShaders for GPU is out of memory." );
  85.             }
  86.  
  87.             glShaderSource( shaderMem, 1, &s.Source, NULL );
  88.             glCompileShader( shaderMem );
  89.  
  90.             mShaders->push_back( shaderMem );
  91.         }
  92.     }
  93.  
  94.     void ShaderHandler::initialize( void )
  95.     {
  96.         mShaders = new QVector< GLuint >;
  97.         mPrograms = new QVector< GLuint >;
  98.     }
  99.  
  100.     Shader ShaderHandler::getShader( const char* name, const char* filepath, GLenum type )
  101.     {
  102.         QString shader = FileUtility::readShader( filepath );
  103.  
  104.         Shader s;
  105.  
  106.         s.Source = shader.toStdString().c_str();
  107.         s.Type = type;
  108.         s.Name = name;
  109.         s.SourceLen = shader.size();
  110.  
  111.         Debug::Log::info( "Shader Source %s", s.Source );
  112.  
  113.         return s;
  114.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement