minor refactor
This commit is contained in:
@@ -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
@@ -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
@@ -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_ */
|
||||||
|
|||||||
Reference in New Issue
Block a user