Gooey I think yes.
The class, which has function to load (read) a file:
class FileUtils {
public:
static std::string read_file(const char* filePath)
{
FILE* file = fopen(filePath, "rt");
fseek(file, 0, SEEK_END);
unsigned long length = ftell(file);
char* data = new char[length + 1];
memset(data, 0, length + 1);
fseek(file, 0, SEEK_SET);
fread(data, 1, length, file);
fclose(file);
std::string result(data);
delete[] data;
return result;
}
};
And my shader.cpp file, which is used for loading the shaders and enabling them:
Shader::Shader(const char* vertexFilePath, const char* fragFilePath)
{
m_VertPath = vertexFilePath;
m_FragPath = fragFilePath;
m_ShaderID = load();
}
Shader::~Shader()
{
glDeleteProgram(m_ShaderID);
}
GLuint Shader::load()
{
GLuint program = glCreateProgram();
GLuint vertex = glCreateShader(GL_VERTEX_SHADER);
GLuint fragment = glCreateShader(GL_FRAGMENT_SHADER);
const char* vertSource = FileUtils::read_file(m_VertPath).c_str();
const char* fragSource = FileUtils::read_file(m_FragPath).c_str();
glShaderSource(vertex, 1, &vertSource, NULL);
glCompileShader(vertex);
GLint result;
glGetShaderiv(vertex, GL_COMPILE_STATUS, &result);
if(result == GL_FALSE)
{
GLint length;
glGetShaderiv(vertex, GL_INFO_LOG_LENGTH, &length);
std::vector<char> error(length);
glGetShaderInfoLog(vertex, length, &length, &error[0]);
std::cout << "Failed to compile shader!" << std::endl;
std::cout << &error[0] << std::endl;
glDeleteShader(vertex);
return 0;
}
glShaderSource(fragment, 1, &fragSource, NULL);
glCompileShader(fragment);
glGetShaderiv(fragment, GL_COMPILE_STATUS, &result);
if(result == GL_FALSE)
{
GLint length;
glGetShaderiv(fragment, GL_INFO_LOG_LENGTH, &length);
std::vector<char> error(length);
glGetShaderInfoLog(fragment, length, &length, &error[0]);
std::cout << "Failed to compile shader!" << std::endl;
std::cout << &error[0] << std::endl;
glDeleteShader(fragment);
return 0;
}
glAttachShader(program, vertex);
glAttachShader(program, fragment);
glLinkProgram(program);
glValidateProgram(program);
glDeleteShader(vertex);
glDeleteShader(fragment);
return program;
}
void Shader::enable() const
{
}
void Shader::disable() const
{
}