minor refactor

This commit is contained in:
MihailRis
2024-02-25 02:15:38 +03:00
parent 43f9516870
commit 97479d5201
3 changed files with 97 additions and 95 deletions
+3 -2
View File
@@ -52,10 +52,11 @@ bool assetload::shader(
std::string vertexSource = files::read_string(vertexFile); std::string vertexSource = files::read_string(vertexFile);
std::string fragmentSource = files::read_string(fragmentFile); std::string fragmentSource = files::read_string(fragmentFile);
Shader* shader = Shader::loadShader( Shader* shader = Shader::create(
vertexFile.string(), vertexFile.string(),
fragmentFile.string(), fragmentFile.string(),
vertexSource, fragmentSource); vertexSource, fragmentSource
);
if (shader == nullptr) { if (shader == nullptr) {
std::cerr << "failed to load shader '" << name << "'" << std::endl; std::cerr << "failed to load shader '" << name << "'" << std::endl;
+76 -79
View File
@@ -12,12 +12,7 @@
#include "../coders/GLSLExtension.h" #include "../coders/GLSLExtension.h"
using std::cerr; namespace fs = std::filesystem;
using std::endl;
using glm::vec2;
using glm::vec3;
using std::string;
using std::filesystem::path;
GLSLExtension* Shader::preprocessor = new GLSLExtension(); GLSLExtension* Shader::preprocessor = new GLSLExtension();
@@ -25,106 +20,108 @@ Shader::Shader(unsigned int id) : id(id){
} }
Shader::~Shader(){ Shader::~Shader(){
glDeleteProgram(id); glDeleteProgram(id);
} }
void Shader::use(){ void Shader::use(){
glUseProgram(id); glUseProgram(id);
} }
void Shader::uniformMatrix(string name, glm::mat4 matrix){ void Shader::uniformMatrix(std::string name, glm::mat4 matrix){
GLuint transformLoc = glGetUniformLocation(id, name.c_str()); GLuint transformLoc = glGetUniformLocation(id, name.c_str());
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(matrix)); glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(matrix));
} }
void Shader::uniform1i(string name, int x){ void Shader::uniform1i(std::string name, int x){
GLuint transformLoc = glGetUniformLocation(id, name.c_str()); GLuint transformLoc = glGetUniformLocation(id, name.c_str());
glUniform1i(transformLoc, x); glUniform1i(transformLoc, x);
} }
void Shader::uniform1f(string name, float x){ void Shader::uniform1f(std::string name, float x){
GLuint transformLoc = glGetUniformLocation(id, name.c_str()); GLuint transformLoc = glGetUniformLocation(id, name.c_str());
glUniform1f(transformLoc, x); glUniform1f(transformLoc, x);
} }
void Shader::uniform2f(string name, float x, float y){ void Shader::uniform2f(std::string name, float x, float y){
GLuint transformLoc = glGetUniformLocation(id, name.c_str()); GLuint transformLoc = glGetUniformLocation(id, name.c_str());
glUniform2f(transformLoc, x, y); glUniform2f(transformLoc, x, y);
} }
void Shader::uniform2f(string name, vec2 xy){ void Shader::uniform2f(std::string name, glm::vec2 xy){
GLuint transformLoc = glGetUniformLocation(id, name.c_str()); GLuint transformLoc = glGetUniformLocation(id, name.c_str());
glUniform2f(transformLoc, xy.x, xy.y); glUniform2f(transformLoc, xy.x, xy.y);
} }
void Shader::uniform3f(string name, float x, float y, float z){ void Shader::uniform3f(std::string name, float x, float y, float z){
GLuint transformLoc = glGetUniformLocation(id, name.c_str()); GLuint transformLoc = glGetUniformLocation(id, name.c_str());
glUniform3f(transformLoc, x,y,z); glUniform3f(transformLoc, x,y,z);
} }
void Shader::uniform3f(string name, vec3 xyz){ void Shader::uniform3f(std::string name, glm::vec3 xyz){
GLuint transformLoc = glGetUniformLocation(id, name.c_str()); GLuint transformLoc = glGetUniformLocation(id, name.c_str());
glUniform3f(transformLoc, xyz.x, xyz.y, xyz.z); glUniform3f(transformLoc, xyz.x, xyz.y, xyz.z);
} }
Shader* Shader::loadShader(string vertexFile, Shader* Shader::create(
string fragmentFile, std::string vertexFile,
string vertexCode, std::string fragmentFile,
string fragmentCode) { std::string vertexCode,
vertexCode = preprocessor->process(path(vertexFile), vertexCode); std::string fragmentCode
fragmentCode = preprocessor->process(path(fragmentFile), fragmentCode); ) {
vertexCode = preprocessor->process(fs::path(vertexFile), vertexCode);
fragmentCode = preprocessor->process(fs::path(fragmentFile), fragmentCode);
const GLchar* vShaderCode = vertexCode.c_str(); const GLchar* vShaderCode = vertexCode.c_str();
const GLchar* fShaderCode = fragmentCode.c_str(); const GLchar* fShaderCode = fragmentCode.c_str();
GLuint vertex, fragment; GLuint vertex, fragment;
GLint success; GLint success;
GLchar infoLog[512]; GLchar infoLog[512];
// Vertex Shader // Vertex Shader
vertex = glCreateShader(GL_VERTEX_SHADER); vertex = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex, 1, &vShaderCode, nullptr); glShaderSource(vertex, 1, &vShaderCode, nullptr);
glCompileShader(vertex); glCompileShader(vertex);
glGetShaderiv(vertex, GL_COMPILE_STATUS, &success); glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);
if (!success){ if (!success){
glGetShaderInfoLog(vertex, 512, nullptr, infoLog); glGetShaderInfoLog(vertex, 512, nullptr, infoLog);
cerr << "SHADER::VERTEX: compilation failed: " << vertexFile << endl; std::cerr << "SHADER::VERTEX: compilation failed: " << vertexFile << std::endl;
cerr << infoLog << endl; std::cerr << infoLog << std::endl;
return nullptr; return nullptr;
} }
// Fragment Shader // Fragment Shader
fragment = glCreateShader(GL_FRAGMENT_SHADER); fragment = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment, 1, &fShaderCode, nullptr); glShaderSource(fragment, 1, &fShaderCode, nullptr);
glCompileShader(fragment); glCompileShader(fragment);
glGetShaderiv(fragment, GL_COMPILE_STATUS, &success); glGetShaderiv(fragment, GL_COMPILE_STATUS, &success);
if (!success){ if (!success){
glGetShaderInfoLog(fragment, 512, nullptr, infoLog); glGetShaderInfoLog(fragment, 512, nullptr, infoLog);
cerr << "SHADER::FRAGMENT: compilation failed: " << vertexFile << endl; std::cerr << "SHADER::FRAGMENT: compilation failed: " << vertexFile << std::endl;
cerr << infoLog << endl; std::cerr << infoLog << std::endl;
return nullptr; return nullptr;
} }
// Shader Program // Shader Program
GLuint id = glCreateProgram(); GLuint id = glCreateProgram();
glAttachShader(id, vertex); glAttachShader(id, vertex);
glAttachShader(id, fragment); glAttachShader(id, fragment);
glLinkProgram(id); glLinkProgram(id);
glGetProgramiv(id, GL_LINK_STATUS, &success); glGetProgramiv(id, GL_LINK_STATUS, &success);
if (!success){ if (!success){
glGetProgramInfoLog(id, 512, nullptr, infoLog); glGetProgramInfoLog(id, 512, nullptr, infoLog);
cerr << "SHADER::PROGRAM: linking failed" << endl; std::cerr << "SHADER::PROGRAM: linking failed" << std::endl;
cerr << infoLog << endl; std::cerr << infoLog << std::endl;
glDeleteShader(vertex); glDeleteShader(vertex);
glDeleteShader(fragment); glDeleteShader(fragment);
return nullptr; return nullptr;
} }
glDeleteShader(vertex); glDeleteShader(vertex);
glDeleteShader(fragment); glDeleteShader(fragment);
return new Shader(id); return new Shader(id);
} }
+18 -14
View File
@@ -8,23 +8,27 @@ class GLSLExtension;
class Shader { class Shader {
public: public:
static GLSLExtension* preprocessor; static GLSLExtension* preprocessor;
unsigned int id; unsigned int id;
Shader(unsigned int id); Shader(unsigned int id);
~Shader(); ~Shader();
void use(); void use();
void uniformMatrix(std::string name, glm::mat4 matrix); void uniformMatrix(std::string name, glm::mat4 matrix);
void uniform1i(std::string name, int x); void uniform1i(std::string name, int x);
void uniform1f(std::string name, float x); void uniform1f(std::string name, float x);
void uniform2f(std::string name, float x, float y); void uniform2f(std::string name, float x, float y);
void uniform2f(std::string name, glm::vec2 xy); void uniform2f(std::string name, glm::vec2 xy);
void uniform3f(std::string name, float x, float y, float z); void uniform3f(std::string name, float x, float y, float z);
void uniform3f(std::string name, glm::vec3 xyz); void uniform3f(std::string name, glm::vec3 xyz);
static Shader* loadShader(std::string vertexFile, std::string fragmentFile, static Shader* create(
std::string vertexSource, std::string fragmentSource); std::string vertexFile,
std::string fragmentFile,
std::string vertexSource,
std::string fragmentSource
);
}; };
#endif /* GRAPHICS_SHADER_H_ */ #endif /* GRAPHICS_SHADER_H_ */