From 54178eafc123d66ea7fd8870a982aa8c81f8d53c Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 2 Dec 2023 17:53:53 +0300 Subject: [PATCH] Shader loading error text fix --- src/assets/asset_loaders.cpp | 27 ++++++++++------ src/assets/asset_loaders.h | 16 +++++----- src/graphics/Shader.cpp | 62 +++++++++++++----------------------- src/graphics/Shader.h | 3 +- 4 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/assets/asset_loaders.cpp b/src/assets/asset_loaders.cpp index a712d582..1065fe46 100644 --- a/src/assets/asset_loaders.cpp +++ b/src/assets/asset_loaders.cpp @@ -2,6 +2,7 @@ #include #include "Assets.h" +#include "../files/files.h" #include "../coders/png.h" #include "../graphics/Shader.h" #include "../graphics/Texture.h" @@ -17,8 +18,8 @@ using std::filesystem::path; namespace fs = std::filesystem; bool assetload::texture(Assets* assets, - const path& filename, - const string& name) { + const path filename, + const string name) { Texture* texture = png::load_texture(filename.string()); if (texture == nullptr) { std::cerr << "failed to load texture '" << name << "'" << std::endl; @@ -29,10 +30,18 @@ bool assetload::texture(Assets* assets, } bool assetload::shader(Assets* assets, - const path& filename, + const path filename, const string& name) { - Shader* shader = Shader::loadShader(filename.string() + ".glslv", - filename.string() + ".glslf"); + path vertexFile = filename; + path fragmentFile = filename; + vertexFile.append(".glslv"); + fragmentFile.append(".glslf"); + + string vertexSource = files::read_string(vertexFile); + string fragmentSource = files::read_string(fragmentFile); + + Shader* shader = Shader::loadShader(vertexFile, fragmentFile, + vertexSource, fragmentSource); if (shader == nullptr) { std::cerr << "failed to load shader '" << name << "'" << std::endl; return false; @@ -42,8 +51,8 @@ bool assetload::shader(Assets* assets, } bool assetload::atlas(Assets* assets, - const path& directory, - const string& name) { + const path directory, + const string name) { AtlasBuilder builder; for (const auto& entry : fs::directory_iterator(directory)) { path file = entry.path(); @@ -60,8 +69,8 @@ bool assetload::atlas(Assets* assets, } bool assetload::font(Assets* assets, - const path& filename, - const string& name) { + const path filename, + const string name) { vector pages; for (size_t i = 0; i <= 4; i++) { string name = filename.string() + "_" + std::to_string(i) + ".png"; diff --git a/src/assets/asset_loaders.h b/src/assets/asset_loaders.h index 9d72b8e1..408e0047 100644 --- a/src/assets/asset_loaders.h +++ b/src/assets/asset_loaders.h @@ -8,17 +8,17 @@ class Assets; namespace assetload { bool texture(Assets* assets, - const std::filesystem::path& filename, - const std::string& name); + const std::filesystem::path filename, + const std::string name); bool shader(Assets* assets, - const std::filesystem::path& filename, - const std::string& name); + const std::filesystem::path filename, + const std::string name); bool atlas(Assets* assets, - const std::filesystem::path& directory, - const std::string& name); + const std::filesystem::path directory, + const std::string name); bool font(Assets* assets, - const std::filesystem::path& filename, - const std::string& name); + const std::filesystem::path filename, + const std::string name); } #endif // ASSETS_ASSET_LOADERS_H_ \ No newline at end of file diff --git a/src/graphics/Shader.cpp b/src/graphics/Shader.cpp index ccc4df55..a75cfed2 100644 --- a/src/graphics/Shader.cpp +++ b/src/graphics/Shader.cpp @@ -12,6 +12,11 @@ #include "../coders/GLSLExtension.h" +using std::cerr; +using std::endl; +using glm::vec2; +using glm::vec3; +using std::string; using std::filesystem::path; GLSLExtension* Shader::preprocessor = new GLSLExtension(); @@ -27,69 +32,46 @@ void Shader::use(){ glUseProgram(id); } -void Shader::uniformMatrix(std::string name, glm::mat4 matrix){ +void Shader::uniformMatrix(string name, glm::mat4 matrix){ GLuint transformLoc = glGetUniformLocation(id, name.c_str()); glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(matrix)); } -void Shader::uniform1i(std::string name, int x){ +void Shader::uniform1i(string name, int x){ GLuint transformLoc = glGetUniformLocation(id, name.c_str()); glUniform1i(transformLoc, x); } -void Shader::uniform1f(std::string name, float x){ +void Shader::uniform1f(string name, float x){ GLuint transformLoc = glGetUniformLocation(id, name.c_str()); glUniform1f(transformLoc, x); } -void Shader::uniform2f(std::string name, float x, float y){ +void Shader::uniform2f(string name, float x, float y){ GLuint transformLoc = glGetUniformLocation(id, name.c_str()); glUniform2f(transformLoc, x, y); } -void Shader::uniform2f(std::string name, glm::vec2 xy){ +void Shader::uniform2f(string name, vec2 xy){ GLuint transformLoc = glGetUniformLocation(id, name.c_str()); glUniform2f(transformLoc, xy.x, xy.y); } -void Shader::uniform3f(std::string name, float x, float y, float z){ +void Shader::uniform3f(string name, float x, float y, float z){ GLuint transformLoc = glGetUniformLocation(id, name.c_str()); glUniform3f(transformLoc, x,y,z); } -void Shader::uniform3f(std::string name, glm::vec3 xyz){ +void Shader::uniform3f(string name, vec3 xyz){ GLuint transformLoc = glGetUniformLocation(id, name.c_str()); glUniform3f(transformLoc, xyz.x, xyz.y, xyz.z); } -Shader* Shader::loadShader(std::string vertexFile, std::string fragmentFile) { - // Reading Files - std::string vertexCode; - std::string fragmentCode; - std::ifstream vShaderFile; - std::ifstream fShaderFile; - - vShaderFile.exceptions(std::ifstream::badbit); - fShaderFile.exceptions(std::ifstream::badbit); - try { - vShaderFile.open(vertexFile); - fShaderFile.open(fragmentFile); - std::stringstream vShaderStream, fShaderStream; - - vShaderStream << vShaderFile.rdbuf(); - fShaderStream << fShaderFile.rdbuf(); - - vShaderFile.close(); - fShaderFile.close(); - - vertexCode = vShaderStream.str(); - fragmentCode = fShaderStream.str(); - } - catch(std::ifstream::failure& e) { - std::cerr << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl; - return nullptr; - } +Shader* Shader::loadShader(string vertexFile, + string fragmentFile, + string vertexCode, + string fragmentCode) { vertexCode = preprocessor->process(path(vertexFile), vertexCode); fragmentCode = preprocessor->process(path(fragmentFile), fragmentCode); @@ -107,8 +89,8 @@ Shader* Shader::loadShader(std::string vertexFile, std::string fragmentFile) { glGetShaderiv(vertex, GL_COMPILE_STATUS, &success); if (!success){ glGetShaderInfoLog(vertex, 512, nullptr, infoLog); - std::cerr << "SHADER::VERTEX: compilation failed: " << vertexFile << std::endl; - std::cerr << infoLog << std::endl; + cerr << "SHADER::VERTEX: compilation failed: " << vertexFile << endl; + cerr << infoLog << endl; return nullptr; } @@ -119,8 +101,8 @@ Shader* Shader::loadShader(std::string vertexFile, std::string fragmentFile) { glGetShaderiv(fragment, GL_COMPILE_STATUS, &success); if (!success){ glGetShaderInfoLog(fragment, 512, nullptr, infoLog); - std::cerr << "SHADER::FRAGMENT: compilation failed: " << vertexFile << std::endl; - std::cerr << infoLog << std::endl; + cerr << "SHADER::FRAGMENT: compilation failed: " << vertexFile << endl; + cerr << infoLog << endl; return nullptr; } @@ -133,8 +115,8 @@ Shader* Shader::loadShader(std::string vertexFile, std::string fragmentFile) { glGetProgramiv(id, GL_LINK_STATUS, &success); if (!success){ glGetProgramInfoLog(id, 512, nullptr, infoLog); - std::cerr << "SHADER::PROGRAM: linking failed" << std::endl; - std::cerr << infoLog << std::endl; + cerr << "SHADER::PROGRAM: linking failed" << endl; + cerr << infoLog << endl; glDeleteShader(vertex); glDeleteShader(fragment); diff --git a/src/graphics/Shader.h b/src/graphics/Shader.h index 659d717f..78672665 100644 --- a/src/graphics/Shader.h +++ b/src/graphics/Shader.h @@ -23,7 +23,8 @@ public: void uniform3f(std::string name, float x, float y, float z); void uniform3f(std::string name, glm::vec3 xyz); - static Shader* loadShader(std::string vertexFile, std::string fragmentFile); + static Shader* loadShader(std::string vertexFile, std::string fragmentFile, + std::string vertexSource, std::string fragmentSource); }; #endif /* GRAPHICS_SHADER_H_ */