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.");
}
}