Eigene Dateien/FlowVis/src/VProgram.cpp

Go to the documentation of this file.
00001 #include "VProgram.h"
00002 #include "glew.h"
00003 
00004 void VProgram::attach(const VShader &shaShader)
00005 {
00006         if (m_uProgram)
00007         {
00008                 bool bAttached = false;
00009 
00010                 for (std::list<VShader>::const_iterator i = m_lisShaders.begin(); i != m_lisShaders.end(); i++)
00011                 {
00012                         if ((*i).GetObject() == shaShader.GetObject())
00013                         {
00014                                 bAttached = true;
00015                                 break;
00016                         }
00017                 }
00018 
00019                 if (!bAttached)
00020                 {
00021                         glAttachObjectARB(m_uProgram, shaShader.GetObject());
00022                         GLenum glError = glGetError();
00023 
00024                         if (glError != GL_NO_ERROR)
00025                                 std::cout << "Error attaching shader " << gluErrorString(glError) << std::endl;
00026 
00027                         m_lisShaders.push_back(shaShader);
00028                         shaShader.attach();
00029 
00030                         link();
00031                 }
00032         }
00033 }
00034 
00035 void VProgram::detach(const VShader & shaShader)
00036 {
00037         if (m_uProgram)
00038         {
00039                 std::list<VShader>::iterator iteShader = m_lisShaders.end();
00040 
00041                 for (std::list<VShader>::iterator i = m_lisShaders.begin(); i != m_lisShaders.end(); i++)
00042                 {
00043                         if ((*i).GetObject() == shaShader.GetObject())
00044                         {
00045                                 iteShader = i;
00046                                 break;
00047                         }
00048                 }
00049 
00050                 if (iteShader != m_lisShaders.end())
00051                 {
00052                         glDetachObjectARB(m_uProgram, shaShader.GetObject());
00053                         GLenum glError = glGetError();
00054 
00055                         if (glError != GL_NO_ERROR)
00056                                 std::cout << "Error detaching shader "  << gluErrorString(glError) << std::endl;
00057 
00058                         m_lisShaders.erase(iteShader);
00059                         shaShader.detach();
00060 
00061                         link();
00062                 }
00063         }
00064 }
00065 
00066 void VProgram::bind()
00067 {
00068         if (m_uProgram)
00069         {
00070                 glUseProgramObjectARB(m_uProgram);
00071                 const GLenum glError = glGetError();
00072 
00073                 if (glError != GL_NO_ERROR)
00074                         std::cout << "Error binding program " << gluErrorString(glError) << std::endl;
00075         }
00076 }
00077 
00078 void VProgram::release()
00079 {
00080         if (m_uProgram)
00081         {
00082                 glUseProgramObjectARB(0);
00083                 const GLenum glError = glGetError();
00084 
00085                 if (glError != GL_NO_ERROR)
00086                         std::cout << "Error releasing program "  << gluErrorString(glError) << std::endl;
00087         }
00088 }
00089 
00090 const int VProgram::getUniformLocation(const std::string & strName) const
00091 {
00092         int iLocation = -1;
00093 
00094         if (m_uProgram)
00095         {
00096                 iLocation = glGetUniformLocationARB(m_uProgram,strName.c_str()); 
00097                 const GLenum glError = glGetError();
00098 
00099                 if (glError != GL_NO_ERROR)
00100                         std::cout << "Error retrieving location "  << gluErrorString(glError) << std::endl;
00101         }
00102 
00103         return iLocation;
00104 }
00105 
00106 const int VProgram::getAttributeLocation(const std::string & strName) const
00107 {
00108         int iLocation = -1;
00109 
00110         if (m_uProgram)
00111         {
00112                 iLocation = glGetAttribLocationARB(m_uProgram,strName.c_str()); 
00113                 const GLenum glError = glGetError();
00114 
00115                 if (glError != GL_NO_ERROR)
00116                         std::cout << "Error retrieving location "  << gluErrorString(glError) << std::endl;
00117         }
00118 
00119         return iLocation;
00120 }
00121 
00122 void VProgram::link()
00123 {
00124         if (m_uProgram)
00125         {
00126                 glLinkProgramARB(m_uProgram);
00127                 const GLenum glError = glGetError();
00128 
00129                 if (glError != GL_NO_ERROR)
00130                         std::cout << "Error linking program " << gluErrorString(glError) << std::endl;
00131 
00132                 int iReturn = 1;
00133                 glGetObjectParameterivARB(m_uProgram,GL_OBJECT_LINK_STATUS_ARB,&iReturn);
00134 
00135                 if (!iReturn)
00136                 {
00137                         int iLength = 0;
00138 
00139                         glGetObjectParameterivARB(m_uProgram, GL_OBJECT_INFO_LOG_LENGTH_ARB,&iLength);
00140 
00141                         char *pInfo = new char[iLength];
00142                         int iWritten = 0;
00143 
00144                         glGetInfoLogARB(m_uProgram, iLength, &iWritten, pInfo);
00145                         std::string strInfo(pInfo);
00146                         delete[] pInfo;
00147 
00148                         std::cout << "Error linking program\n\n" << strInfo.c_str() << std::endl;
00149                 }
00150         }
00151 }
00152 
00153 void VProgram::initialize()
00154 {
00155         if (!GLEW_ARB_shader_objects)
00156                 std::cout << "GL_ARB_shader_objects is not supported" << std::endl;
00157 
00158         if (!m_uProgram)
00159         {
00160                 m_uProgram = glCreateProgramObjectARB();
00161                 const GLenum glError = glGetError();
00162 
00163                 if (glError != GL_NO_ERROR)
00164                         std::cout << "Error creating program " << gluErrorString(glError) << std::endl;
00165         }
00166 }
00167 
00168 void VProgram::uninitialize()
00169 {
00170         if (m_uProgram)
00171         {
00172                 for (std::list<VShader>::const_iterator i = m_lisShaders.begin(); i != m_lisShaders.end(); i++)
00173                 {
00174                         glDetachObjectARB(m_uProgram, (*i).GetObject());
00175                         const GLenum glError = glGetError();
00176 
00177                         if (glError != GL_NO_ERROR)
00178                                 std::cout << "Error detaching shader " << gluErrorString(glError) << std::endl;
00179 
00180                         (*i).detach();
00181                 }
00182 
00183                 m_lisShaders.clear();
00184                 
00185                 glDeleteObjectARB(m_uProgram);
00186                 const GLenum glError = glGetError();
00187 
00188                 if (glError != GL_NO_ERROR)
00189                         std::cout << "Error deleting program " << gluErrorString(glError) << std::endl;
00190         }
00191 }

Generated on Mon Jan 21 01:15:16 2008 for FlowVis by  doxygen 1.5.4