summaryrefslogtreecommitdiff
path: root/engine-ocean/Graphics/shaderloader.h
diff options
context:
space:
mode:
authorjjesswan <jessica_wan@brown.edu>2024-04-22 21:56:26 -0400
committerjjesswan <jessica_wan@brown.edu>2024-04-22 21:56:26 -0400
commita556b45abf18f1bd509daaf63b66b7d55e9fd291 (patch)
treebc9b8a2d184c12aee236e7f9f276a34b84ca552d /engine-ocean/Graphics/shaderloader.h
parentcd7c76017a12bb548036571c1ff13e551369d06d (diff)
add engine version
Diffstat (limited to 'engine-ocean/Graphics/shaderloader.h')
-rw-r--r--engine-ocean/Graphics/shaderloader.h98
1 files changed, 98 insertions, 0 deletions
diff --git a/engine-ocean/Graphics/shaderloader.h b/engine-ocean/Graphics/shaderloader.h
new file mode 100644
index 0000000..eeb8e8c
--- /dev/null
+++ b/engine-ocean/Graphics/shaderloader.h
@@ -0,0 +1,98 @@
+#pragma once
+
+#include "debug.h"
+
+#include <vector>
+#include <string>
+#include <stdexcept>
+#include <fstream>
+#include <iostream>
+
+class ShaderLoader{
+public:
+ static GLuint createShaderProgram(std::vector<GLenum> shaderTypes, std::vector<const char*> filepaths){
+ // Create and compile shaders
+ std::vector<GLuint> shaderIDs;
+ for(int i = 0; i<shaderTypes.size(); i++){
+ shaderIDs.push_back(createAndCompileShader(shaderTypes[i], filepaths[i]));
+ }
+
+ // Link the shader program
+ GLuint programID = glCreateProgram();
+ for(int i = 0; i<shaderIDs.size(); i++){
+ glAttachShader(programID, shaderIDs[i]);
+ }
+ glLinkProgram(programID);
+
+ // Print the info log if program fails to link
+ GLint status;
+ glGetProgramiv(programID, GL_LINK_STATUS, &status);
+ if(status == GL_FALSE){
+ GLint length;
+ glGetProgramiv(programID, GL_INFO_LOG_LENGTH, &length);
+ std::string log(length, '\0');
+ glGetProgramInfoLog(programID, length, nullptr, &log[0]);
+ glDeleteProgram(programID);
+ throw std::runtime_error(log);
+ }
+
+ // Individual shaders no longer necessary, stored in program
+ for(int i = 0; i<shaderIDs.size(); i++){
+ glDeleteShader(shaderIDs[i]);
+ }
+
+ std::cout<<"END OF SHADERLOADER"<<std::endl;
+ return programID;
+ }
+
+private:
+ static std::string readFile(const char *filePath) {
+ std::cout<<"READ FILE: "<<std::string(filePath)<<std::endl;
+ std::string content;
+ std::ifstream fileStream(filePath, std::ios::in);
+
+ if(!fileStream.is_open()) {
+ std::string log = "Could not read file "+std::string(filePath)+". File does not exist.";
+ throw std::runtime_error(log);
+ return "";
+ }
+
+ std::string line = "";
+ while(std::getline(fileStream, line)) {
+ content.append(line + "\n");
+ }
+
+ fileStream.close();
+
+ return content;
+ }
+
+ static GLuint createAndCompileShader(GLenum shaderType, const char* filepath){
+ std::cout<<"CREATE AND COMPILE SHADER: "<<shaderType<<std::endl;
+ GLuint shaderID = glCreateShader(shaderType);
+
+ // Read shader file
+ std::string shaderStr = readFile(filepath);
+ const char* shaderSrc = shaderStr.c_str();
+
+ std::cout<<"GL SHADER SOURCE"<<std::endl;
+ glShaderSource(shaderID, 1, &shaderSrc, NULL);
+
+ std::cout<<"GL COMPILE SHADER: "<<shaderID<<std::endl;
+ glCompileShader(shaderID);
+
+ // Print info log if shader fails to compile
+ GLint status;
+ glGetShaderiv(shaderID, GL_COMPILE_STATUS, &status);
+ if(status == GL_FALSE){
+ GLint length;
+ glGetShaderiv(shaderID, GL_INFO_LOG_LENGTH, &length);
+ std::string log(length, '\0');
+ glGetShaderInfoLog(shaderID, length, nullptr, &log[0]);
+ glDeleteShader(shaderID);
+ throw std::runtime_error(log);
+ }
+
+ return shaderID;
+ }
+}; \ No newline at end of file