TAPs 0.7.7.3
TAPsGLSLShaderPool.cpp
Go to the documentation of this file.
00001 /******************************************************************************
00002 TAPsGLSLShaderPool.cpp
00003 
00004 GLSLShaderPool class (cpp file).
00005 
00006 SUKITTI PUNAK   (02/17/2009)
00007 ******************************************************************************/
00008 #include "TAPsGLSLShaderPool.hpp"
00009 // Using Inclusion Model (i.e. definitions are included in declarations)
00010 //                       (this name.cpp is included in name.hpp)
00011 // Each friend is defined directly inside its declaration.
00012 
00013 BEGIN_NAMESPACE_TAPs__OpenGL
00014 //=============================================================================
00015 // Constructors
00016 //-----------------------------------------------------------------------------
00017 GLSLShaderPool::GLSLShaderPool ()
00018 {}
00019 //-----------------------------------------------------------------------------
00020 //GLSLShaderPool::GLSLShaderPool ( GLSLShaderPool const &v )
00021 //{}
00022 //-----------------------------------------------------------------------------
00023 GLSLShaderPool::~GLSLShaderPool ()
00024 {
00025     Clear();
00026 }
00027 //-----------------------------------------------------------------------------
00028 bool GLSLShaderPool::Clear ()
00029 {
00030     // MORE CODING HERE!!!
00031     // Need to detach and delete shader programs and shader objects
00032     m_vProgramObjectList.clear();
00033     m_vVertexShaderList.clear();
00034     m_vGeometryShaderList.clear();
00035     m_vFragmentShaderList.clear();
00036 
00037     return true;
00038 }
00039 //-----------------------------------------------------------------------------
00040 std::string GLSLShaderPool::StrInfo () const
00041 {
00042     std::ostringstream ss;
00043     ss << "GLSLShaderPool: ";
00044     return ss.str();
00045 }
00046 //-----------------------------------------------------------------------------
00047 //=============================================================================
00048 // Assignment Operator
00049 //-----------------------------------------------------------------------------
00050 //inline GLSLShaderPool & GLSLShaderPool::operator= ( GLSLShaderPool const &v )
00051 //{ 
00052 //  return *this;
00053 //}
00054 
00055 //-----------------------------------------------------------------------------
00056 GLSLVertexShader * GLSLShaderPool::CreateVertexShaderFromFile   ( std::string const & vertFile )
00057 {
00058     if ( !vertFile.empty() ) {
00059         #ifdef TAPs_DEBUG_MODE
00060             #ifdef TAPs_USE_WXWIDGETS
00061                 wxLogWarning( wxT( "Load vertex shader \"%s\"" ), vertFile.c_str() );
00062             #else
00063                 std::cout << "Load vertex shader \"" << vertFile << "\"";
00064             #endif
00065         #endif
00066 
00067         GLSLVertexShader * vertShader = new GLSLVertexShader();
00068         if ( !vertShader ) {
00069             #ifdef TAPs_DEBUG_MODE
00070                 #ifdef TAPs_USE_WXWIDGETS
00071                     wxLogWarning( wxT( "ERROR: Could not create vertex shader \"%s\"" ), vertFile.c_str() );
00072                 #else
00073                     std::cout << "ERROR: Could not create vertex shader \"" << vertFile << "\"";
00074                 #endif
00075             #endif
00076             return NULL;
00077         }
00078 
00079         if ( vertShader->Load( vertFile.c_str() ) ) {
00080             #ifdef TAPs_USE_WXWIDGETS
00081                 wxLogError( wxT( "ERROR: Could not load a vertex shader named \"%s\"" ), vertFile );
00082             #else
00083                 std::cerr << "ERROR: Could not load a vertex shader named \"" << vertFile << "\"!\n";
00084             #endif
00085             return NULL;
00086         }
00087 
00088         if ( !vertShader->Compile() ) {
00089             #ifdef TAPs_DEBUG_MODE
00090                 #ifdef TAPs_USE_WXWIDGETS
00091                     wxLogError( wxT( "ERROR: \"%s\" Compilation Error:" ), vertFile.c_str() );
00092                     wxLogError( wxT( "%s" ), vertShader->GetCompilerLog() );
00093                 #else
00094                     std::cerr << "ERROR: \"" << vertFile << "\" Compilation Error:\n";
00095                     std::cerr << vertShader->GetCompilerLog() << "\n";
00096                 #endif
00097             #endif
00098             delete vertShader;
00099             return NULL;
00100         }
00101 
00102         #ifdef TAPs_DEBUG_MODE
00103             #ifdef TAPs_USE_WXWIDGETS
00104                 wxLogWarning( wxT( " is successful!" ) );
00105             #else
00106                 std::cout << " is successful!\n";
00107             #endif
00108         #endif
00109         // Add the vertex shader to the list
00110         m_vVertexShaderList.push_back( vertShader );
00111         return vertShader;
00112     }
00113     return NULL;
00114 } // END: GLSLVertexShader * GLSLShaderPool::CreateVertexShaderFromFile   ( std::string const & vertFile )
00115 //-----------------------------------------------------------------------------
00116 //-----------------------------------------------------------------------------
00117 GLSLGeometryShader * GLSLShaderPool::CreateGeometryShaderFromFile   ( std::string const & geomFile )
00118 {
00119     if ( !geomFile.empty() ) {
00120         #ifdef TAPs_DEBUG_MODE
00121             #ifdef TAPs_USE_WXWIDGETS
00122                 wxLogWarning( wxT( "Load geometry shader \"%s\"" ), geomFile.c_str() );
00123             #else
00124                 std::cout << "Load geometry shader \"" << geomFile << "\"";
00125             #endif
00126         #endif
00127 
00128         GLSLGeometryShader * geomShader = new GLSLGeometryShader();
00129         if ( !geomShader ) {
00130             #ifdef TAPs_DEBUG_MODE
00131                 #ifdef TAPs_USE_WXWIDGETS
00132                     wxLogWarning( wxT( "ERROR: Could not create geometry shader \"%s\"" ), geomFile.c_str() );
00133                 #else
00134                     std::cout << "ERROR: Could not create geometry shader \"" << geomFile << "\"";
00135                 #endif
00136             #endif
00137             return NULL;
00138         }
00139 
00140         if ( geomShader->Load( geomFile.c_str() ) ) {
00141             #ifdef TAPs_USE_WXWIDGETS
00142                 wxLogError( wxT( "ERROR: Could not load a geometry shader named \"%s\"" ), geomFile.c_str() );
00143             #else
00144                 std::cerr << "ERROR: Could not load a geometry shader named \"" << geomFile << "\"!\n";
00145             #endif
00146             return NULL;
00147         }
00148 
00149         if ( !geomShader->Compile() ) {
00150             #ifdef TAPs_DEBUG_MODE
00151                 #ifdef TAPs_USE_WXWIDGETS
00152                     wxLogError( wxT( "ERROR: \"%s\" Compilation Error:" ), geomFile.c_str() );
00153                     wxLogError( wxT( "%s" ), geomShader->GetCompilerLog() );
00154                 #else
00155                     std::cerr << "ERROR: \"" << geomFile << "\" Compilation Error:\n";
00156                     std::cerr << geomShader->GetCompilerLog() << "\n";
00157                 #endif
00158             #endif
00159             delete geomShader;
00160             return NULL;
00161         }
00162 
00163         #ifdef TAPs_DEBUG_MODE
00164             #ifdef TAPs_USE_WXWIDGETS
00165                 wxLogWarning( wxT( " is successful!" ) );
00166             #else
00167                 std::cout << " is successful!\n";
00168             #endif
00169         #endif
00170 
00171         // Add the geometry shader to the list
00172         m_vGeometryShaderList.push_back( geomShader );
00173         return geomShader;
00174     }
00175     return NULL;
00176 } // END: GLSLGeometryShader * GLSLShaderPool::CreateGeometryShaderFromFile   ( std::string const & geomFile )
00177 //-----------------------------------------------------------------------------
00178 //-----------------------------------------------------------------------------
00179 GLSLFragmentShader * GLSLShaderPool::CreateFragmentShaderFromFile   ( std::string const & fragFile )
00180 {
00181     if ( !fragFile.empty() ) {
00182         #ifdef TAPs_DEBUG_MODE
00183             #ifdef TAPs_USE_WXWIDGETS
00184                 wxLogWarning( wxT( "Load fragment shader \"%s\"" ), fragFile.c_str() );
00185             #else
00186                 std::cout << "Load fragment shader \"" << fragFile << "\"";
00187             #endif
00188         #endif
00189 
00190         GLSLFragmentShader * fragShader = new GLSLFragmentShader();
00191         if ( !fragShader ) {
00192             #ifdef TAPs_DEBUG_MODE
00193                 #ifdef TAPs_USE_WXWIDGETS
00194                     wxLogWarning( wxT( "ERROR: Could not create fragment shader \"%s\"" ), fragFile.c_str() );
00195                 #else
00196                     std::cout << "ERROR: Could not create fragment shader \"" << fragFile << "\"";
00197                 #endif
00198             #endif
00199             return NULL;
00200         }
00201 
00202         if ( fragShader->Load( fragFile.c_str() ) ) {
00203             #ifdef TAPs_USE_WXWIDGETS
00204                 wxLogError( wxT( "ERROR: Could not load a fragment shader named \"%s\"" ), fragFile.c_str() );
00205             #else
00206                 std::cerr << "ERROR: Could not load a fragment shader named \"" << fragFile << "\"!\n";
00207             #endif
00208             return NULL;
00209         }
00210 
00211         if ( !fragShader->Compile() ) {
00212             #ifdef TAPs_DEBUG_MODE
00213                 #ifdef TAPs_USE_WXWIDGETS
00214                     wxLogError( wxT( "ERROR: \"%s\" Compilation Error:" ), fragFile.c_str() );
00215                     wxLogError( wxT( "%s" ), fragShader->GetCompilerLog() );
00216                 #else
00217                     std::cerr << "ERROR: \"" << fragFile << "\" Compilation Error:\n";
00218                     std::cerr << fragShader->GetCompilerLog() << "\n";
00219                 #endif
00220             #endif
00221             delete fragShader;
00222             return NULL;
00223         }
00224 
00225         #ifdef TAPs_DEBUG_MODE
00226             #ifdef TAPs_USE_WXWIDGETS
00227                 wxLogWarning( wxT( " is successful!" ) );
00228             #else
00229                 std::cout << " is successful!\n";
00230             #endif
00231         #endif
00232         // Add the fragment shader to the list
00233         m_vFragmentShaderList.push_back( fragShader );
00234         return fragShader;
00235     }
00236     return NULL;
00237 } // END: GLSLFragmentShader * GLSLShaderPool::CreateFragmentShaderFromFile   ( std::string const & fragFile )
00238 //-----------------------------------------------------------------------------
00239 
00240 //-----------------------------------------------------------------------------
00241 GLSLProgramObject * GLSLShaderPool::CreateShaderProgram ( 
00242     GLSLVertexShader   * vertShader,
00243     GLSLGeometryShader * geomShader,
00244     GLSLFragmentShader * fragShader
00245 )
00246 {
00247     GLSLProgramObject * shaderProgram = new GLSLProgramObject();
00248     if ( !shaderProgram ) {
00249         #ifdef TAPs_DEBUG_MODE
00250             #ifdef TAPs_USE_WXWIDGETS
00251                 wxLogWarning( wxT( "Couldn't create a shader program for shaders: vert: %s, geom: %s, frag: %s" ), 
00252                                 vertShader->GetName(), geomShader->GetName(), fragShader->GetName() );
00253             #else
00254                 std::cout << "Load fragment shader \"" << fragFile << "\"";
00255             #endif
00256         #endif
00257         return NULL;
00258     }
00259 
00260     // Add shader objects to the shader program
00261     if ( vertShader )   shaderProgram->AddShader( vertShader );
00262     if ( geomShader )   shaderProgram->AddShader( geomShader );
00263     if ( fragShader )   shaderProgram->AddShader( fragShader );
00264 
00265     // Link the shader program
00266     if ( !shaderProgram->Link() ) {
00267         #ifdef TAPs_USE_WXWIDGETS
00268             wxLogError( wxT( "ERROR: Cound not link shader(s) in the program object (%d)!" ), shaderProgram->GetProgramObject() );
00269             wxLogError( wxT( "%s" ), shaderProgram->GetLinkerLog() );
00270         #else
00271             std::cerr << "ERROR: Cound not link shader(s) in the program object (" << shaderProgram->GetProgramObject() << ")!\n";
00272             std::cerr << shaderProgram->GetLinkerLog() << "\n";
00273         #endif
00274         delete shaderProgram;
00275         return NULL;
00276     }
00277 
00278     #ifdef TAPs_DEBUG_MODE
00279         #ifdef TAPs_USE_WXWIDGETS
00280             wxLogWarning( wxT( "Creating the shader program is successful!" ) );
00281         #else
00282             std::cout << "Creating the shader program is successful!\n";
00283         #endif
00284     #endif
00285     // Add the shader program to the list
00286     m_vProgramObjectList.push_back( shaderProgram );
00287     return shaderProgram;
00288 }
00289 //-----------------------------------------------------------------------------
00290 
00291 //-----------------------------------------------------------------------------
00292 //=============================================================================
00293 END_NAMESPACE_TAPs__OpenGL
00294 //34567890123456789012345678901234567890123456789012345678901234567890123456789
00295 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines