2021-08-06 22:30:02 -04:00
|
|
|
#include "Shader.h"
|
|
|
|
#include "common/util/FileUtil.h"
|
2021-12-04 12:33:18 -05:00
|
|
|
#include "common/log/log.h"
|
2021-08-09 21:42:05 -04:00
|
|
|
#include "game/graphics/pipelines/opengl.h"
|
2022-02-08 19:02:47 -05:00
|
|
|
#include "common/util/Assert.h"
|
2021-08-06 22:30:02 -04:00
|
|
|
|
|
|
|
Shader::Shader(const std::string& shader_name) {
|
|
|
|
// read the shader source
|
|
|
|
auto vert_src =
|
|
|
|
file_util::read_text_file(file_util::get_file_path({shader_folder, shader_name + ".vert"}));
|
|
|
|
auto frag_src =
|
|
|
|
file_util::read_text_file(file_util::get_file_path({shader_folder, shader_name + ".frag"}));
|
|
|
|
|
|
|
|
m_vert_shader = glCreateShader(GL_VERTEX_SHADER);
|
|
|
|
const char* src = vert_src.c_str();
|
|
|
|
glShaderSource(m_vert_shader, 1, &src, nullptr);
|
|
|
|
glCompileShader(m_vert_shader);
|
|
|
|
|
|
|
|
constexpr int len = 1024;
|
|
|
|
int compile_ok;
|
|
|
|
char err[len];
|
|
|
|
|
|
|
|
glGetShaderiv(m_vert_shader, GL_COMPILE_STATUS, &compile_ok);
|
|
|
|
if (!compile_ok) {
|
|
|
|
glGetShaderInfoLog(m_vert_shader, len, nullptr, err);
|
2021-12-04 12:33:18 -05:00
|
|
|
lg::error("Failed to compile vertex shader {}:\n{}\n", shader_name.c_str(), err);
|
2021-08-06 22:30:02 -04:00
|
|
|
m_is_okay = false;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_frag_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
|
|
src = frag_src.c_str();
|
|
|
|
glShaderSource(m_frag_shader, 1, &src, nullptr);
|
|
|
|
glCompileShader(m_frag_shader);
|
|
|
|
|
|
|
|
glGetShaderiv(m_frag_shader, GL_COMPILE_STATUS, &compile_ok);
|
|
|
|
if (!compile_ok) {
|
|
|
|
glGetShaderInfoLog(m_frag_shader, len, nullptr, err);
|
2021-12-04 12:33:18 -05:00
|
|
|
lg::error("Failed to compile fragment shader {}:\n{}\n", shader_name.c_str(), err);
|
2021-08-06 22:30:02 -04:00
|
|
|
m_is_okay = false;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_program = glCreateProgram();
|
|
|
|
glAttachShader(m_program, m_vert_shader);
|
|
|
|
glAttachShader(m_program, m_frag_shader);
|
|
|
|
glLinkProgram(m_program);
|
|
|
|
|
|
|
|
glGetProgramiv(m_program, GL_LINK_STATUS, &compile_ok);
|
|
|
|
if (!compile_ok) {
|
|
|
|
glGetProgramInfoLog(m_program, len, nullptr, err);
|
2021-12-04 12:33:18 -05:00
|
|
|
lg::error("Failed to link shader {}:\n{}\n", shader_name.c_str(), err);
|
2021-08-06 22:30:02 -04:00
|
|
|
m_is_okay = false;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
glDeleteShader(m_vert_shader);
|
|
|
|
glDeleteShader(m_frag_shader);
|
|
|
|
m_is_okay = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Shader::activate() {
|
2022-02-08 19:02:47 -05:00
|
|
|
ASSERT(m_is_okay);
|
2021-08-06 22:30:02 -04:00
|
|
|
glUseProgram(m_program);
|
|
|
|
}
|
|
|
|
|
|
|
|
ShaderLibrary::ShaderLibrary() {
|
|
|
|
at(ShaderId::TEST_SHADER) = {"test_shader"};
|
2021-08-07 18:57:13 -04:00
|
|
|
at(ShaderId::DIRECT_BASIC) = {"direct_basic"};
|
2021-08-08 20:46:14 -04:00
|
|
|
at(ShaderId::DIRECT_BASIC_TEXTURED) = {"direct_basic_textured"};
|
2021-09-26 11:41:58 -04:00
|
|
|
at(ShaderId::DEBUG_RED) = {"debug_red"};
|
2022-01-15 12:31:38 -05:00
|
|
|
at(ShaderId::SPRITE) = {"sprite_3d"};
|
2021-10-10 20:07:03 -04:00
|
|
|
at(ShaderId::SKY) = {"sky"};
|
|
|
|
at(ShaderId::SKY_BLEND) = {"sky_blend"};
|
2021-12-04 12:33:18 -05:00
|
|
|
at(ShaderId::TFRAG3) = {"tfrag3"};
|
|
|
|
at(ShaderId::TFRAG3_NO_TEX) = {"tfrag3_no_tex"};
|
2022-01-21 21:11:57 -05:00
|
|
|
at(ShaderId::SPRITE3) = {"sprite3_3d"};
|
2022-02-27 17:23:12 -05:00
|
|
|
at(ShaderId::DIRECT2) = {"direct2"};
|
2022-03-04 18:22:01 -05:00
|
|
|
at(ShaderId::EYE) = {"eye"};
|
2022-03-06 19:56:43 -05:00
|
|
|
at(ShaderId::GENERIC) = {"generic"};
|
2022-01-02 18:02:10 -05:00
|
|
|
}
|