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 }