2020-07-06 19:18:29 +00:00
|
|
|
#include "Program.hpp"
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
#include <stdexcept>
|
|
|
|
#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<Shader*>& 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<char> 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<std::string>& 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);
|
|
|
|
}
|
2020-07-10 17:49:16 +00:00
|
|
|
GLuint Program::loadTextureArray(const std::vector<std::string> &names, const std::string& suffix, float mipMapLOD) {
|
2020-07-06 19:18:29 +00:00
|
|
|
|
|
|
|
std::vector<std::string> paths;
|
|
|
|
std::transform(names.begin(), names.end(), std::back_inserter(paths),
|
|
|
|
[suffix](const std::string &name) -> std::string { return TEXTURES_DIR + name + suffix + ".dds"; });
|
2020-07-10 17:49:16 +00:00
|
|
|
return loadDDSArray(paths, mipMapLOD);
|
2020-07-06 19:18:29 +00:00
|
|
|
}
|
|
|
|
GLuint Program::loadRawTexture(const std::string& name) {
|
|
|
|
return loadBMP_custom(name.c_str());
|
|
|
|
}
|