- GLuint CUtil::loadShader(GLenum type, const char* filename) {
- FILE* file = fopen(filename, "rb");
- if (file == 0) {
- throw Exception(std::string("error loading '") + filename + "'");
- }
- fseek(file, 0, SEEK_END);
- int size = ftell(file);
- fseek(file, 0, SEEK_SET);
- char* data = new char[size+1];
- int read = fread(data,1,size,file);
- if (read != size) {
- throw Exception(std::string("error while loading '") + filename + "'");
- }
- fclose(file);
- data[size]=0;
- const char* data_const = data;
- GLuint shader = glCreateShader(type);
- glShaderSource(shader, 1, &data_const, NULL);
- glCompileShader(shader);
- delete[] data;
- // retrieve infolog
- int len;
- glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
- if (len > 1) {
- char buffer[len];
- glGetShaderInfoLog(shader, len, NULL, buffer);
- std::cout << "file: " << filename << "\n";
- std::cout << buffer << "\n";
- }
- int status = 0;
- glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
- if (status) {
- return shader;
- }
- else {
- throw Exception("error: shader compilation failed.");
- }
- }
- void CUtil::checkLinkError(const std::string name, GLuint program) {
- int status = 0;
- glGetProgramiv(program, GL_LINK_STATUS, &status);
- if (!status) {
- // retrieve infolog
- int len;
- glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);
- if (len > 1) {
- char buffer[len];
- glGetProgramInfoLog(program, len, NULL, buffer);
- std::cout << buffer << "\n";
- }
- throw Exception(name + ": program linking failed.");
- }
- }