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