#include "Program.hpp" #include #include #include "texture.hpp" #define CONTENT_DIR "content/" #define SHADER_DIR CONTENT_DIR "shaders/" #define TEXTURES_DIR CONTENT_DIR "textures/" void Program::load(const std::vector& shaders) { ProgramID = glCreateProgram(); for(auto shader : shaders) { glAttachShader(ProgramID, shader->getId()); } glLinkProgram(ProgramID); // Check the program GLint result = GL_FALSE; int infoLogLength; glGetProgramiv(ProgramID, GL_LINK_STATUS, &result); glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &infoLogLength); if (infoLogLength > 0) { std::vector errorMessage(infoLogLength + 1); glGetProgramInfoLog(ProgramID, infoLogLength, NULL, &errorMessage[0]); throw std::runtime_error(&errorMessage[0]); } for(auto shader : shaders) { glDetachShader(ProgramID, shader->getId()); delete shader; } } Program::~Program() { glDeleteProgram(ProgramID); } Shader* Program::loadShader(GLenum type, const std::vector& flags) { return new Shader(type, SHADER_DIR + getName() + "." + Shader::getExt(type), flags); } void Program::useIt() { glUseProgram(ProgramID); } GLuint Program::loadTexture(const std::string& name, bool linear) { return loadDDS(TEXTURES_DIR + name + ".dds", linear); } GLuint Program::loadTextureArray(const std::vector &names, const std::string& suffix, float mipMapLOD) { std::vector paths; std::transform(names.begin(), names.end(), std::back_inserter(paths), [suffix](const std::string &name) -> std::string { return TEXTURES_DIR + name + suffix + ".dds"; }); return loadDDSArray(paths, mipMapLOD); } GLuint Program::loadTextureCube(const std::string &name) { std::array faces { "right", "left", "top", "bottom", "front", "back" }; std::array paths; std::transform(faces.begin(), faces.end(), paths.begin(), [name](const std::string &face) -> std::string { return TEXTURES_DIR + name + ".cube." + face + ".dds"; }); return loadDDSCube(paths); } GLuint Program::loadRawTexture(const std::string& name) { return loadBMP_custom(name.c_str()); }