#include "shader.hpp" #ifndef GLAD #define GLAD #include #endif char* readFile(const char * fileName){ std::ifstream file; file.open(fileName); if (!file.is_open()){ std::cerr << "Error reading "<< fileName << std::endl; exit(1); } //Get the length of the vs file file.seekg(0,std::ios_base::end); int fileLength = (int)file.tellg()+1; file.seekg(0); char* text=(char*)malloc(fileLength); file.read(text,fileLength); text[fileLength-1]='\0'; return text; } Shader::Shader(){} Shader::Shader(const char* vsFileName, const char* fsFileName){ char* vsSource = readFile(vsFileName); char* fsSource = readFile(fsFileName); unsigned int vs = glCreateShader(GL_VERTEX_SHADER); unsigned int fs = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(vs, 1, &vsSource, NULL); glShaderSource(fs, 1, &fsSource, NULL); int success; char log[512]; glCompileShader(fs); free(fsSource); glGetShaderiv(fs, GL_COMPILE_STATUS, &success); if(!success){ glGetShaderInfoLog(fs, 512, NULL, log); std::cerr << "Error compiling fragment shader: " << log << std::endl; exit(1); } glCompileShader(vs); free(vsSource); glGetShaderiv(vs, GL_COMPILE_STATUS, &success); if(!success){ glGetShaderInfoLog(vs, 512, NULL, log); std::cerr << "Error compiling vertex shader: " << log << std::endl; exit(1); } ID = glCreateProgram(); glAttachShader(ID,vs); glAttachShader(ID,fs); glLinkProgram(ID); glGetProgramiv(ID, GL_LINK_STATUS, &success); if(!success){ glGetProgramInfoLog(ID,512,NULL,log); std::cerr << "Error linking shaders: " << log << std::endl; exit(1); } glDeleteShader(vs); glDeleteShader(fs); } void Shader::activate(){ glUseProgram(ID); } void Shader::setUniformFloat(const char* name, float value){ glUniform1f(glGetUniformLocation(ID,name),value); } void Shader::setUniformVec3(const char* name, Vector3f value){ glUniform3f(glGetUniformLocation(ID,name),value.x,value.y,value.z); } void Shader::setUniformMat4(const char* name, Matrix4f value){ glUniformMatrix4fv(glGetUniformLocation(ID,name),1,GL_TRUE,&value.M[0][0]); } void Shader::shutdown(){ glDeleteShader(ID); }