#pragma once #include <string> #include <fstream> #include <GL/glew.h> #include "ShaderError.h" #include <SOIL2/SOIL2.h> #define PI 3.14159 class utils{ inline static std::string readShaderSource(const char *filePath){ std::string content; std::ifstream fileStream(filePath, std::ios::in); std::string line = ""; if(fileStream.fail()){ std::cout<<"Could not open shader "<<filePath<<"!"<<std::endl; throw; } while (fileStream.good()) { getline(fileStream, line); content.append(line + "\n"); } fileStream.close(); return content; } inline static void CompileShader(GLuint shader,std::string type){ GLint compiled; glCompileShader(shader); ErrorCheck::checkOpenGLError(); glGetShaderiv(shader,GL_COMPILE_STATUS,&compiled); if(compiled!=1){ std::cout<<type<<" Compilation Failed!"<<std::endl; ErrorCheck::printShaderLog(shader); throw; } } inline static void CreateShader(GLuint type,std::string shaderName,const char*source,GLuint vfProgram){ if(source!=nullptr){ GLuint vShader=glCreateShader(type); std::string shaderFile=readShaderSource(source); const char*vertShaderSrc=shaderFile.c_str(); glShaderSource(vShader,1,&vertShaderSrc,NULL); CompileShader(vShader,shaderName); glAttachShader(vfProgram,vShader); } }; public: inline static GLuint createShaderProgram(const char*vertex,const char*fragment){ return createShaderProgram(vertex,nullptr,nullptr,nullptr,fragment); } inline static GLuint createShaderProgram(const char*vertex,const char*geometry,const char*fragment){ return createShaderProgram(vertex,nullptr,nullptr,geometry,fragment); } inline static GLuint createShaderProgram(const char*vertex,const char*tesselationCS,const char*tesselationES,const char*fragment){ return createShaderProgram(vertex,tesselationCS,tesselationES,nullptr,fragment); } inline static GLuint createShaderProgram(const char*vertex,const char*tesselationCS,const char*tesselationES,const char*geometry,const char*fragment){ GLuint vfProgram=glCreateProgram(); CreateShader(GL_VERTEX_SHADER,"Vertex",vertex,vfProgram); CreateShader(GL_FRAGMENT_SHADER,"Fragment",fragment,vfProgram); CreateShader(GL_TESS_CONTROL_SHADER,"Tesselation Control",tesselationCS,vfProgram); CreateShader(GL_TESS_EVALUATION_SHADER,"Tesselation Evaluation",tesselationES,vfProgram); CreateShader(GL_GEOMETRY_SHADER,"Geometry",geometry,vfProgram); GLint linked; glLinkProgram(vfProgram); ErrorCheck::checkOpenGLError(); glGetProgramiv(vfProgram,GL_LINK_STATUS,&linked); if(linked!=1){ std::cout<<"Linking Failed!"<<std::endl; ErrorCheck::printProgramLog(vfProgram); } return vfProgram; } inline static float degToRad(float deg){ return deg*(PI/180); } inline static float radToDeg(float rad){ return rad*57.2957795130823208767; } inline static GLuint loadTexture(const char*file){ GLuint textureID; textureID=SOIL_load_OGL_texture(file,SOIL_LOAD_AUTO,SOIL_CREATE_NEW_ID,SOIL_FLAG_INVERT_Y); if(!textureID){ std::cout<<"Could not load texture file "<<file<<std::endl; throw; } return textureID; } };