CG-Project2
Loading...
Searching...
No Matches
Shader.hpp
1#pragma once
2
3#include "../Core/Resource.hpp"
4#include "../Graphic.hpp"
5
6#include <iostream>
7
8namespace ogl {
9 namespace shader {
10 const std::string DEFAULT_SHADER_DIR = "shader/";
11 const std::string DEFAULT_SHADER_LOCATION = res::DEFAULT_LOCATION + DEFAULT_SHADER_DIR;
12
13 enum ShaderType {
14 SHADER_TYPE_VERTEX,
15 SHADER_TYPE_FRAGMENT,
16 SHADER_TYPE_GEOMETRY,
17 SHADER_TYPE_PROGRAM,
18 SHADER_TYPE_NONE,
19 };
20
21 inline std::string getShaderTypeString(shader::ShaderType type) {
22 switch (type) {
23 case SHADER_TYPE_VERTEX:
24 return "VERTEX";
25 case shader::SHADER_TYPE_FRAGMENT:
26 return "FRAGMENT";
27 case shader::SHADER_TYPE_GEOMETRY:
28 return "GEOMETRY";
29 case shader::SHADER_TYPE_PROGRAM:
30 return "PROGRAM";
31 default:
32 return "NONE";
33 }
34 }
35
36 inline unsigned int getShaderTypeValue(shader::ShaderType type) {
37 switch (type) {
38 case shader::SHADER_TYPE_VERTEX:
39 return GL_VERTEX_SHADER;
40 case shader::SHADER_TYPE_FRAGMENT:
41 return GL_FRAGMENT_SHADER;
42 case shader::SHADER_TYPE_GEOMETRY:
43 return GL_GEOMETRY_SHADER;
44 case shader::SHADER_TYPE_PROGRAM:
45 std::cerr << "Invalid Shader type -> " << getShaderTypeString(type) << ".\nUse a ShaderProgram instead.";
46 assert(false);
47 default: {
48 std::cerr << "Invalid Shader type -> " << getShaderTypeString(type) << ".\n";
49 assert(false);
50 }
51 }
52 }
53 } // namespace shader
54
55 class Shader {
56 public:
57 void createShader();
58
59 inline unsigned int getId() const { return this->m_id; }
60
61 Shader() = delete;
62
63 Shader(const std::string &location, const std::string &file, const shader::ShaderType &type) :
64 m_location(std::move(location)), m_file(std::move(file)), m_type(type) {}
65
66 Shader(const std::string &file, const shader::ShaderType &type) :
67 Shader(shader::DEFAULT_SHADER_LOCATION, file, type) {}
68
69 ~Shader() = default;
70
71 private:
72 void checkCompileErrors();
73
74 unsigned int m_id = 0;
75 shader::ShaderType m_type = shader::ShaderType::SHADER_TYPE_NONE;
76
77 std::string m_location{};
78 std::string m_file{};
79 unsigned int m_resourceId = 0;
80 };
81
82 class ShaderProgram {
83 public:
84 void createShaderProgram();
85
86 void use() const;
87
88 inline unsigned int getId() const { return this->m_id; }
89
90 void setBool(const std::string &name, bool value) const;
91 void setInt(const std::string &name, int value) const;
92 void setFloat(const std::string &name, float value) const;
93
94 void setVec2(const std::string &name, const glm::vec2 &value) const;
95 void setVec2(const std::string &name, float x, float y) const;
96
97 void setVec3(const std::string &name, const glm::vec3 &value) const;
98 void setVec3(const std::string &name, float x, float y, float z) const;
99
100 void setVec4(const std::string &name, const glm::vec4 &value) const;
101 void setVec4(const std::string &name, float x, float y, float z, float w) const;
102
103 void setMat2(const std::string &name, const glm::mat2 &mat) const;
104 void setMat3(const std::string &name, const glm::mat3 &mat) const;
105 void setMat4(const std::string &name, const glm::mat4 &mat) const;
106
107 ShaderProgram() = delete;
108 ShaderProgram(const std::string &vloc, const std::string &vfile, const std::string &floc, const std::string &ffile);
109
110 ShaderProgram(const std::string &vfile, const std::string &ffile) :
111 ShaderProgram(shader::DEFAULT_SHADER_LOCATION, vfile,
112 shader::DEFAULT_SHADER_LOCATION, ffile) {}
113
114 ShaderProgram(const std::string &vloc, const std::string &vfile, const std::string &floc, const std::string &ffile,
115 const std::string &gloc, const std::string &gfile);
116
117 ShaderProgram(const std::string &vfile, const std::string &ffile, const std::string &gfile) :
118 ShaderProgram(shader::DEFAULT_SHADER_LOCATION, vfile,
119 shader::DEFAULT_SHADER_LOCATION, ffile,
120 shader::DEFAULT_SHADER_LOCATION, gfile) {}
121
122 ~ShaderProgram();
123
124 private:
125 void checkLinkingErrors();
126
127 unsigned int m_id = 0;
128 Unique<Shader> m_vert = nullptr;
129 Unique<Shader> m_frag = nullptr;
130 Unique<Shader> m_geom = nullptr;
131 };
132} // namespace ogl