TAPs 0.7.7.3
TAPsGLSLFns.cpp
Go to the documentation of this file.
00001 /******************************************************************************
00002 TAPsGLSLFns.cpp
00003 
00004 Based on 3DLabs Inc. Ltd. and aGLSL.h by Martin Christen.
00005 
00006 SUKITTI PUNAK   (06/08/2005)
00007 UPDATE          (08/05/2007)
00008 ******************************************************************************/
00009 #include "TAPsGLSLFns.hpp"
00010 // Using Inclusion Model (i.e. definitions are included in declarations)
00011 //                       (this name.cpp is included in name.hpp)
00012 // Each friend is defined directly inside its declaration.
00013 
00014 BEGIN_NAMESPACE_TAPs__OpenGL
00015 //=============================================================================
00016 // Global Variables
00017 //-----------------------------------------------------------------------------
00018 char * gbGLSLErrStr[] = {
00019     "GLSL is not supported/enabled!",               // ERR00
00020     "Not a valid program object!",                  // ERR01
00021     "Not a valid object!",                          // ERR02
00022     "Out of memory!",                               // ERR03
00023     "Compiler log is not available!",               // ERR04
00024     "Unknown compiler error!"                       // ERR05
00025     "Linker log is not available!",                 // ERR06
00026     "Unknown linker error!",                        // ERR07
00027     ""                                              // ERR08    
00028 };
00029 bool gbIsGLSLSupported = false;
00030 bool gbIsInitialized   = false;
00031 //-----------------------------------------------------------------------------
00032 //=============================================================================
00033 // Global Functions
00034 //-----------------------------------------------------------------------------
00035 // Get file length
00036 unsigned long GFnGetFileLength ( std::ifstream & file )
00037 {
00038     if ( !file.good() ) return 0;
00039     //unsigned long pos = file.tellg();
00040     file.seekg( 0, std::ios::end );
00041     unsigned long len = file.tellg();
00042     file.seekg( std::ios::beg );
00043 #ifdef TAPs_DEBUG_MODE
00044     #ifdef TAPs_USE_WXWIDGETS
00045         wxLogWarning( wxT( "Length of File: %d" ), len );
00046     #else
00047         std::cout << "Length of File: " << len << std::endl;
00048     #endif
00049 #endif
00050     return len;
00051 }
00052 //-----------------------------------------------------------------------------
00053 // Get file length
00054 unsigned long GFnGetFileLength ( const char * fileName )
00055 {
00056     // Returns the size in bytes of the shader fileName.
00057     // If an error occurred, it returns -1.
00058     int fd;
00059     int count = -1;
00060     //
00061     // Open the file, seek to the end to find its length
00062     //
00063 #ifdef WIN32 /*[*/
00064     fd = _open(fileName, _O_RDONLY);
00065     if (fd != -1)
00066     {
00067         count = _lseek(fd, 0, SEEK_END) + 1;
00068         _close(fd);
00069     }
00070 #else /*][*/
00071     fd = open(fileName, O_RDONLY);
00072     if (fd != -1)
00073     {
00074         count = lseek(fd, 0, SEEK_END) + 1;
00075         close(fd);
00076     }
00077 #endif /*]*/
00078 
00079     return count;
00080 }
00081 //-----------------------------------------------------------------------------
00082 bool GFnInitGLSL ()
00083 {
00084     if ( gbIsGLSLSupported ) return true;   // GLSL has already been initialized
00085     //---------------------------------------------------------------
00086     // Initialize the "OpenGL Extension Wrangler" library
00087     if ( gbIsInitialized )   return true;
00088     gbIsInitialized = true;
00089     GLenum err = glewInit();
00090     if ( GLEW_OK != err ) {
00091 #ifdef TAPs_USE_WXWIDGETS
00092         wxLogError( wxT( "Error: %s" ), glewGetErrorString( err ) );
00093 #else
00094         std::cerr << "Error: " << glewGetErrorString( err ) << std::endl;
00095 #endif
00096         gbIsGLSLSupported = false;
00097         return gbIsGLSLSupported;
00098     }
00099     //---------------------------------------------------------------
00100     // OpenGL Info
00101 #ifdef TAPs_DEBUG_MODE
00102     #ifdef TAPs_USE_WXWIDGETS
00103         wxLogWarning( wxT( "OpenGL Vendor:   %s" ), glGetString( GL_VENDOR ) );
00104         wxLogWarning( wxT( "OpenGL Renderer: %s" ), glGetString( GL_RENDERER ) );
00105         wxLogWarning( wxT( "OpenGL Version:  %s" ), glGetString( GL_VERSION ) );
00106     #else
00107         std::cout << "OpenGL Vendor:   " << glGetString( GL_VENDOR ) << "\n";
00108         std::cout << "OpenGL Renderer: " << glGetString( GL_RENDERER ) << "\n";
00109         std::cout << "OpenGL Version:  " << glGetString( GL_VERSION ) << "\n";
00110     #endif
00111 #endif
00112     //---------------------------------------------------------------
00113     GFnCheckGLSL();
00114     //---------------------------------------------------------------
00115     return gbIsGLSLSupported;
00116 }
00117 //-----------------------------------------------------------------------------
00118 bool GFnCheckGLSL ()
00119 {
00120     if ( gbIsGLSLSupported ) return true;   // GLSL is available and initailized
00121     //---------------------------------------------------------------
00122     if ( !gbIsInitialized ) GFnInitGLSL();
00123     //---------------------------------------------------------------
00124 #ifdef TAPs_DEBUG_MODE
00125     #ifdef TAPs_USE_WXWIDGETS
00126         if      ( GLEW_VERSION_3_2 )
00127             wxLogWarning( wxT( "OpenGL 3.2 is available!" ) );
00128         else if ( GLEW_VERSION_3_1 )
00129             wxLogWarning( wxT( "OpenGL 3.1 is available!" ) );
00130         else if ( GLEW_VERSION_3_0 )
00131             wxLogWarning( wxT( "OpenGL 3.0 is available!" ) );
00132         else if ( GLEW_VERSION_2_1 )
00133             wxLogWarning( wxT( "OpenGL 2.1 is available!" ) );
00134         else if ( GLEW_VERSION_2_0 )
00135             wxLogWarning( wxT( "OpenGL 2.0 is available!" ) );
00136         else if ( GLEW_VERSION_1_5 )
00137             wxLogWarning( wxT( "OpenGL 1.5 is available!" ) );
00138         else if ( GLEW_VERSION_1_4 )
00139             wxLogWarning( wxT( "OpenGL 1.4 is available!" ) );
00140         else if ( GLEW_VERSION_1_3 )
00141             wxLogWarning( wxT( "OpenGL 1.3 is available!" ) );
00142         else if ( GLEW_VERSION_1_2 )
00143             wxLogWarning( wxT( "OpenGL 1.2 is available!" ) );
00144     #else
00145         if      ( GLEW_VERSION_3_2 )
00146             std::cout << "OpenGL 3.2 is available!\n";
00147         else if ( GLEW_VERSION_3_1 )
00148             std::cout << "OpenGL 3.1 is available!\n";
00149         else if ( GLEW_VERSION_3_0 )
00150             std::cout << "OpenGL 3.0 is available!\n";
00151         else if ( GLEW_VERSION_2_1 )
00152             std::cout << "OpenGL 2.1 is available!\n";
00153         else if ( GLEW_VERSION_2_0 )
00154             std::cout << "OpenGL 2.0 is available!\n";
00155         else if ( GLEW_VERSION_1_5 )
00156             std::cout << "OpenGL 1.5 is available!\n";
00157         else if ( GLEW_VERSION_1_4 )
00158             std::cout << "OpenGL 1.4 is available!\n";
00159         else if ( GLEW_VERSION_1_3 )
00160             std::cout << "OpenGL 1.3 is available!\n";
00161         else if ( GLEW_VERSION_1_2 )
00162             std::cout << "OpenGL 1.2 is available!\n";
00163     #endif
00164 #endif
00165     //---------------------------------------------------------------
00166     // Ensure we have the necessary OpenGL Shading Language extensions.
00167     if (glewGetExtension("GL_ARB_fragment_shader")      != GL_TRUE ||
00168         glewGetExtension("GL_ARB_vertex_shader")        != GL_TRUE ||
00169         glewGetExtension("GL_ARB_shader_objects")       != GL_TRUE ) //||
00170         //glewGetExtension("GL_ARB_shading_language_100") != GL_TRUE)
00171     {
00172 #ifdef TAPs_DEBUG_MODE
00173     #ifdef TAPs_USE_WXWIDGETS
00174         wxLogError( wxT( "[FAILIED] OpenGL Shading Language is NOT available!" ) );
00175     #else
00176         std::cerr << "[FAILIED] OpenGL Shading Language is NOT available!\n";
00177     #endif
00178 #endif
00179         gbIsGLSLSupported = false;
00180     }
00181     else {
00182 #ifdef TAPs_DEBUG_MODE
00183     #ifdef TAPs_USE_WXWIDGETS
00184         wxLogWarning( wxT( "[OK] OpenGL Shading Language is available!" ) );
00185     #else
00186         std::cout << "[OK] OpenGL Shading Language is available!\n";
00187     #endif
00188 #endif
00189         gbIsGLSLSupported = true;
00190     }
00191     //---------------------------------------------------------------
00192     // Ensure we have the geometry OpenGL Shading Language extensions.
00193     if ( glewGetExtension("GL_EXT_geometry_shader4") != GL_TRUE )
00194     {
00195 #ifdef TAPs_DEBUG_MODE
00196     #ifdef TAPs_USE_WXWIDGETS
00197         wxLogError( wxT( "[FAILIED] GL_EXT_geometry_shader4, OpenGL Shading Language, is NOT available!" ) );
00198     #else
00199         std::cerr << "[FAILIED] GL_EXT_geometry_shader4, OpenGL Shading Language, is NOT available!\n";
00200     #endif
00201 #endif
00202         //gbIsGLSLSupported = false;
00203     }
00204     else {
00205 #ifdef TAPs_DEBUG_MODE
00206     #ifdef TAPs_USE_WXWIDGETS
00207         wxLogWarning( wxT( "[OK] GL_EXT_geometry_shader4, OpenGL Shading Language, is available!" ) );
00208     #else
00209         std::cout << "[OK] GL_EXT_geometry_shader4, OpenGL Shading Language, is available!\n";
00210     #endif
00211 #endif
00212         //gbIsGLSLSupported = true;
00213     }
00214     //---------------------------------------------------------------
00215     return gbIsGLSLSupported;
00216 }
00217 //-----------------------------------------------------------------------------
00218 bool GFnCheckGL2 ()
00219 {
00220     if ( !gbIsInitialized ) GFnInitGLSL();
00221     return GLEW_VERSION_2_0 == GL_TRUE;
00222 }
00223 //-----------------------------------------------------------------------------
00224 //=============================================================================
00225 
00226 
00227 //******************************************************************************
00228 //=============================================================================
00229 // class GLSLProgramObject
00230 //-----------------------------------------------------------------------------
00231 // Static Variable(s)
00232 bool GLSLProgramObject::m_stcbShaderActive = true;
00233 //-----------------------------------------------------------------------------
00234 // Constructor
00235 GLSLProgramObject::GLSLProgramObject () :
00236     m_uiProgramObject( NULL ),
00237     m_bLinkStatus( false ),
00238     m_cpLinkerLog( NULL ),
00239     m_bManageMemory( false )
00240 {
00241     if ( GFnInitGLSL() ) {
00242         m_uiProgramObject = glCreateProgram();
00243         Fn::CHECK_GL_ERROR();
00244     }
00245     else {
00246     #ifdef TAPs_USE_WXWIDGETS
00247         wxLogWarning( wxT( "ERROR: OpenGL Shading Language is NOT available!" ) );
00248     #else
00249         std::cout << "ERROR: OpenGL Shading Language is NOT available!\n";
00250     #endif
00251     }
00252 }
00253 //-----------------------------------------------------------------------------
00254 // Destructor
00255 GLSLProgramObject::~GLSLProgramObject ()
00256 {
00257 /*
00258 #ifdef TAPs_DEBUG_MODE
00259     #ifdef TAPs_USE_WXWIDGETS
00260     //wxLogWarning( wxT( "START: Delete An Object of Class GLSLProgramObject." ) );
00261     wxMessageBox( wxT( "START: Delete An Object of Class GLSLProgramObject." ) );
00262     #else
00263         std::cout << "START: Delete An Object of Class GLSLProgramObject.";
00264     #endif
00265 #endif
00266 //*/
00267     //---------------------------------------------------------------
00268     if ( m_cpLinkerLog ) {
00269         delete [] m_cpLinkerLog;
00270         m_cpLinkerLog = NULL;
00271     }
00272     if ( gbIsGLSLSupported && m_uiProgramObject )
00273     {
00274         for (unsigned int i = 0; i < m_vShaderList.size(); ++i ) {
00275             glDetachShader( m_uiProgramObject, m_vShaderList[i]->m_uiShaderObject );
00276             Fn::CHECK_GL_ERROR();   // if get an error here, the program object is deleted first
00277                                 // the m_uiProgramObject must be deleted last
00278             if ( m_bManageMemory )
00279                 delete m_vShaderList[i];
00280         }
00281         glDeleteProgram( m_uiProgramObject );
00282         Fn::CHECK_GL_ERROR();
00283         m_uiProgramObject = 0;
00284     }
00285     //---------------------------------------------------------------
00286 /*
00287 #ifdef TAPs_DEBUG_MODE
00288     #ifdef TAPs_USE_WXWIDGETS
00289     //wxLogWarning( wxT( "END: Delete An Object of Class GLSLProgramObject." ) );
00290     wxMessageBox( wxT( "END: Delete An Object of Class GLSLProgramObject." ) );
00291     #else
00292         std::cout << "END: Delete An Object of Class GLSLProgramObject.";
00293     #endif
00294 #endif
00295 //*/
00296 }
00297 //-----------------------------------------------------------------------------
00298 // IsGLSLEnabled
00299 bool GLSLProgramObject::IsGLSLEnabled ()
00300 {
00301     return gbIsGLSLSupported;
00302 }
00303 //-----------------------------------------------------------------------------
00304 // Add a vertex or fragment shader
00305 void GLSLProgramObject::AddShader ( GLSLShader * glslShader )
00306 {
00307     if ( !gbIsGLSLSupported ) return;
00308     if ( glslShader == NULL ) return;
00309     if ( !glslShader->m_bCompileStatus ) {
00310 #ifdef TAPs_DEBUG_MODE
00311     #ifdef TAPs_USE_WXWIDGETS
00312         wxLogWarning( wxT( "Trying to compile the shader program ... " ) );
00313         if ( !glslShader->Compile() ) {
00314             wxLogError( wxT( " ... compile ERROR!" ) );
00315             return;
00316         }
00317         else {
00318             wxLogWarning( wxT( " ... Compilation Passed!" ) );
00319         }
00320     #else
00321         std::cout << "Trying to compile the shader program ... ";
00322         if ( !glslShader->Compile() ) {
00323             std::cout << " ... compile ERROR!\n";
00324             return;
00325         }
00326         else {
00327             std::cout << " ... Compilation Passed!\n";
00328         }
00329     #endif
00330 #endif
00331     }
00332     m_vShaderList.push_back( glslShader );
00333 }
00334 //-----------------------------------------------------------------------------
00335 // Link
00336 bool GLSLProgramObject::Link ()
00337 {
00338     if ( !gbIsGLSLSupported ) return false;
00339     unsigned int i;
00340     //----------------------------------------------------------------
00341     if ( m_bLinkStatus ) {  // already linked, detach everything
00342 #ifdef TAPs_DEBUG_MODE
00343     #ifdef TAPs_USE_WXWIDGETS
00344         wxLogWarning( wxT( "Object is already linked, trying to link it again ..." ) );
00345     #else
00346         std::cout << "Object is already linked, trying to link it again ...";
00347     #endif
00348 #endif
00349         for ( i = 0; i < m_vShaderList.size(); ++i ) {
00350             glDetachShader( m_uiProgramObject, m_vShaderList[i]->m_uiShaderObject );
00351             Fn::CHECK_GL_ERROR();
00352         }
00353     }
00354     //----------------------------------------------------------------
00355     for ( i = 0; i < m_vShaderList.size(); ++i ) {
00356         glAttachShader( m_uiProgramObject, m_vShaderList[i]->m_uiShaderObject );
00357         Fn::CHECK_GL_ERROR();
00358     }
00359     //----------------------------------------------------------------
00360     int linked;
00361     glLinkProgram( m_uiProgramObject );
00362     Fn::CHECK_GL_ERROR();
00363     glGetProgramiv( m_uiProgramObject, GL_LINK_STATUS, &linked );
00364     Fn::CHECK_GL_ERROR();
00365     //----------------------------------------------------------------
00366     if ( linked ) {
00367         m_bLinkStatus = true;
00368     }
00369     else {
00370         m_bLinkStatus = false;
00371     #ifdef TAPs_USE_WXWIDGETS
00372         wxLogError( wxT( "ERROR: GLSL Linker Error" ) );
00373     #else
00374         std::cerr << "ERROR: GLSL Linker Error" << std::endl;
00375     #endif
00376     }
00377     //----------------------------------------------------------------
00378     return m_bLinkStatus;
00379 }
00380 //-----------------------------------------------------------------------------
00381 // Get linker messages
00382 char * GLSLProgramObject::GetLinkerLog ()
00383 {
00384     //----------------------------------------------------------------
00385     if ( !gbIsGLSLSupported ) return gbGLSLErrStr[0];
00386     int bLen = 0, sLen = 0;
00387     //----------------------------------------------------------------
00388     if ( m_uiProgramObject == NULL ) return gbGLSLErrStr[2];
00389     glGetProgramiv( m_uiProgramObject, GL_INFO_LOG_LENGTH, &bLen );
00390     Fn::CHECK_GL_ERROR();
00391     //----------------------------------------------------------------
00392     if ( bLen > 1 ) {
00393         if ( m_cpLinkerLog ) {
00394             delete [] m_cpLinkerLog;
00395             m_cpLinkerLog = NULL;
00396         }
00397         if ( (m_cpLinkerLog = new GLchar[bLen]) == NULL ) {
00398         //if ( (m_cpLinkerLog = (GLchar *) malloc (bLen*sizeof(char))) == NULL ) {
00399         #ifdef TAPs_USE_WXWIDGETS
00400             wxLogError( wxT( "ERROR: Cound not allocate linker log buffer" ) );
00401         #else
00402             std::cerr << "ERROR: Cound not allocate linker log buffer\n";
00403         #endif
00404             return gbGLSLErrStr[3];
00405         }
00406         glGetProgramInfoLog( m_uiProgramObject, bLen, &sLen, m_cpLinkerLog );
00407         Fn::CHECK_GL_ERROR();
00408     }
00409     if ( m_cpLinkerLog ) {
00410         return static_cast<char *>( m_cpLinkerLog );
00411     }
00412     else {
00413         return gbGLSLErrStr[6];
00414     }
00415     //----------------------------------------------------------------
00416     return gbGLSLErrStr[7];
00417 }
00418 //-----------------------------------------------------------------------------
00419 // Begin this shader.  OpenGL calls will go through shader
00420 void GLSLProgramObject::BeginGLSL ()
00421 {
00422     if ( !gbIsGLSLSupported )           return;
00423     if ( m_uiProgramObject == NULL )    return;
00424     if ( !m_stcbShaderActive )          return;
00425     if ( m_bLinkStatus ) {
00426         glUseProgram( m_uiProgramObject );
00427         Fn::CHECK_GL_ERROR();
00428     }
00429 }
00430 //-----------------------------------------------------------------------------
00431 // Stop using this shader. OpenGL calls will go through regular pipeline.
00432 void GLSLProgramObject::EndGLSL ()
00433 {
00434     if ( !gbIsGLSLSupported )   return;
00435     if ( !m_stcbShaderActive )  return;
00436     glUseProgram( NULL );
00437     Fn::CHECK_GL_ERROR();
00438 }
00439 
00440 //=============================================================================
00441 // START: Float
00442 //-----------------------------------------------------------------------------
00443 bool GLSLProgramObject::SetUniform1f ( char *var, GLfloat x )
00444 {
00445     if ( !gbIsGLSLSupported )   return false;
00446     if ( !m_stcbShaderActive )  return true;
00447     //----------------------------------------------------------------
00448     GLint loc = GetUniLoc( var );
00449     if ( loc == -1 )    return false;   // cannot find variable
00450     //----------------------------------------------------------------
00451     glUniform1f( loc, x );
00452     return true;
00453 }
00454 //-----------------------------------------------------------------------------
00455 bool GLSLProgramObject::SetUniform2f ( char *var, GLfloat x, GLfloat y )
00456 {
00457     if ( !gbIsGLSLSupported )   return false;
00458     if ( !m_stcbShaderActive )  return true;
00459     //----------------------------------------------------------------
00460     GLint loc = GetUniLoc( var );
00461     if ( loc == -1 )    return false;   // cannot find variable
00462     //----------------------------------------------------------------
00463     glUniform2f( loc, x, y );
00464     return true;
00465 }
00466 //-----------------------------------------------------------------------------
00467 bool GLSLProgramObject::SetUniform3f ( char *var, GLfloat x, GLfloat y, GLfloat z )
00468 {
00469     if ( !gbIsGLSLSupported )   return false;
00470     if ( !m_stcbShaderActive )  return true;
00471     //----------------------------------------------------------------
00472     GLint loc = GetUniLoc( var );
00473     if ( loc == -1 )    return false;   // cannot find variable
00474     //----------------------------------------------------------------
00475     glUniform3f( loc, x, y, z );
00476     return true;
00477 }
00478 //-----------------------------------------------------------------------------
00479 bool GLSLProgramObject::SetUniform4f ( char *var, GLfloat x, GLfloat y, GLfloat z, GLfloat w )
00480 {
00481     if ( !gbIsGLSLSupported )   return false;
00482     if ( !m_stcbShaderActive )  return true;
00483     //----------------------------------------------------------------
00484     GLint loc = GetUniLoc( var );
00485     if ( loc == -1 )    return false;   // cannot find variable
00486     //----------------------------------------------------------------
00487     glUniform4f( loc, x, y, z, w );
00488     return true;
00489 }
00490 //-----------------------------------------------------------------------------
00491 // END: Float
00492 //=============================================================================
00493 
00494 //=============================================================================
00495 // START: Integer
00496 //-----------------------------------------------------------------------------
00497 bool GLSLProgramObject::SetUniform1i ( char *var, GLint x )
00498 {
00499     if ( !gbIsGLSLSupported )   return false;
00500     if ( !m_stcbShaderActive )  return true;
00501     //----------------------------------------------------------------
00502     GLint loc = GetUniLoc( var );
00503     if ( loc == -1 )    return false;   // cannot find variable
00504     //----------------------------------------------------------------
00505     glUniform1i( loc, x );
00506     return true;
00507 }
00508 //-----------------------------------------------------------------------------
00509 bool GLSLProgramObject::SetUniform2i ( char *var, GLint x, GLint y )
00510 {
00511     if ( !gbIsGLSLSupported )   return false;
00512     if ( !m_stcbShaderActive )  return true;
00513     //----------------------------------------------------------------
00514     GLint loc = GetUniLoc( var );
00515     if ( loc == -1 )    return false;   // cannot find variable
00516     //----------------------------------------------------------------
00517     glUniform2i( loc, x, y );
00518     return true;
00519 }
00520 //-----------------------------------------------------------------------------
00521 bool GLSLProgramObject::SetUniform3i ( char *var, GLint x, GLint y, GLint z )
00522 {
00523     if ( !gbIsGLSLSupported )   return false;
00524     if ( !m_stcbShaderActive )  return true;
00525     //----------------------------------------------------------------
00526     GLint loc = GetUniLoc( var );
00527     if ( loc == -1 )    return false;   // cannot find variable
00528     //----------------------------------------------------------------
00529     glUniform3i( loc, x, y, z );
00530     return true;
00531 }
00532 //-----------------------------------------------------------------------------
00533 bool GLSLProgramObject::SetUniform4i ( char *var, GLint x, GLint y, GLint z, GLint w )
00534 {
00535     if ( !gbIsGLSLSupported )   return false;
00536     if ( !m_stcbShaderActive )  return true;
00537     //----------------------------------------------------------------
00538     GLint loc = GetUniLoc( var );
00539     if ( loc == -1 )    return false;   // cannot find variable
00540     //----------------------------------------------------------------
00541     glUniform4i( loc, x, y, z, w );
00542     return true;
00543 }
00544 //-----------------------------------------------------------------------------
00545 // END: Integer
00546 //=============================================================================
00547 
00548 //=============================================================================
00549 // START: Unsigned Integer
00550 //-----------------------------------------------------------------------------
00551 bool GLSLProgramObject::SetUniform1ui ( char *var, GLuint x )
00552 {
00553     if ( !gbIsGLSLSupported )   return false;
00554     if ( !m_stcbShaderActive )  return true;
00555     //----------------------------------------------------------------
00556     GLint loc = GetUniLoc( var );
00557     if ( loc == -1 )    return false;   // cannot find variable
00558     //----------------------------------------------------------------
00559     glUniform1uiEXT( loc, x );
00560     return true;
00561 }
00562 //-----------------------------------------------------------------------------
00563 bool GLSLProgramObject::SetUniform2ui ( char *var, GLuint x, GLuint y )
00564 {
00565     if ( !gbIsGLSLSupported )   return false;
00566     if ( !m_stcbShaderActive )  return true;
00567     //----------------------------------------------------------------
00568     GLint loc = GetUniLoc( var );
00569     if ( loc == -1 )    return false;   // cannot find variable
00570     //----------------------------------------------------------------
00571     glUniform2uiEXT( loc, x, y );
00572     return true;
00573 }
00574 //-----------------------------------------------------------------------------
00575 bool GLSLProgramObject::SetUniform3ui ( char *var, GLuint x, GLuint y, GLuint z )
00576 {
00577     if ( !gbIsGLSLSupported )   return false;
00578     if ( !m_stcbShaderActive )  return true;
00579     //----------------------------------------------------------------
00580     GLint loc = GetUniLoc( var );
00581     if ( loc == -1 )    return false;   // cannot find variable
00582     //----------------------------------------------------------------
00583     glUniform3uiEXT( loc, x, y, z );
00584     return true;
00585 }
00586 //-----------------------------------------------------------------------------
00587 bool GLSLProgramObject::SetUniform4ui ( char *var, GLuint x, GLuint y, GLuint z, GLuint w )
00588 {
00589     if ( !gbIsGLSLSupported )   return false;
00590     if ( !m_stcbShaderActive )  return true;
00591     //----------------------------------------------------------------
00592     GLint loc = GetUniLoc( var );
00593     if ( loc == -1 )    return false;   // cannot find variable
00594     //----------------------------------------------------------------
00595     glUniform4uiEXT( loc, x, y, z, w );
00596     return true;
00597 }
00598 //-----------------------------------------------------------------------------
00599 // END: Unsigned Integer
00600 //=============================================================================
00601 
00602 //=============================================================================
00603 // START: Float Vector
00604 //-----------------------------------------------------------------------------
00605 bool GLSLProgramObject::SetUniform1fv ( char *var, GLsizei count, GLfloat *val )
00606 {
00607     if ( !gbIsGLSLSupported )   return false;
00608     if ( !m_stcbShaderActive )  return true;
00609     //----------------------------------------------------------------
00610     GLint loc = GetUniLoc( var );
00611     if ( loc == -1 )    return false;   // cannot find variable
00612     //----------------------------------------------------------------
00613     glUniform1fv( loc, count, val );
00614     return true;
00615 }
00616 //-----------------------------------------------------------------------------
00617 bool GLSLProgramObject::SetUniform2fv ( char *var, GLsizei count, GLfloat *val )
00618 {
00619     if ( !gbIsGLSLSupported )   return false;
00620     if ( !m_stcbShaderActive )  return true;
00621     //----------------------------------------------------------------
00622     GLint loc = GetUniLoc( var );
00623     if ( loc == -1 )    return false;   // cannot find variable
00624     //----------------------------------------------------------------
00625     glUniform2fv( loc, count, val );
00626     return true;
00627 }
00628 //-----------------------------------------------------------------------------
00629 bool GLSLProgramObject::SetUniform3fv ( char *var, GLsizei count, GLfloat *val )
00630 {
00631     if ( !gbIsGLSLSupported )   return false;
00632     if ( !m_stcbShaderActive )  return true;
00633     //----------------------------------------------------------------
00634     GLint loc = GetUniLoc( var );
00635     if ( loc == -1 )    return false;   // cannot find variable
00636     //----------------------------------------------------------------
00637     glUniform3fv( loc, count, val );
00638     return true;
00639 }
00640 //-----------------------------------------------------------------------------
00641 bool GLSLProgramObject::SetUniform4fv ( char *var, GLsizei count, GLfloat *val )
00642 {
00643     if ( !gbIsGLSLSupported )   return false;
00644     if ( !m_stcbShaderActive )  return true;
00645     //----------------------------------------------------------------
00646     GLint loc = GetUniLoc( var );
00647     if ( loc == -1 )    return false;   // cannot find variable
00648     //----------------------------------------------------------------
00649     glUniform4fv( loc, count, val );
00650     return true;
00651 }
00652 //-----------------------------------------------------------------------------
00653 // END: Float Vector
00654 //=============================================================================
00655 
00656 //=============================================================================
00657 // START: Integer Vector
00658 //-----------------------------------------------------------------------------
00659 bool GLSLProgramObject::SetUniform1iv ( char *var, GLsizei count, GLint *val )
00660 {
00661     if ( !gbIsGLSLSupported )   return false;
00662     if ( !m_stcbShaderActive )  return true;
00663     //----------------------------------------------------------------
00664     GLint loc = GetUniLoc( var );
00665     if ( loc == -1 )    return false;   // cannot find variable
00666     //----------------------------------------------------------------
00667     glUniform1iv( loc, count, val );
00668     return true;
00669 }
00670 //-----------------------------------------------------------------------------
00671 bool GLSLProgramObject::SetUniform2iv ( char *var, GLsizei count, GLint *val )
00672 {
00673     if ( !gbIsGLSLSupported )   return false;
00674     if ( !m_stcbShaderActive )  return true;
00675     //----------------------------------------------------------------
00676     GLint loc = GetUniLoc( var );
00677     if ( loc == -1 )    return false;   // cannot find variable
00678     //----------------------------------------------------------------
00679     glUniform2iv( loc, count, val );
00680     return true;
00681 }
00682 //-----------------------------------------------------------------------------
00683 bool GLSLProgramObject::SetUniform3iv ( char *var, GLsizei count, GLint *val )
00684 {
00685     if ( !gbIsGLSLSupported )   return false;
00686     if ( !m_stcbShaderActive )  return true;
00687     //----------------------------------------------------------------
00688     GLint loc = GetUniLoc( var );
00689     if ( loc == -1 )    return false;   // cannot find variable
00690     //----------------------------------------------------------------
00691     glUniform3iv( loc, count, val );
00692     return true;
00693 }
00694 //-----------------------------------------------------------------------------
00695 bool GLSLProgramObject::SetUniform4iv ( char *var, GLsizei count, GLint *val )
00696 {
00697     if ( !gbIsGLSLSupported )   return false;
00698     if ( !m_stcbShaderActive )  return true;
00699     //----------------------------------------------------------------
00700     GLint loc = GetUniLoc( var );
00701     if ( loc == -1 )    return false;   // cannot find variable
00702     //----------------------------------------------------------------
00703     glUniform4iv( loc, count, val );
00704     return true;
00705 }
00706 //-----------------------------------------------------------------------------
00707 // END: Integer Vector
00708 //=============================================================================
00709 
00710 //=============================================================================
00711 // START: Matrix
00712 //-----------------------------------------------------------------------------
00713 bool GLSLProgramObject::SetUniformMatrix2fv ( char *var, GLsizei count, GLboolean transpose, GLfloat *val )
00714 {
00715     if ( !gbIsGLSLSupported )   return false;
00716     if ( !m_stcbShaderActive )  return true;
00717     //----------------------------------------------------------------
00718     GLint loc = GetUniLoc( var );
00719     if ( loc == -1 )    return false;   // cannot find variable
00720     //----------------------------------------------------------------
00721     glUniformMatrix2fv( loc, count, transpose, val );
00722     return true;
00723 }
00724 //-----------------------------------------------------------------------------
00725 bool GLSLProgramObject::SetUniformMatrix3fv ( char *var, GLsizei count, GLboolean transpose, GLfloat *val )
00726 {
00727     if ( !gbIsGLSLSupported )   return false;
00728     if ( !m_stcbShaderActive )  return true;
00729     //----------------------------------------------------------------
00730     GLint loc = GetUniLoc( var );
00731     if ( loc == -1 )    return false;   // cannot find variable
00732     //----------------------------------------------------------------
00733     glUniformMatrix3fv( loc, count, transpose, val );
00734     return true;
00735 }
00736 //-----------------------------------------------------------------------------
00737 bool GLSLProgramObject::SetUniformMatrix4fv ( char *var, GLsizei count, GLboolean transpose, GLfloat *val )
00738 {
00739     if ( !gbIsGLSLSupported )   return false;
00740     if ( !m_stcbShaderActive )  return true;
00741     //----------------------------------------------------------------
00742     GLint loc = GetUniLoc( var );
00743     if ( loc == -1 )    return false;   // cannot find variable
00744     //----------------------------------------------------------------
00745     glUniformMatrix4fv( loc, count, transpose, val );
00746     return true;
00747 }
00748 //-----------------------------------------------------------------------------
00749 // END: Matrix
00750 //=============================================================================
00751 
00752 //=============================================================================
00753 // START: Get Uniform
00754 //-----------------------------------------------------------------------------
00755 void GLSLProgramObject::GetUniformfv ( char *name, GLfloat *val )
00756 {
00757     if ( !gbIsGLSLSupported )   return;
00758     GLint loc = GetUniLoc( name );
00759     /*
00760     GLint loc = glGetUniformLocation( m_uiProgramObject, name );
00761     if ( loc == -1 ) {
00762     #ifdef TAPs_USE_WXWIDGETS
00763         wxLogError( wxT( "ERROR: Cannot find uniform variable \"%s\"" ), 
00764                     name );
00765     #else
00766         std::cerr << "ERROR: cannot find uniform variable \"" 
00767                     << name << "\"\n";
00768     #endif
00769     }
00770     //*/
00771     glGetUniformfv( m_uiProgramObject, loc, val );
00772 }
00773 //-----------------------------------------------------------------------------
00774 void GLSLProgramObject::GetUniformiv ( char *name, GLint *val )
00775 {
00776     if ( !gbIsGLSLSupported )   return;
00777     GLint loc = GetUniLoc( name );
00778     /*
00779     GLint loc = glGetUniformLocation( m_uiProgramObject, name );
00780     if ( loc == -1 ) {
00781     #ifdef TAPs_USE_WXWIDGETS
00782         wxLogError( wxT( "ERROR: Cannot find uniform variable \"%s\"" ), 
00783                     name );
00784     #else
00785         std::cerr << "ERROR: cannot find uniform variable \"" 
00786                     << name << "\"\n";
00787     #endif
00788     }
00789     //*/
00790     glGetUniformiv( m_uiProgramObject, loc, val );
00791 }
00792 //-----------------------------------------------------------------------------
00793 void GLSLProgramObject::GetUniformuiv ( char *name, GLuint *val )
00794 {
00795     if ( !gbIsGLSLSupported )   return;
00796     GLint loc = GetUniLoc( name );
00797     /*
00798     GLint loc = glGetUniformLocation( m_uiProgramObject, name );
00799     if ( loc == -1 ) {
00800     #ifdef TAPs_USE_WXWIDGETS
00801         wxLogError( wxT( "ERROR: Cannot find uniform variable \"%s\"" ), 
00802                     name );
00803     #else
00804         std::cerr << "ERROR: cannot find uniform variable \"" 
00805                     << name << "\"\n";
00806     #endif
00807     }
00808     //*/
00809     glGetUniformuivEXT( m_uiProgramObject, loc, val );
00810 }
00811 //-----------------------------------------------------------------------------
00812 // END: Get Uniform
00813 //=============================================================================
00814 
00815 //-----------------------------------------------------------------------------
00816 bool GLSLProgramObject::SetVertexAttrib1f ( GLuint index, GLfloat x )
00817 {
00818     if ( !gbIsGLSLSupported )   return false;
00819     glVertexAttrib1f( index, x );
00820     return true;
00821 }
00822 //-----------------------------------------------------------------------------
00823 bool GLSLProgramObject::SetVertexAttrib2f ( GLuint index, GLfloat x, GLfloat y )
00824 {
00825     if ( !gbIsGLSLSupported )   return false;
00826     glVertexAttrib2f( index, x, y );
00827     return true;
00828 }
00829 //-----------------------------------------------------------------------------
00830 bool GLSLProgramObject::SetVertexAttrib3f ( GLuint index, GLfloat x, GLfloat y, GLfloat z )
00831 {
00832     if ( !gbIsGLSLSupported )   return false;
00833     glVertexAttrib3f( index, x, y, z );
00834     return true;
00835 }
00836 //-----------------------------------------------------------------------------
00837 bool GLSLProgramObject::SetVertexAttrib4f ( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w )
00838 {
00839     if ( !gbIsGLSLSupported )   return false;
00840     glVertexAttrib4f( index, x, y, z, w );
00841     return true;
00842 }
00843 //-----------------------------------------------------------------------------
00844 GLint GLSLProgramObject::GetUniLoc ( const GLchar *name )
00845 {
00846     GLint loc = glGetUniformLocation( m_uiProgramObject, name );
00847     if ( loc == -1 ) {
00848     #ifdef TAPs_USE_WXWIDGETS
00849         wxLogError( wxT( "ERROR: Cannot find uniform variable \"%s\"" ), 
00850                     name );
00851     #else
00852         std::cerr << "ERROR: Cannot find uniform variable \"" 
00853                     << name << "\"\n";
00854     #endif
00855     }
00856     Fn::CHECK_GL_ERROR();
00857     return loc;
00858 }
00859 //-----------------------------------------------------------------------------
00860 //=============================================================================
00861 //******************************************************************************
00862 
00863 
00864 //******************************************************************************
00865 //=============================================================================
00866 // class GLSLShader
00867 //-----------------------------------------------------------------------------
00868 // Constructor
00869 GLSLShader::GLSLShader () :
00870     m_iShaderType( 0 ),         // 1 = Vertex Shader; 2 = Fragment Shader; else = NONE
00871     m_uiShaderObject( NULL ),       // program object
00872     m_cpShaderSource( NULL ),       // ASCII source code
00873     m_bCompileStatus( false ),      // true if shader is compiled
00874     m_cpCompilerLog( NULL ),        // compiler log message
00875     m_bMemAlloc( false )                // true if shader allocated memory
00876 {
00877     GFnInitGLSL();
00878 }
00879 //-----------------------------------------------------------------------------
00880 // Destructor
00881 GLSLShader::~GLSLShader ()
00882 {
00883     if ( m_cpCompilerLog ) {
00884         delete [] m_cpCompilerLog;
00885         m_cpCompilerLog = NULL;
00886     }
00887     if ( m_cpShaderSource ) {
00888         if ( m_bMemAlloc )  delete [] m_cpShaderSource;
00889         m_cpShaderSource = NULL;
00890         m_bMemAlloc = false;
00891     }
00892     if ( m_bCompileStatus ) {
00893         glDeleteShader( m_uiShaderObject );
00894         Fn::CHECK_GL_ERROR();
00895     }
00896 }
00897 /*
00898 //-----------------------------------------------------------------------------
00899 // Load a file
00900 int GLSLShader::Load ( const char *fileName )
00901 {
00902     std::ifstream file;
00903     if ( !file )    return -1;  // File name is empty
00904     unsigned long len = GFnGetFileLength( fileName );
00905     //---------------------------------------------------------------
00906     file.open( fileName, std::ios::in );
00907     //file.close();
00908     //std::cout << "file len = " << len << std::cout;
00909     //char c;
00910     //std::cout << "Press any key to continue." << std::endl;
00911     //std::cin >> c;
00912     if ( len == 0 ) return -2;  // File is empty
00913     //---------------------------------------------------------------
00914     if ( m_cpShaderSource ) {   // there is a loaded source, free it
00915         if ( m_bMemAlloc )  delete [] m_cpShaderSource;
00916     }
00917     m_cpShaderSource = new GLchar[len+1];
00918     //m_cpShaderSource = (GLchar *) malloc (len+1);
00919     if ( m_cpShaderSource == NULL ) return -3;  // cannot reserve memory
00920     m_bMemAlloc = true;
00921     //---------------------------------------------------------------
00922     // len isn't always strlen because some characters are stripped in
00923     // ASCII read.
00924     // It is important to 0-terminate the real length later,
00925     // len is just the max location.
00926     //m_cpShaderSource[len] = 0;    // '\0'
00927     m_cpShaderSource[len] = '\0';
00928     //---------------------------------------------------------------
00929     unsigned int  i = 0;
00930     //while ( !file.eof() && i < len ) {
00931     //file.open( fileName, std::ios::in );
00932     //while ( i < len ) {
00933     while ( file.good() ) {
00934         m_cpShaderSource[i++] = file.get(); // get a char from file
00935         //std::cout << m_cpShaderSource[i-1];
00936         if ( i > len )  i = len;
00937     }
00938     m_cpShaderSource[i] = '\0'; // 0-terminate
00939     //std::cout << "\ni = " << i << std::endl;
00940     file.close();
00941     //----------------------------------------------------------------
00942     return 0;
00943 }
00944 //*/
00945 //*
00946 //-----------------------------------------------------------------------------
00947 // Load a file
00948 int GLSLShader::Load ( const char * fileName )
00949 {
00950     if ( !fileName )    return -1;  // File name is empty
00951     unsigned long len = GFnGetFileLength( fileName );
00952 #ifdef TAPs_DEBUG_MODE
00953 #ifdef TAPs_USE_WXWIDGETS
00954     wxLogWarning( wxT( "len: %d" ), len );
00955 #else
00956     std::cout << "len: " << len << "\n";
00957 #endif
00958 #endif
00959 
00960     if ( len == 0 ) return -2;  // File is empty
00961     //----------------------------------------------------------------
00962     if ( m_cpShaderSource ) {   // there is a loaded source, free it
00963         if ( m_bMemAlloc )  delete [] m_cpShaderSource;
00964     }
00965     m_cpShaderSource = new GLchar[len+1];
00966     //m_cpShaderSource = (GLchar *) malloc (len+1);
00967     if ( m_cpShaderSource == NULL ) return -3;  // cannot reserve memory
00968     m_bMemAlloc = true;
00969 
00970     //
00971     // Open the file
00972     //
00973     FILE *fh = fopen(fileName, "r");
00974     if (!fh)
00975         return -1;
00976 
00977     //
00978     // Get the shader from a file.
00979     //
00980     fseek(fh, 0, SEEK_SET);
00981     int count = static_cast<int>( fread(m_cpShaderSource, 1, len, fh) );
00982     m_cpShaderSource[count] = '\0';
00983 
00984     // DEBUG
00985     //for ( int i = 0; i < len; ++i ) {
00986     //  std::cout << m_cpShaderSource[i];
00987     //}
00988 
00989     if (ferror(fh))
00990         count = 0;
00991 
00992     fclose(fh);
00993     //----------------------------------------------------------------
00994     return 0;
00995 }
00996 //*/
00997 //-----------------------------------------------------------------------------
00998 // Load a file
00999 void GLSLShader::LoadFromMemory ( const char *program )
01000 {
01001     if ( m_cpShaderSource == NULL ) {   // there is a loaded source, free it
01002         if ( m_bMemAlloc )  delete [] m_cpShaderSource;
01003     }
01004     m_bMemAlloc = false;
01005     m_cpShaderSource = (GLchar *) program;
01006 }
01007 //-----------------------------------------------------------------------------
01008 // Get compiler log messages
01009 char * GLSLShader::GetCompilerLog ()
01010 {
01011     if ( !gbIsGLSLSupported )           return gbGLSLErrStr[0];
01012     if ( m_uiShaderObject == NULL )     return gbGLSLErrStr[1];
01013     //----------------------------------------------------------------
01014     int bLen = 0;   int sLen = 0;
01015     glGetShaderiv( m_uiShaderObject, GL_INFO_LOG_LENGTH, &bLen );
01016     Fn::CHECK_GL_ERROR();
01017     //----------------------------------------------------------------
01018     if ( bLen > 1 ) {
01019         if ( m_cpCompilerLog == NULL ) {
01020             delete [] m_cpCompilerLog;
01021             m_cpCompilerLog = NULL;
01022         }
01023         if ( (m_cpCompilerLog = new GLchar[bLen]) == NULL ) {
01024         //if ( (m_cpCompilerLog = (GLchar *) malloc (bLen*sizeof(char))) == NULL ) {
01025         #ifdef TAPs_USE_WXWIDGETS
01026             wxLogError( wxT( "ERROR: Could not allocate memory for compiler log buffer" ) );
01027         #else
01028             std::cerr << "ERROR: Could not allocate memory for compiler log buffer\n";
01029         #endif
01030             return gbGLSLErrStr[3];
01031         }
01032         glGetShaderInfoLog( m_uiShaderObject, bLen, &sLen, m_cpCompilerLog );
01033         Fn::CHECK_GL_ERROR();
01034     }
01035     if ( m_cpCompilerLog == NULL ) {
01036         return static_cast<char *>( m_cpCompilerLog );
01037     }
01038     else {
01039         return gbGLSLErrStr[4];
01040     }
01041     //----------------------------------------------------------------
01042 #ifdef TAPs_DEBUG_MODE
01043 #ifdef TAPs_USE_WXWIDGETS
01044     wxLogWarning( wxT( "blen: %d" ), bLen );
01045     wxLogWarning( wxT( "slen: %d" ), sLen );
01046 #else
01047     std::cout << "blen: " << bLen << std::endl;
01048     std::cout << "slen: " << sLen << std::endl;
01049 #endif
01050 #endif
01051 
01052     return gbGLSLErrStr[5];
01053 }
01054 //-----------------------------------------------------------------------------
01055 // Get compiler log messages
01056 bool GLSLShader::Compile ()
01057 {
01058     if ( !gbIsGLSLSupported ) {
01059         #ifdef TAPs_DEBUG_MODE
01060             #ifdef TAPs_USE_WXWIDGETS
01061                 wxLogWarning( wxT( "gbIsGLSLSupported == false" ) );
01062             #else
01063                 std::cout << "gbIsGLSLSupported == false\n" << std::endl;
01064             #endif
01065         #endif
01066         return false;
01067     }
01068     m_bCompileStatus = false;
01069     int compiled = 0;
01070     if ( m_cpShaderSource == NULL ) {
01071         #ifdef TAPs_DEBUG_MODE
01072             #ifdef TAPs_USE_WXWIDGETS
01073                 wxLogWarning( wxT( "m_cpShaderSource == NULL (i.e. Shader is empty!)" ) );
01074             #else
01075                 std::cout << "m_cpShaderSource == NULL (i.e. Shader is empty!)\n" << std::endl;
01076             #endif
01077         #endif
01078         return false;   // Shader is empty
01079     }
01080     //----------------------------------------------------------------
01081     GLint length = static_cast<GLint>( strlen( (const char*) m_cpShaderSource ) );
01082 #ifdef TAPs_DEBUG_MODE
01083 #ifdef TAPs_USE_WXWIDGETS
01084     wxLogWarning( wxT( "Source (Length %d ):" ), length );
01085     wxLogWarning( wxT( "-------------------------------------------------------------" ) );
01086     wxLogWarning( wxT( "%s" ), m_cpShaderSource );
01087     wxLogWarning( wxT( "-------------------------------------------------------------" ) );
01088 #else
01089     std::cout << "Source (Length " << length << "):\n";
01090     std::cout << "-------------------------------------------------------------\n";
01091     std::cout << m_cpShaderSource << "\n";
01092     std::cout << "-------------------------------------------------------------\n";
01093 #endif
01094 #endif
01095     glShaderSource( m_uiShaderObject, 1, (const GLchar **) &m_cpShaderSource, &length );
01096     //glShaderSource( m_uiShaderObject, 1, (const GLchar **) &m_cpShaderSource, NULL );
01097 #ifdef TAPs_DEBUG_MODE
01098 #ifdef TAPs_USE_WXWIDGETS
01099     wxLogWarning( wxT( "Pass glShaderSource" ) );
01100 #else
01101     std::cout << "Pass glShaderSource\n";
01102 #endif
01103 #endif
01104     Fn::CHECK_GL_ERROR();
01105     glCompileShader( m_uiShaderObject );
01106 #ifdef TAPs_DEBUG_MODE
01107 #ifdef TAPs_USE_WXWIDGETS
01108     wxLogWarning( wxT( "Pass glCompileShader" ) );
01109 #else
01110     std::cout << "Pass glCompileShader\n";
01111 #endif
01112 #endif
01113     Fn::CHECK_GL_ERROR();
01114 
01115     glGetShaderiv( m_uiShaderObject, GL_COMPILE_STATUS, &compiled );
01116 #ifdef TAPs_DEBUG_MODE
01117 #ifdef TAPs_USE_WXWIDGETS
01118     wxLogWarning( wxT( "Pass glGetObjectParameteriv" ) );
01119 #else
01120     std::cout << "Pass glGetObjectParameteriv\n";
01121 #endif
01122 #endif
01123     Fn::CHECK_GL_ERROR();
01124 
01125     //----------------------------------------------------------------
01126     if ( compiled ) m_bCompileStatus = true;
01127     return m_bCompileStatus;
01128 }
01129 //-----------------------------------------------------------------------------
01130 // Get localtion of the attribute
01131 GLint GLSLShader::GetAttribLoc ( char * cpAttribName )
01132 {
01133     return glGetAttribLocation( m_uiShaderObject, cpAttribName );
01134 }
01135 //-----------------------------------------------------------------------------
01136 //=============================================================================
01137 //******************************************************************************
01138 
01139 //******************************************************************************
01140 //=============================================================================
01141 // class GLSLVertexShader
01142 //-----------------------------------------------------------------------------
01143 // Constructor
01144 GLSLVertexShader::GLSLVertexShader ()
01145 {
01146     m_iShaderType = 1;
01147     if ( gbIsGLSLSupported ) {
01148         m_uiShaderObject = glCreateShader( GL_VERTEX_SHADER );
01149         Fn::CHECK_GL_ERROR();
01150     }
01151 }
01152 //-----------------------------------------------------------------------------
01153 // Destructor
01154 GLSLVertexShader::~GLSLVertexShader ()
01155 {}
01156 //-----------------------------------------------------------------------------
01157 //=============================================================================
01158 //******************************************************************************
01159 
01160 //******************************************************************************
01161 //=============================================================================
01162 // class GLSLGeometryShader
01163 //-----------------------------------------------------------------------------
01164 // Constructor
01165 GLSLGeometryShader::GLSLGeometryShader ()
01166 {
01167     m_iShaderType = 1;
01168     if ( gbIsGLSLSupported ) {
01169         m_uiShaderObject = glCreateShader( GL_GEOMETRY_SHADER_EXT );
01170         Fn::CHECK_GL_ERROR();
01171     }
01172 }
01173 //-----------------------------------------------------------------------------
01174 // Destructor
01175 GLSLGeometryShader::~GLSLGeometryShader ()
01176 {}
01177 //-----------------------------------------------------------------------------
01178 //=============================================================================
01179 //******************************************************************************
01180 
01181 //******************************************************************************
01182 //=============================================================================
01183 // class GLSLFragmentShader
01184 //-----------------------------------------------------------------------------
01185 // Constructor
01186 GLSLFragmentShader::GLSLFragmentShader ()
01187 {
01188     m_iShaderType = 2;
01189     if ( gbIsGLSLSupported ) {
01190         m_uiShaderObject = glCreateShader( GL_FRAGMENT_SHADER );
01191         Fn::CHECK_GL_ERROR();
01192     }
01193 }
01194 //-----------------------------------------------------------------------------
01195 // Destructor
01196 GLSLFragmentShader::~GLSLFragmentShader ()
01197 {}
01198 //-----------------------------------------------------------------------------
01199 //=============================================================================
01200 //******************************************************************************
01201 
01202 
01203 //******************************************************************************
01204 //=============================================================================
01205 // class GLSLShaderManager
01206 //-----------------------------------------------------------------------------
01207 // Constructor
01208 GLSLShaderManager::GLSLShaderManager ()
01209 {}
01210 //-----------------------------------------------------------------------------
01211 // Destructor
01212 GLSLShaderManager::~GLSLShaderManager ()
01213 {
01214     // Delete objects
01215     std::vector<GLSLProgramObject *>::iterator pos = m_vProgramObjectList.begin();
01216     while ( pos != m_vProgramObjectList.end() ) {
01217         GLSLProgramObject *obj = *pos;
01218         pos = m_vProgramObjectList.erase( pos );
01219         delete obj;
01220     }
01221 }
01222 //-----------------------------------------------------------------------------
01223 // Create a GLSLProgramObject
01224 bool GLSLShaderManager::CreateGLSLProgramObject ( GLSLProgramObject * (&progObj) )
01225 {
01226     progObj = new GLSLProgramObject();
01227     progObj->MemageMemory();
01228     m_vProgramObjectList.push_back( progObj );
01229     return progObj != NULL;
01230 }
01231 //-----------------------------------------------------------------------------
01232 // Attach (load & compile) a shader read from file
01233 bool GLSLShaderManager::AttachShaderFromFile ( 
01234     GLSLProgramObject * progObj, char const * shaderFile, GLuint shaderType )
01235 {
01236     if ( !progObj ) return false;
01237     //---------------------------------------------------------------
01238     // Arranging order is according to the GPU pipeline.
01239     //---------------------------------------------------------------
01240     // Vertex Shader
01241     if      ( shaderType == GL_VERTEX_SHADER ) {
01242         GLSLVertexShader    * vertShader    = new GLSLVertexShader();
01243 
01244         if ( !vertShader )  return false;
01245 
01246         if ( !LoadVertexShaderFromFile( vertShader, shaderFile ) ) {
01247             delete vertShader;
01248             return false;
01249         }
01250 
01251         if ( !CompileVertexShaderFromFile( vertShader, shaderFile ) ) {
01252             delete vertShader;
01253             return false;
01254         }
01255         //-------------------------------------------------
01256         // Add the vertex shader to the program object
01257         progObj->AddShader( vertShader );
01258     }
01259     //---------------------------------------------------------------
01260     // Geometry Shader
01261     else if ( shaderType == GL_GEOMETRY_SHADER_EXT ) {
01262         //std::cout << "\tSTART: Geometry Shader" << std::endl;
01263         GLSLGeometryShader  * geomShader    = new GLSLGeometryShader();
01264         //std::cout << "\tgeomShader created" << std::endl;
01265         if ( !geomShader )  return false;
01266         //std::cout << "\tgeomShader is not NULL." << std::endl;
01267         if ( !LoadGeometryShaderFromFile( geomShader, shaderFile ) ) {
01268             delete geomShader;
01269             return false;
01270         }
01271         //std::cout << "\tgeomShader is LOADED." << std::endl;
01272         if ( !CompileGeometryShaderFromFile( geomShader, shaderFile ) ) {
01273             delete geomShader;
01274             return false;
01275         }
01276         //std::cout << "\tgeomShader is Compiled." << std::endl;
01277         //-------------------------------------------------
01278         // Add the geometry shader to the program object
01279         progObj->AddShader( geomShader );
01280         //std::cout << "\tEND: Geometry Shader" << std::endl;
01281     }
01282     //---------------------------------------------------------------
01283     // Fragment Shader
01284     else if ( shaderType == GL_FRAGMENT_SHADER ) {
01285         GLSLFragmentShader  * fragShader    = new GLSLFragmentShader();
01286         if ( !fragShader )  return false;
01287         if ( !LoadFragmentShaderFromFile( fragShader, shaderFile ) ) {
01288             delete fragShader;
01289             return false;
01290         }
01291         if ( !CompileFragmentShaderFromFile( fragShader, shaderFile ) ) {
01292             delete fragShader;
01293             return false;
01294         }
01295         //-------------------------------------------------
01296         // Add the fragment shader to the program object
01297         progObj->AddShader( fragShader );
01298     }
01299     //---------------------------------------------------------------
01300     // Unrecognized shader type
01301     else {
01302         return false;
01303     }
01304     //---------------------------------------------------------------
01305     return true;
01306 }
01307 //-----------------------------------------------------------------------------
01308 // Link the program object
01309 bool GLSLShaderManager::Link ( GLSLProgramObject * progObj )
01310 {
01311     //{ return progObj->Link(); }
01312     //----------------------------------------------------------------
01313     // Link
01314     if ( !progObj->Link() ) {
01315     #ifdef TAPs_USE_WXWIDGETS
01316         wxLogError( wxT( "ERROR: Cound not link shader(s) in the program object (%d)!" ), 
01317                     progObj->GetProgramObject() );
01318         wxLogError( wxT( "%s" ), progObj->GetLinkerLog() );
01319     #else
01320         std::cerr << "ERROR: Cound not link shader(s) in the program object (" 
01321             << progObj->GetProgramObject() << ")!\n";
01322         std::cerr << progObj->GetLinkerLog() << "\n";
01323     #endif
01324         return false;
01325     }
01326     //----------------------------------------------------------------
01327     return true;
01328 }
01329 //-----------------------------------------------------------------------------
01330 // Load vertex/fragment shader from file
01331 GLSLProgramObject * GLSLShaderManager::LoadVertexGeometryAndFragmentShadersFromFile ( 
01332     char * vertFile, char * geomFile, char * fragFile )
01333 {
01334     GLSLProgramObject   * obj           = new GLSLProgramObject();
01335     GLSLVertexShader    * vertShader    = new GLSLVertexShader();
01336     GLSLGeometryShader  * geomShader    = new GLSLGeometryShader();
01337     GLSLFragmentShader  * fragShader    = new GLSLFragmentShader();
01338     //----------------------------------------------------------------
01339     // Load vertex shader
01340     //*
01341     if ( !LoadVertexShaderFromFile( vertShader, vertFile ) ) {
01342         delete obj;
01343         delete vertShader;
01344         delete geomShader;
01345         delete fragShader;
01346         return NULL;
01347     }
01348     //*/
01349     /*
01350     if ( vertFile ) {
01351 #ifdef TAPs_DEBUG_MODE
01352     #ifdef TAPs_USE_WXWIDGETS
01353         wxLogWarning( wxT( "Load vertex shader \"%s\"" ), vertFile );
01354     #else
01355         std::cout << "Load vertex shader \"" << vertFile << "\"";
01356     #endif
01357 #endif
01358         if ( vertShader->Load( vertFile ) ) {
01359         #ifdef TAPs_USE_WXWIDGETS
01360             wxLogError( wxT( "ERROR: Could not load a vertex shader named \"%s\"" ), 
01361                         vertFile );
01362         #else
01363             std::cerr << "ERROR: Could not load a vertex shader named \"" 
01364                         << vertFile << "\"!\n";
01365         #endif
01366             delete obj;
01367             delete vertShader;
01368             delete geomShader;
01369             delete fragShader;
01370             return NULL;
01371         }
01372 #ifdef TAPs_DEBUG_MODE
01373     #ifdef TAPs_USE_WXWIDGETS
01374         wxLogWarning( wxT( " is successful!" ) );
01375     #else
01376         std::cout << " is successful!\n";
01377     #endif
01378 #endif
01379     }
01380     //*/
01381     //----------------------------------------------------------------
01382     // Load geometry shader
01383     //*
01384     if ( !LoadGeometryShaderFromFile( geomShader, geomFile ) ) {
01385         delete obj;
01386         delete vertShader;
01387         delete geomShader;
01388         delete fragShader;
01389         return NULL;
01390     }
01391     //*/
01392     /*
01393     if ( geomFile ) {
01394 #ifdef TAPs_DEBUG_MODE
01395     #ifdef TAPs_USE_WXWIDGETS
01396         wxLogWarning( wxT( "Load geometry shader \"%s\"" ), geomFile );
01397     #else
01398         std::cout << "Load geometry shader \"" << geomFile << "\"";
01399     #endif
01400 #endif
01401         if ( geomShader->Load( geomFile ) ) {
01402         #ifdef TAPs_USE_WXWIDGETS
01403             wxLogError( wxT( "ERROR: Could not load a geometry shader named \"%s\"" ), 
01404                         geomFile );
01405         #else
01406             std::cerr << "ERROR: Could not load a geometry shader named \"" 
01407                         << geomFile << "\"!\n";
01408         #endif
01409             delete obj;
01410             delete vertShader;
01411             delete geomShader;
01412             delete fragShader;
01413             return NULL;
01414         }
01415 #ifdef TAPs_DEBUG_MODE
01416     #ifdef TAPs_USE_WXWIDGETS
01417         wxLogWarning( wxT( " is successful!" ) );
01418     #else
01419         std::cout << " is successful!\n";
01420     #endif
01421 #endif
01422     }
01423     //*/
01424     //----------------------------------------------------------------
01425     // Load fragment shader
01426     //*
01427     if ( !LoadFragmentShaderFromFile( fragShader, fragFile ) ) {
01428         delete obj;
01429         delete vertShader;
01430         delete geomShader;
01431         delete fragShader;
01432         return NULL;
01433     }
01434     //*/
01435     /*
01436     if ( fragFile ) {
01437 #ifdef TAPs_DEBUG_MODE
01438     #ifdef TAPs_USE_WXWIDGETS
01439         wxLogWarning( wxT( "Load fragment shader \"%s\"" ), fragFile );
01440     #else
01441         std::cout << "Load fragment shader \"" << fragFile << "\"";
01442     #endif
01443 #endif
01444         if ( fragShader->Load( fragFile ) ) {
01445         #ifdef TAPs_USE_WXWIDGETS
01446             wxLogError( wxT( "ERROR: Could not load a fragment shader named \"%s\"" ), 
01447                         fragFile );
01448         #else
01449             std::cerr << "ERROR: Could not load a fragment shader named \"" 
01450                         << fragFile << "\"!\n";
01451         #endif
01452             delete obj;
01453             delete vertShader;
01454             delete geomShader;
01455             delete fragShader;
01456             return NULL;
01457         }
01458 #ifdef TAPs_DEBUG_MODE
01459     #ifdef TAPs_USE_WXWIDGETS
01460         wxLogWarning( wxT( " is successful!" ) );
01461     #else
01462         std::cout << " is successful!\n";
01463     #endif
01464 #endif
01465     }
01466     //*/
01467     //----------------------------------------------------------------
01468     // Compile vertex program
01469     //*
01470     if ( !CompileVertexShaderFromFile( vertShader, vertFile ) ) {
01471         delete obj;
01472         delete vertShader;
01473         delete geomShader;
01474         delete fragShader;
01475         return NULL;
01476     }
01477     //*/
01478     /*
01479     if ( vertFile ) {
01480 #ifdef TAPs_DEBUG_MODE
01481     #ifdef TAPs_USE_WXWIDGETS
01482         wxLogWarning( wxT( "Compile vertex program \"%s\"" ), vertFile );
01483     #else
01484         std::cout << "Compile vertex program \"" << vertFile << "\"";
01485     #endif
01486 #endif
01487         if ( !vertShader->Compile() ) {
01488         #ifdef TAPs_USE_WXWIDGETS
01489             wxLogError( wxT( "ERROR: \"%s\" Compilation Error:" ), vertFile );
01490             wxLogError( wxT( "%s" ), vertShader->GetCompilerLog() );
01491         #else
01492             std::cerr << "ERROR: \"" << vertFile << "\" Compilation Error:\n";
01493             std::cerr << vertShader->GetCompilerLog() << "\n";
01494         #endif
01495             delete obj;
01496             delete vertShader;
01497             delete geomShader;
01498             delete fragShader;
01499             return NULL;
01500         }
01501 #ifdef TAPs_DEBUG_MODE
01502     #ifdef TAPs_USE_WXWIDGETS
01503         wxLogWarning( wxT( " is successful!" ) );
01504     #else
01505         std::cout << " is successful!\n";
01506     #endif
01507 #endif
01508     }
01509     //*/
01510     //----------------------------------------------------------------
01511     // Compile geometry program
01512     //*
01513     if ( !CompileGeometryShaderFromFile( geomShader, geomFile ) ) {
01514         delete obj;
01515         delete vertShader;
01516         delete geomShader;
01517         delete fragShader;
01518         return NULL;
01519     }
01520     //*/
01521     /*
01522     if ( geomFile ) {
01523 #ifdef TAPs_DEBUG_MODE
01524     #ifdef TAPs_USE_WXWIDGETS
01525         wxLogWarning( wxT( "Compile geometry program \"%s\"" ), geomFile );
01526     #else
01527         std::cout << "Compile geometry program \"" << geomFile << "\"";
01528     #endif
01529 #endif
01530         if ( !geomShader->Compile() ) {
01531         #ifdef TAPs_USE_WXWIDGETS
01532             wxLogError( wxT( "ERROR: \"%s\" Compilation Error:" ), geomFile );
01533             wxLogError( wxT( "%s" ), geomShader->GetCompilerLog() );
01534         #else
01535             std::cerr << "ERROR: \"" << geomFile << "\" Compilation Error:\n";
01536             std::cerr << geomShader->GetCompilerLog() << "\n";
01537         #endif
01538             delete obj;
01539             delete vertShader;
01540             delete geomShader;
01541             delete fragShader;
01542             return NULL;
01543         }
01544 #ifdef TAPs_DEBUG_MODE
01545     #ifdef TAPs_USE_WXWIDGETS
01546         wxLogWarning( wxT( " is successful!" ) );
01547     #else
01548         std::cout << " is successful!\n";
01549     #endif
01550 #endif
01551     }
01552     //*/
01553     //----------------------------------------------------------------
01554     // Compile fragment program
01555     //*
01556     if ( !CompileFragmentShaderFromFile( fragShader, fragFile ) ) {
01557         delete obj;
01558         delete vertShader;
01559         delete geomShader;
01560         delete fragShader;
01561         return NULL;
01562     }
01563     //*/
01564     /*
01565     if ( fragFile ) {
01566 #ifdef TAPs_DEBUG_MODE
01567     #ifdef TAPs_USE_WXWIDGETS
01568         wxLogWarning( wxT( "Compile fragment program \"%s\"" ), fragFile );
01569     #else
01570         std::cout << "Compile fragment program \"" << fragFile << "\"";
01571     #endif
01572 #endif
01573         if ( !fragShader->Compile() ) {
01574         #ifdef TAPs_USE_WXWIDGETS
01575             wxLogError( wxT( "ERROR: \"%s\" Compilation Error:" ), fragFile );
01576             wxLogError( wxT( "%s" ), fragShader->GetCompilerLog() );
01577         #else
01578             std::cerr << "ERROR: \"" << fragFile << "\" Compilation Error:\n";
01579             std::cerr << fragShader->GetCompilerLog() << "\n";
01580         #endif
01581             delete obj;
01582             delete vertShader;
01583             delete geomShader;
01584             delete fragShader;
01585             return NULL;
01586         }
01587 #ifdef TAPs_DEBUG_MODE
01588     #ifdef TAPs_USE_WXWIDGETS
01589         wxLogWarning( wxT( " is successful!" ) );
01590     #else
01591         std::cout << " is successful!\n";
01592     #endif
01593 #endif
01594     }
01595     //*/
01596     //---------------------------------------------------------------
01597     // Add to the object
01598     if ( vertFile ) obj->AddShader( vertShader );
01599     if ( geomFile ) obj->AddShader( geomShader );
01600     if ( fragFile ) obj->AddShader( fragShader );
01601     //----------------------------------------------------------------
01602     // Link
01603     //*
01604     if ( !Link( obj ) ) {
01605         delete obj;
01606         delete vertShader;
01607         delete geomShader;
01608         delete fragShader;
01609         return NULL;
01610     }
01611     //*/
01612     /*
01613     if ( !obj->Link() ) {
01614     #ifdef TAPs_USE_WXWIDGETS
01615         wxLogError( wxT( "ERROR: Cound not link a shader object created from \"%s\", \"%s\", and \"%s\"" ), 
01616                     vertFile, geomFile, fragFile );
01617         wxLogError( wxT( "%s" ), obj->GetLinkerLog() );
01618     #else
01619         std::cerr << "ERROR: Cound not link a shader object created from "
01620             << "\"" << vertFile << "\"," << "\"" << vertFile << "\", and \"" << fragFile << "\"\n";
01621         std::cerr << obj->GetLinkerLog() << "\n";
01622     #endif
01623         delete obj;
01624         delete vertShader;
01625         delete geomShader;
01626         delete fragShader;
01627         return NULL;
01628     }
01629     //*/
01630     //----------------------------------------------------------------
01631     m_vProgramObjectList.push_back( obj );
01632     obj->MemageMemory();
01633     //----------------------------------------------------------------
01634     return obj;
01635 } // END: GLSLProgramObject * GLSLShaderManager::LoadVertexGeometryAndFragmentShadersFromFile ( char * vertFile, char * geomFile, char * fragFile )
01636 
01637 
01638 //-----------------------------------------------------------------------------
01639 // Load vertex/fragment shader from file
01640 GLSLProgramObject * GLSLShaderManager::LoadFromFile ( char * vertFile, char * fragFile )
01641 {
01642     GLSLProgramObject   * obj           = new GLSLProgramObject();
01643     GLSLVertexShader    * vertShader    = new GLSLVertexShader();
01644     GLSLFragmentShader  * fragShader    = new GLSLFragmentShader();
01645     //----------------------------------------------------------------
01646     // Load vertex program
01647     //*
01648     if ( !LoadVertexShaderFromFile( vertShader, vertFile ) ) {
01649         delete obj;
01650         delete vertShader;
01651         delete fragShader;
01652         return NULL;
01653     }
01654     //*/
01655     /*
01656     if ( vertFile ) {
01657 #ifdef TAPs_DEBUG_MODE
01658     #ifdef TAPs_USE_WXWIDGETS
01659         wxLogWarning( wxT( "Load vertex program \"%s\"" ), vertFile );
01660     #else
01661         std::cout << "Load vertex program \"" << vertFile << "\"";
01662     #endif
01663 #endif
01664         if ( vertShader->Load( vertFile ) ) {
01665         #ifdef TAPs_USE_WXWIDGETS
01666             wxLogError( wxT( "ERROR: Could not load a vertex shader named \"%s\"" ), 
01667                         vertFile );
01668         #else
01669             std::cerr << "ERROR: Could not load a vertex shader named \"" 
01670                         << vertFile << "\"!\n";
01671         #endif
01672             delete obj;
01673             delete vertShader;
01674             delete fragShader;
01675             return NULL;
01676         }
01677 #ifdef TAPs_DEBUG_MODE
01678     #ifdef TAPs_USE_WXWIDGETS
01679         wxLogWarning( wxT( " is successful!" ) );
01680     #else
01681         std::cout << " is successful!\n";
01682     #endif
01683 #endif
01684     }
01685     //*/
01686     //----------------------------------------------------------------
01687     // Load fragment program
01688     //*
01689     if ( !LoadFragmentShaderFromFile( fragShader, fragFile ) ) {
01690         delete obj;
01691         delete vertShader;
01692         delete fragShader;
01693         return NULL;
01694     }
01695     //*/
01696     /*
01697     if ( fragFile ) {
01698 #ifdef TAPs_DEBUG_MODE
01699     #ifdef TAPs_USE_WXWIDGETS
01700         wxLogWarning( wxT( "Load fragment program \"%s\"" ), fragFile );
01701     #else
01702         std::cout << "Load fragment program \"" << fragFile << "\"";
01703     #endif
01704 #endif
01705         if ( fragShader->Load( fragFile ) ) {
01706         #ifdef TAPs_USE_WXWIDGETS
01707             wxLogError( wxT( "ERROR: Could not load a fragment shader named \"%s\"" ), 
01708                         fragFile );
01709         #else
01710             std::cerr << "ERROR: Could not load a fragment shader named \"" 
01711                         << fragFile << "\"!\n";
01712         #endif
01713             delete obj;
01714             delete vertShader;
01715             delete fragShader;
01716             return NULL;
01717         }
01718 #ifdef TAPs_DEBUG_MODE
01719     #ifdef TAPs_USE_WXWIDGETS
01720         wxLogWarning( wxT( " is successful!" ) );
01721     #else
01722         std::cout << " is successful!\n";
01723     #endif
01724 #endif
01725     }
01726     //*/
01727     //----------------------------------------------------------------
01728     // Compile vertex program
01729     //*
01730     if ( !CompileVertexShaderFromFile( vertShader, vertFile ) ) {
01731         delete obj;
01732         delete vertShader;
01733         delete fragShader;
01734         return NULL;
01735     }
01736     //*/
01737     /*
01738     if ( vertFile ) {
01739 #ifdef TAPs_DEBUG_MODE
01740     #ifdef TAPs_USE_WXWIDGETS
01741         wxLogWarning( wxT( "Compile vertex program \"%s\"" ), vertFile );
01742     #else
01743         std::cout << "Compile vertex program \"" << vertFile << "\"";
01744     #endif
01745 #endif
01746         if ( !vertShader->Compile() ) {
01747         #ifdef TAPs_USE_WXWIDGETS
01748             wxLogError( wxT( "ERROR: \"%s\" Compilation Error:" ), vertFile );
01749             wxLogError( wxT( "%s" ), vertShader->GetCompilerLog() );
01750         #else
01751             std::cerr << "ERROR: \"" << vertFile << "\" Compilation Error:\n";
01752             std::cerr << vertShader->GetCompilerLog() << "\n";
01753         #endif
01754             delete obj;
01755             delete vertShader;
01756             delete fragShader;
01757             return NULL;
01758         }
01759 #ifdef TAPs_DEBUG_MODE
01760     #ifdef TAPs_USE_WXWIDGETS
01761         wxLogWarning( wxT( " is successful!" ) );
01762     #else
01763         std::cout << " is successful!\n";
01764     #endif
01765 #endif
01766     }
01767     //*/
01768     //----------------------------------------------------------------
01769     // Compile fragment program
01770     //*
01771     if ( !CompileFragmentShaderFromFile( fragShader, fragFile ) ) {
01772         delete obj;
01773         delete vertShader;
01774         delete fragShader;
01775         return NULL;
01776     }
01777     //*/
01778     /*
01779     if ( fragFile ) {
01780 #ifdef TAPs_DEBUG_MODE
01781     #ifdef TAPs_USE_WXWIDGETS
01782         wxLogWarning( wxT( "Compile fragment program \"%s\"" ), fragFile );
01783     #else
01784         std::cout << "Compile fragment program \"" << fragFile << "\"";
01785     #endif
01786 #endif
01787         if ( !fragShader->Compile() ) {
01788         #ifdef TAPs_USE_WXWIDGETS
01789             wxLogError( wxT( "ERROR: \"%s\" Compilation Error:" ), fragFile );
01790             wxLogError( wxT( "%s" ), fragShader->GetCompilerLog() );
01791         #else
01792             std::cerr << "ERROR: \"" << fragFile << "\" Compilation Error:\n";
01793             std::cerr << fragShader->GetCompilerLog() << "\n";
01794         #endif
01795             delete obj;
01796             delete vertShader;
01797             delete fragShader;
01798             return NULL;
01799         }
01800 #ifdef TAPs_DEBUG_MODE
01801     #ifdef TAPs_USE_WXWIDGETS
01802         wxLogWarning( wxT( " is successful!" ) );
01803     #else
01804         std::cout << " is successful!\n";
01805     #endif
01806 #endif
01807     }
01808     //*/
01809     //---------------------------------------------------------------
01810     // Add to the object
01811     if ( vertFile ) obj->AddShader( vertShader );
01812     if ( fragFile ) obj->AddShader( fragShader );
01813     //----------------------------------------------------------------
01814     // Link
01815     //*
01816     if ( !Link( obj ) ) {
01817         delete obj;
01818         delete vertShader;
01819         delete fragShader;
01820         return NULL;
01821     }
01822     //*/
01823     /*
01824     if ( !obj->Link() ) {
01825     #ifdef TAPs_USE_WXWIDGETS
01826         wxLogError( wxT( "ERROR: Cound not link a shader object created from \"%s\" and \"%s\"" ), 
01827                     vertFile, fragFile );
01828         wxLogError( wxT( "%s" ), obj->GetLinkerLog() );
01829     #else
01830         std::cerr << "ERROR: Cound not link a shader object created from \""
01831                 << vertFile << "\" and \"" << fragFile << "\"\n";
01832         std::cerr << obj->GetLinkerLog() << "\n";
01833     #endif
01834         delete obj;
01835         delete vertShader;
01836         delete fragShader;
01837         return NULL;
01838     }
01839     //*/
01840     //----------------------------------------------------------------
01841     m_vProgramObjectList.push_back( obj );
01842     obj->MemageMemory();
01843     //----------------------------------------------------------------
01844     return obj;
01845 } // END: GLSLProgramObject * GLSLShaderManager::LoadFromFile ( char * vertFile, char * fragFile )
01846 
01847 
01848 //-----------------------------------------------------------------------------
01849 // Load only a vertex shader from file
01850 GLSLProgramObject * GLSLShaderManager::LoadOnlyAVertexShaderFromFile ( char * vertFile )
01851 {
01852     GLSLProgramObject   * obj           = new GLSLProgramObject();
01853     GLSLVertexShader    * vertShader    = new GLSLVertexShader();
01854     //----------------------------------------------------------------
01855     // Load vertex program
01856     if ( vertFile ) {
01857 #ifdef TAPs_DEBUG_MODE
01858     #ifdef TAPs_USE_WXWIDGETS
01859         wxLogWarning( wxT( "Load vertex program \"%s\"" ), vertFile );
01860     #else
01861         std::cout << "Load vertex program \"" << vertFile << "\"";
01862     #endif
01863 #endif
01864         if ( vertShader->Load( vertFile ) ) {
01865         #ifdef TAPs_USE_WXWIDGETS
01866             wxLogError( wxT( "ERROR: Could not load a vertex shader named \"%s\"" ), 
01867                         vertFile );
01868         #else
01869             std::cerr << "ERROR: Could not load a vertex shader named \"" 
01870                         << vertFile << "\"!\n";
01871         #endif
01872             delete obj;
01873             delete vertShader;
01874             return NULL;
01875         }
01876 #ifdef TAPs_DEBUG_MODE
01877     #ifdef TAPs_USE_WXWIDGETS
01878         wxLogWarning( wxT( " is successful!" ) );
01879     #else
01880         std::cout << " is successful!\n";
01881     #endif
01882 #endif
01883     }
01884     //----------------------------------------------------------------
01885     // Compile vertex program
01886     if ( vertFile ) {
01887 #ifdef TAPs_DEBUG_MODE
01888     #ifdef TAPs_USE_WXWIDGETS
01889         wxLogWarning( wxT( "Compile vertex program \"%s\"" ), vertFile );
01890     #else
01891         std::cout << "Compile vertex program \"" << vertFile << "\"";
01892     #endif
01893 #endif
01894         if ( !vertShader->Compile() ) {
01895         #ifdef TAPs_USE_WXWIDGETS
01896             wxLogError( wxT( "ERROR: \"%s\" Compilation Error:" ), vertFile );
01897             wxLogError( wxT( "%s" ), vertShader->GetCompilerLog() );
01898         #else
01899             std::cerr << "ERROR: \"" << vertFile << "\" Compilation Error:\n";
01900             std::cerr << vertShader->GetCompilerLog() << "\n";
01901         #endif
01902             delete obj;
01903             delete vertShader;
01904             return NULL;
01905         }
01906 #ifdef TAPs_DEBUG_MODE
01907     #ifdef TAPs_USE_WXWIDGETS
01908         wxLogWarning( wxT( " is successful!" ) );
01909     #else
01910         std::cout << " is successful!\n";
01911     #endif
01912 #endif
01913     }
01914     //---------------------------------------------------------------
01915     // Add to the object
01916     if ( vertFile ) obj->AddShader( vertShader );
01917     //----------------------------------------------------------------
01918     // Link
01919     if ( !obj->Link() ) {
01920     #ifdef TAPs_USE_WXWIDGETS
01921         wxLogError( wxT( "ERROR: Cound not link a shader object created from \"%s\"!" ), vertFile );
01922         wxLogError( wxT( "%s" ), obj->GetLinkerLog() );
01923     #else
01924         std::cerr << "ERROR: Cound not link a shader object created from \""
01925                 << vertFile << "\"\n";
01926         std::cerr << obj->GetLinkerLog() << "\n";
01927     #endif
01928         delete obj;
01929         delete vertShader;
01930         return NULL;
01931     }
01932     //----------------------------------------------------------------
01933     m_vProgramObjectList.push_back( obj );
01934     obj->MemageMemory();
01935     //----------------------------------------------------------------
01936     return obj;
01937 } // END: GLSLProgramObject * GLSLShaderManager::LoadOnlyAVertexShaderFromFile ( char * vertFile )
01938 
01939 
01940 
01941 //-----------------------------------------------------------------------------
01942 // Load only a geometry shader from file
01943 GLSLProgramObject * GLSLShaderManager::LoadOnlyAGeometryShaderFromFile ( char * geomFile )
01944 {
01945     GLSLProgramObject   * obj           = new GLSLProgramObject();
01946     GLSLGeometryShader  * geomShader    = new GLSLGeometryShader();
01947     //----------------------------------------------------------------
01948     // Load geometry shader
01949     if ( geomFile ) {
01950 #ifdef TAPs_DEBUG_MODE
01951     #ifdef TAPs_USE_WXWIDGETS
01952         wxLogWarning( wxT( "Load geometry shader \"%s\"" ), geomFile );
01953     #else
01954         std::cout << "Load geometry shader \"" << geomFile << "\"";
01955     #endif
01956 #endif
01957         if ( geomShader->Load( geomFile ) ) {
01958         #ifdef TAPs_USE_WXWIDGETS
01959             wxLogError( wxT( "ERROR: Could not load a geometry shader named \"%s\"" ), 
01960                         geomFile );
01961         #else
01962             std::cerr << "ERROR: Could not load a geometry shader named \"" 
01963                         << geomFile << "\"!\n";
01964         #endif
01965             delete obj;
01966             delete geomShader;
01967             return NULL;
01968         }
01969 #ifdef TAPs_DEBUG_MODE
01970     #ifdef TAPs_USE_WXWIDGETS
01971         wxLogWarning( wxT( " is successful!" ) );
01972     #else
01973         std::cout << " is successful!\n";
01974     #endif
01975 #endif
01976     }
01977     //----------------------------------------------------------------
01978     // Compile geometry shader
01979     if ( geomFile ) {
01980 #ifdef TAPs_DEBUG_MODE
01981     #ifdef TAPs_USE_WXWIDGETS
01982         wxLogWarning( wxT( "Compile geometry shader \"%s\"" ), geomFile );
01983     #else
01984         std::cout << "Compile geometry shader \"" << geomFile << "\"";
01985     #endif
01986 #endif
01987         if ( !geomShader->Compile() ) {
01988         #ifdef TAPs_USE_WXWIDGETS
01989             wxLogError( wxT( "ERROR: \"%s\" Compilation Error:" ), geomFile );
01990             wxLogError( wxT( "%s" ), geomShader->GetCompilerLog() );
01991         #else
01992             std::cerr << "ERROR: \"" << geomFile << "\" Compilation Error:\n";
01993             std::cerr << geomShader->GetCompilerLog() << "\n";
01994         #endif
01995             delete obj;
01996             delete geomShader;
01997             return NULL;
01998         }
01999 #ifdef TAPs_DEBUG_MODE
02000     #ifdef TAPs_USE_WXWIDGETS
02001         wxLogWarning( wxT( " is successful!" ) );
02002     #else
02003         std::cout << " is successful!\n";
02004     #endif
02005 #endif
02006     }
02007     //---------------------------------------------------------------
02008     // Add to the object
02009     if ( geomFile ) obj->AddShader( geomShader );
02010     //----------------------------------------------------------------
02011     // Link
02012     if ( !obj->Link() ) {
02013     #ifdef TAPs_USE_WXWIDGETS
02014         wxLogError( wxT( "ERROR: Cound not link a shader object created from \"%s\"!" ), geomFile );
02015         wxLogError( wxT( "%s" ), obj->GetLinkerLog() );
02016     #else
02017         std::cerr << "ERROR: Cound not link a shader object created from \""
02018                 << geomFile << "\"\n";
02019         std::cerr << obj->GetLinkerLog() << "\n";
02020     #endif
02021         delete obj;
02022         delete geomShader;
02023         return NULL;
02024     }
02025     //----------------------------------------------------------------
02026     m_vProgramObjectList.push_back( obj );
02027     obj->MemageMemory();
02028     //----------------------------------------------------------------
02029     return obj;
02030 } // END: GLSLProgramObject * GLSLShaderManager::LoadOnlyAGeometryShaderFromFile ( char * geomFile )
02031 
02032 
02033 //-----------------------------------------------------------------------------
02034 // Load only a fragment shader from file
02035 GLSLProgramObject * GLSLShaderManager::LoadOnlyAFragmentShaderFromFile ( char * fragFile )
02036 {
02037     GLSLProgramObject   * obj           = new GLSLProgramObject();
02038     GLSLFragmentShader  * fragShader    = new GLSLFragmentShader();
02039     //----------------------------------------------------------------
02040     // Load fragment shader
02041     if ( fragFile ) {
02042 #ifdef TAPs_DEBUG_MODE
02043     #ifdef TAPs_USE_WXWIDGETS
02044         wxLogWarning( wxT( "Load fragment shader \"%s\"" ), fragFile );
02045     #else
02046         std::cout << "Load fragment shader \"" << fragFile << "\"";
02047     #endif
02048 #endif
02049         if ( fragShader->Load( fragFile ) ) {
02050         #ifdef TAPs_USE_WXWIDGETS
02051             wxLogError( wxT( "ERROR: Could not load a fragment shader named \"%s\"" ), 
02052                         fragFile );
02053         #else
02054             std::cerr << "ERROR: Could not load a fragment shader named \"" 
02055                         << fragFile << "\"!\n";
02056         #endif
02057             delete obj;
02058             delete fragShader;
02059             return NULL;
02060         }
02061 #ifdef TAPs_DEBUG_MODE
02062     #ifdef TAPs_USE_WXWIDGETS
02063         wxLogWarning( wxT( " is successful!" ) );
02064     #else
02065         std::cout << " is successful!\n";
02066     #endif
02067 #endif
02068     }
02069     //----------------------------------------------------------------
02070     // Compile fragment shader
02071     if ( fragFile ) {
02072 #ifdef TAPs_DEBUG_MODE
02073     #ifdef TAPs_USE_WXWIDGETS
02074         wxLogWarning( wxT( "Compile fragment shader \"%s\"" ), fragFile );
02075     #else
02076         std::cout << "Compile fragment shader \"" << fragFile << "\"";
02077     #endif
02078 #endif
02079         if ( !fragShader->Compile() ) {
02080         #ifdef TAPs_USE_WXWIDGETS
02081             wxLogError( wxT( "ERROR: \"%s\" Compilation Error:" ), fragFile );
02082             wxLogError( wxT( "%s" ), fragShader->GetCompilerLog() );
02083         #else
02084             std::cerr << "ERROR: \"" << fragFile << "\" Compilation Error:\n";
02085             std::cerr << fragShader->GetCompilerLog() << "\n";
02086         #endif
02087             delete obj;
02088             delete fragShader;
02089             return NULL;
02090         }
02091 #ifdef TAPs_DEBUG_MODE
02092     #ifdef TAPs_USE_WXWIDGETS
02093         wxLogWarning( wxT( " is successful!" ) );
02094     #else
02095         std::cout << " is successful!\n";
02096     #endif
02097 #endif
02098     }
02099     //---------------------------------------------------------------
02100     // Add to the object
02101     if ( fragFile ) obj->AddShader( fragShader );
02102     //----------------------------------------------------------------
02103     // Link
02104     if ( !obj->Link() ) {
02105     #ifdef TAPs_USE_WXWIDGETS
02106         wxLogError( wxT( "ERROR: Cound not link a shader object created from \"%s\"!" ), fragFile );
02107         wxLogError( wxT( "%s" ), obj->GetLinkerLog() );
02108     #else
02109         std::cerr << "ERROR: Cound not link a shader object created from \""
02110                   << fragFile << "\"\n";
02111         std::cerr << obj->GetLinkerLog() << "\n";
02112     #endif
02113         delete obj;
02114         delete fragShader;
02115         return NULL;
02116     }
02117     //----------------------------------------------------------------
02118     m_vProgramObjectList.push_back( obj );
02119     obj->MemageMemory();
02120     //----------------------------------------------------------------
02121     return obj;
02122 } // END: GLSLProgramObject * GLSLShaderManager::LoadOnlyAFragmentShaderFromFile ( char * fragFile )
02123 //-----------------------------------------------------------------------------
02124 // Load vertex/fragment shader from memory
02125 GLSLProgramObject * GLSLShaderManager::LoadFromMemory ( const char *vertMem, const char *fragMem )
02126 {
02127     GLSLProgramObject   *obj        = new GLSLProgramObject();
02128     GLSLVertexShader    *vertShader = new GLSLVertexShader;
02129     GLSLFragmentShader  *fragShader = new GLSLFragmentShader;
02130     //----------------------------------------------------------------
02131     // Load vertex program
02132     if ( vertMem ) {
02133         vertShader->LoadFromMemory( vertMem );
02134     }
02135     //----------------------------------------------------------------
02136     // Load fragment program
02137     if ( fragMem ) {
02138         fragShader->LoadFromMemory( fragMem );
02139     }
02140     //----------------------------------------------------------------
02141     // Compile vertex program
02142     if ( vertMem ) {
02143         if ( !vertShader->Compile() ) {
02144         #ifdef TAPs_USE_WXWIDGETS
02145             wxLogError( wxT( "ERROR: \"%s\" Compilation Error:" ), 
02146                         vertMem );
02147             wxLogError( wxT( "%s" ), vertShader->GetCompilerLog() );
02148         #else
02149             std::cerr << "ERROR: \"" << vertMem << "\" Compilation Error:\n";
02150             std::cerr << vertShader->GetCompilerLog() << "\n";
02151         #endif
02152             delete obj;
02153             delete vertShader;
02154             delete fragShader;
02155             return NULL;
02156         }
02157     }
02158     //----------------------------------------------------------------
02159     // Compile fragment program
02160     if ( fragMem ) {
02161         if ( !fragShader->Compile() ) {
02162         #ifdef TAPs_USE_WXWIDGETS
02163             wxLogError( wxT( "ERROR: \"%s\" Compilation Error:" ), 
02164                         fragMem );
02165             wxLogError( wxT( "%s" ), fragShader->GetCompilerLog() );
02166         #else
02167             std::cerr << "ERROR: \"" << fragMem << "\" Compilation Error:\n";
02168             std::cerr << fragShader->GetCompilerLog() << "\n";
02169         #endif
02170             delete obj;
02171             delete vertShader;
02172             delete fragShader;
02173             return NULL;
02174         }
02175     }
02176     //----------------------------------------------------------------
02177     // Add to the object
02178     if ( vertMem )  obj->AddShader( vertShader );
02179     if ( fragMem )  obj->AddShader( fragShader );
02180     //----------------------------------------------------------------
02181     // Link
02182     if ( !obj->Link() ) {
02183     #ifdef TAPs_USE_WXWIDGETS
02184         wxLogError( wxT( "ERROR: Cound not link a shader object created from \"%s\" and \"%s\"" ), 
02185                     vertMem, fragMem );
02186         wxLogError( wxT( "%s" ), obj->GetLinkerLog() );
02187     #else
02188         std::cerr << "ERROR: Cound not link a shader object created from \""
02189                 << vertMem << "\"\n and \"\n" << fragMem << "\"\n";
02190         std::cerr << obj->GetLinkerLog() << "\n";
02191     #endif
02192         delete obj;
02193         delete vertShader;
02194         delete fragShader;
02195         return NULL;
02196     }
02197     //----------------------------------------------------------------
02198     m_vProgramObjectList.push_back( obj );
02199     obj->MemageMemory();
02200     //----------------------------------------------------------------
02201     return obj;
02202 } // END: GLSLProgramObject * GLSLShaderManager::LoadFromMemory ( const char *vertMem, const char *fragMem )
02203 //-----------------------------------------------------------------------------
02204 // Delete all shader objects
02205 bool GLSLShaderManager::Delete ( GLSLProgramObject *obj )
02206 {
02207     std::vector<GLSLProgramObject *>::iterator pos;
02208     for ( pos = m_vProgramObjectList.begin(); pos != m_vProgramObjectList.end(); ++pos ) {
02209         if ( *pos == obj ) {
02210             m_vProgramObjectList.erase( pos );
02211             delete obj;
02212             obj = NULL;
02213             return true;
02214         }
02215     }
02216     return false;
02217 } // END: bool GLSLShaderManager::Delete ( GLSLProgramObject *obj )
02218 //-----------------------------------------------------------------------------
02219 // Load a vertex shader from file
02220 bool GLSLShaderManager::LoadVertexShaderFromFile ( 
02221     GLSLVertexShader * vertShader, const char * vertFile )
02222 {
02223     //----------------------------------------------------------------
02224     // Load vertex shader
02225     if ( vertFile ) {
02226 #ifdef TAPs_DEBUG_MODE
02227     #ifdef TAPs_USE_WXWIDGETS
02228         wxLogWarning( wxT( "Load vertex shader \"%s\"" ), vertFile );
02229     #else
02230         std::cout << "Load vertex shader \"" << vertFile << "\"";
02231     #endif
02232 #endif
02233         if ( vertShader->Load( vertFile ) ) {
02234         #ifdef TAPs_USE_WXWIDGETS
02235             wxLogError( wxT( "ERROR: Could not load a vertex shader named \"%s\"" ), 
02236                         vertFile );
02237         #else
02238             std::cerr << "ERROR: Could not load a vertex shader named \"" 
02239                         << vertFile << "\"!\n";
02240         #endif
02241             return false;
02242         }
02243 #ifdef TAPs_DEBUG_MODE
02244     #ifdef TAPs_USE_WXWIDGETS
02245         wxLogWarning( wxT( " is successful!" ) );
02246     #else
02247         std::cout << " is successful!\n";
02248     #endif
02249 #endif
02250         return true;
02251     }
02252     return false;
02253 } // END: bool LoadVertexShaderFromFile ( GLSLVertexShader * vertShader, const char * vertFile );
02254 //-----------------------------------------------------------------------------
02255 // Load a geometry shader from file
02256 bool GLSLShaderManager::LoadGeometryShaderFromFile ( 
02257     GLSLGeometryShader * geomShader, const char * geomFile )
02258 {
02259     //----------------------------------------------------------------
02260     // Load geometry shader
02261     if ( geomFile ) {
02262 #ifdef TAPs_DEBUG_MODE
02263     #ifdef TAPs_USE_WXWIDGETS
02264         wxLogWarning( wxT( "Load geometry shader \"%s\"" ), geomFile );
02265     #else
02266         std::cout << "Load geometry shader \"" << geomFile << "\"";
02267     #endif
02268 #endif
02269         if ( geomShader->Load( geomFile ) ) {
02270         #ifdef TAPs_USE_WXWIDGETS
02271             wxLogError( wxT( "ERROR: Could not load a geometry shader named \"%s\"" ), 
02272                         geomFile );
02273         #else
02274             std::cerr << "ERROR: Could not load a geometry shader named \"" 
02275                         << geomFile << "\"!\n";
02276         #endif
02277             return false;
02278         }
02279 #ifdef TAPs_DEBUG_MODE
02280     #ifdef TAPs_USE_WXWIDGETS
02281         wxLogWarning( wxT( " is successful!" ) );
02282     #else
02283         std::cout << " is successful!\n";
02284     #endif
02285 #endif
02286         return true;
02287     }
02288     return false;
02289 } // END: bool LoadGeometryShaderFromFile ( GLSLGeometryShader * geomShader, const char * geomFile );
02290 //-----------------------------------------------------------------------------
02291 // Load a fragment shader from file
02292 bool GLSLShaderManager::LoadFragmentShaderFromFile ( 
02293     GLSLFragmentShader * fragShader, const char * fragFile )
02294 {
02295     //----------------------------------------------------------------
02296     // Load fragment shader
02297     if ( fragFile ) {
02298 #ifdef TAPs_DEBUG_MODE
02299     #ifdef TAPs_USE_WXWIDGETS
02300         wxLogWarning( wxT( "Load fragment shader \"%s\"" ), fragFile );
02301     #else
02302         std::cout << "Load fragment shader \"" << fragFile << "\"";
02303     #endif
02304 #endif
02305         if ( fragShader->Load( fragFile ) ) {
02306         #ifdef TAPs_USE_WXWIDGETS
02307             wxLogError( wxT( "ERROR: Could not load a fragment shader named \"%s\"" ), 
02308                         fragFile );
02309         #else
02310             std::cerr << "ERROR: Could not load a fragment shader named \"" 
02311                         << fragFile << "\"!\n";
02312         #endif
02313             return false;
02314         }
02315 #ifdef TAPs_DEBUG_MODE
02316     #ifdef TAPs_USE_WXWIDGETS
02317         wxLogWarning( wxT( " is successful!" ) );
02318     #else
02319         std::cout << " is successful!\n";
02320     #endif
02321 #endif
02322         return true;
02323     }
02324     return false;
02325 } // END: bool LoadFragmentShaderFromFile ( GLSLFragmentShader * fragShader, const char * fragFile );
02326 //-----------------------------------------------------------------------------
02327 // Load a vertex shader from file
02328 bool GLSLShaderManager::CompileVertexShaderFromFile ( 
02329     GLSLVertexShader * vertShader, const char * vertFile )
02330 {
02331     //----------------------------------------------------------------
02332     // Compile vertex program
02333     if ( vertFile ) {
02334 
02335         #ifdef TAPs_DEBUG_MODE
02336             #ifdef TAPs_USE_WXWIDGETS
02337                 wxLogWarning( wxT( "Compile vertex program \"%s\"" ), vertFile );
02338             #else
02339                 std::cout << "Compile vertex program \"" << vertFile << "\"";
02340             #endif
02341         #endif
02342 
02343         if ( !vertShader->Compile() ) {
02344         #ifdef TAPs_USE_WXWIDGETS
02345             wxLogError( wxT( "ERROR: \"%s\" Compilation Error:" ), vertFile );
02346             wxLogError( wxT( "%s" ), vertShader->GetCompilerLog() );
02347         #else
02348             std::cerr << "ERROR: \"" << vertFile << "\" Compilation Error:\n";
02349             std::cerr << vertShader->GetCompilerLog() << "\n";
02350         #endif
02351             return false;
02352         }
02353 
02354         #ifdef TAPs_DEBUG_MODE
02355             #ifdef TAPs_USE_WXWIDGETS
02356                 wxLogWarning( wxT( " is successful!" ) );
02357             #else
02358                 std::cout << " is successful!\n";
02359             #endif
02360         #endif
02361 
02362         return true;
02363     }
02364     return false;
02365 } // END: bool CompileVertexShaderFromFile ( GLSLVertexShader * vertShader, const char * vertFile );
02366 //-----------------------------------------------------------------------------
02367 // Load a fragment shader from file
02368 bool GLSLShaderManager::CompileGeometryShaderFromFile ( 
02369     GLSLGeometryShader * geomShader, const char * geomFile )
02370 {
02371     //----------------------------------------------------------------
02372     // Compile geometry program
02373     if ( geomFile ) {
02374 #ifdef TAPs_DEBUG_MODE
02375     #ifdef TAPs_USE_WXWIDGETS
02376         wxLogWarning( wxT( "Compile geometry program \"%s\"" ), geomFile );
02377     #else
02378         std::cout << "Compile geometry program \"" << geomFile << "\"";
02379     #endif
02380 #endif
02381         if ( !geomShader->Compile() ) {
02382         #ifdef TAPs_USE_WXWIDGETS
02383             wxLogError( wxT( "ERROR: \"%s\" Compilation Error:" ), geomFile );
02384             wxLogError( wxT( "%s" ), geomShader->GetCompilerLog() );
02385         #else
02386             std::cerr << "ERROR: \"" << geomFile << "\" Compilation Error:\n";
02387             std::cerr << geomShader->GetCompilerLog() << "\n";
02388         #endif
02389             return false;
02390         }
02391 #ifdef TAPs_DEBUG_MODE
02392     #ifdef TAPs_USE_WXWIDGETS
02393         wxLogWarning( wxT( " is successful!" ) );
02394     #else
02395         std::cout << " is successful!\n";
02396     #endif
02397 #endif
02398         return true;
02399     }
02400     return false;
02401 } // END: bool CompileGeometryShaderFromFile ( GLSLGeometyrShader * geomShader, const char * geomFile );
02402 //-----------------------------------------------------------------------------
02403 // Load a fragment shader from file
02404 bool GLSLShaderManager::CompileFragmentShaderFromFile ( 
02405     GLSLFragmentShader * fragShader, const char * fragFile )
02406 {
02407     //----------------------------------------------------------------
02408     // Compile fragment program
02409     if ( fragFile ) {
02410 #ifdef TAPs_DEBUG_MODE
02411     #ifdef TAPs_USE_WXWIDGETS
02412         wxLogWarning( wxT( "Compile fragment program \"%s\"" ), fragFile );
02413     #else
02414         std::cout << "Compile fragment program \"" << fragFile << "\"";
02415     #endif
02416 #endif
02417         if ( !fragShader->Compile() ) {
02418         #ifdef TAPs_USE_WXWIDGETS
02419             wxLogError( wxT( "ERROR: \"%s\" Compilation Error:" ), fragFile );
02420             wxLogError( wxT( "%s" ), fragShader->GetCompilerLog() );
02421         #else
02422             std::cerr << "ERROR: \"" << fragFile << "\" Compilation Error:\n";
02423             std::cerr << fragShader->GetCompilerLog() << "\n";
02424         #endif
02425             return false;
02426         }
02427 #ifdef TAPs_DEBUG_MODE
02428     #ifdef TAPs_USE_WXWIDGETS
02429         wxLogWarning( wxT( " is successful!" ) );
02430     #else
02431         std::cout << " is successful!\n";
02432     #endif
02433 #endif
02434         return true;
02435     }
02436     return false;
02437 } // END: bool CompileFragmentShaderFromFile ( GLSLFragmentShader * fragShader, const char * fragFile );
02438 //-----------------------------------------------------------------------------
02439 //=============================================================================
02440 //******************************************************************************
02441 
02442 //=============================================================================
02443 END_NAMESPACE_TAPs__OpenGL
02444 //345678901234567890123456789012345678901234567890123456789012345678901234567890
02445 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines