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 }