Tatooine
shader.h
Go to the documentation of this file.
1#ifndef TATOOINE_GL_SHADER_H
2#define TATOOINE_GL_SHADER_H
3//==============================================================================
4#include <array>
5#include <map>
6#include <optional>
7#include <string>
8#include <type_traits>
9#include <unordered_set>
10#include <tatooine/vec.h>
11#include <tatooine/mat.h>
12
13#include "computeshader.h"
14#include "dllexport.h"
15#include "fragmentshader.h"
16#include "geometryshader.h"
19#include "vertexshader.h"
20#include "windowsundefines.h"
21//==============================================================================
22namespace tatooine::gl {
23//==============================================================================
24class shader : public id_holder<GLuint> {
25 public:
26 shader() = default;
28 if (m_delete) {
30 }
31 }
32
33 template <typename T, typename... Args>
34 void add_stage(Args&&... args) {
35 m_shader_stages.push_back(T{std::forward<Args>(args)...});
36 }
37
38 DLL_API void create();
39 DLL_API void delete_shader();
40
41 DLL_API void bind() const;
42 DLL_API void unbind() const;
43 DLL_API void add_uniform(const std::string& uniformVarName);
44 DLL_API void add_attribute(const std::string& attributeVarName);
45 DLL_API GLint uniform(const std::string& uniformVarName);
46 DLL_API GLint attribute(const std::string& attributeVarName);
47
48 DLL_API void set_uniform(const std::string&, GLfloat);
49 DLL_API void set_uniform(const std::string&, GLint);
50 DLL_API void set_uniform(const std::string&, GLuint);
51 DLL_API void set_uniform(const std::string&, GLboolean);
52
53 DLL_API void set_uniform(const std::string&, GLfloat, GLfloat);
54 DLL_API void set_uniform(const std::string&, GLfloat, GLfloat, GLfloat);
55 DLL_API void set_uniform(const std::string&, GLfloat, GLfloat, GLfloat,
56 GLfloat);
57
58 DLL_API void set_uniform(const std::string&,
59 std::array<GLfloat, 2> const& data);
60 DLL_API void set_uniform(const std::string&,
61 std::array<GLfloat, 3> const& data);
62 DLL_API void set_uniform(const std::string&,
63 std::array<GLfloat, 4> const& data);
64
65 DLL_API void set_uniform(const std::string&, GLint, GLint);
66 DLL_API void set_uniform(const std::string&, GLint, GLint, GLint);
67 DLL_API void set_uniform(const std::string&, GLint, GLint, GLint, GLint);
68
69 DLL_API void set_uniform(const std::string&,
70 std::array<GLint, 2> const& data);
71 DLL_API void set_uniform(const std::string&,
72 std::array<GLint, 3> const& data);
73 DLL_API void set_uniform(const std::string&,
74 std::array<GLint, 4> const& data);
75
76 DLL_API void set_uniform(const std::string&, GLuint, GLuint);
77 DLL_API void set_uniform(const std::string&, GLuint, GLuint, GLuint);
78 DLL_API void set_uniform(const std::string&, GLuint, GLuint, GLuint, GLuint);
79
80 DLL_API void set_uniform(const std::string&,
81 std::array<GLuint, 2> const& data);
82 DLL_API void set_uniform(const std::string&,
83 std::array<GLuint, 3> const& data);
84 DLL_API void set_uniform(const std::string&,
85 std::array<GLuint, 4> const& data);
86
87 DLL_API void set_uniform(const std::string&, Vec2<GLfloat> const&);
88 DLL_API void set_uniform_vec2(const std::string&, GLfloat const*);
89 DLL_API void set_uniform(const std::string&, Vec2<GLint> const&);
90 DLL_API void set_uniform_vec2(const std::string&, GLint const*);
91 DLL_API void set_uniform(const std::string&, Vec2<GLuint> const&);
92 DLL_API void set_uniform_vec2(const std::string&, GLuint const*);
93
94 DLL_API void set_uniform(const std::string&, Vec3<GLfloat> const&);
95 DLL_API void set_uniform_vec3(const std::string&, GLfloat const*);
96 DLL_API void set_uniform(const std::string&, Vec3<GLint> const&);
97 DLL_API void set_uniform_vec3(const std::string&, GLint const*);
98 DLL_API void set_uniform(const std::string&, Vec3<GLuint> const&);
99 DLL_API void set_uniform_vec3(const std::string&, GLuint const*);
100
101 DLL_API void set_uniform(const std::string&, Vec4<GLfloat> const&);
102 DLL_API void set_uniform_vec4(const std::string&, GLfloat const*);
103 DLL_API void set_uniform(const std::string&, Vec4<GLint> const&);
104 DLL_API void set_uniform_vec4(const std::string&, GLint const*);
105 DLL_API void set_uniform(const std::string&, Vec4<GLuint> const&);
106 DLL_API void set_uniform_vec4(const std::string&, GLuint const*);
107
108 DLL_API void set_uniform(const std::string&, Mat2<GLfloat> const&);
109 DLL_API void set_uniform_mat2(const std::string&, GLfloat const*);
110 DLL_API void set_uniform(const std::string&, Mat3<GLfloat> const&);
111 DLL_API void set_uniform_mat3(const std::string&, GLfloat const*);
112 DLL_API void set_uniform(const std::string&, Mat4<GLfloat> const&);
113 DLL_API void set_uniform_mat4(const std::string&, GLfloat const*);
114
115 DLL_API std::optional<std::string> info_log();
116
117 private:
118 std::map<std::string, GLint> m_uniform_locations;
119 std::map<std::string, GLint> m_attribute_locations;
120 std::vector<shaderstage> m_shader_stages;
121 std::unordered_set<std::string> m_uniform_var_names;
122 std::unordered_set<std::string> m_attribute_var_names;
123
124 bool m_delete = true;
125};
126
127//==============================================================================
128} // namespace tatooine::gl
129//==============================================================================
130#endif
Definition: shader.h:24
DLL_API void set_uniform_vec4(const std::string &, GLint const *)
DLL_API void set_uniform_vec3(const std::string &, GLuint const *)
DLL_API void set_uniform(const std::string &, Vec2< GLuint > const &)
DLL_API void set_uniform_vec3(const std::string &, GLfloat const *)
~shader()
Definition: shader.h:27
std::vector< shaderstage > m_shader_stages
Definition: shader.h:120
DLL_API std::optional< std::string > info_log()
DLL_API void set_uniform(const std::string &, Mat2< GLfloat > const &)
DLL_API void set_uniform(const std::string &, GLfloat)
DLL_API void set_uniform(const std::string &, Vec2< GLint > const &)
DLL_API void set_uniform_vec3(const std::string &, GLint const *)
DLL_API void bind() const
DLL_API void set_uniform(const std::string &, GLfloat, GLfloat, GLfloat)
DLL_API void create()
DLL_API GLint attribute(const std::string &attributeVarName)
DLL_API void set_uniform(const std::string &, std::array< GLint, 4 > const &data)
DLL_API void add_attribute(const std::string &attributeVarName)
DLL_API void set_uniform(const std::string &, std::array< GLint, 2 > const &data)
DLL_API void set_uniform(const std::string &, std::array< GLfloat, 3 > const &data)
DLL_API void set_uniform(const std::string &, Vec3< GLfloat > const &)
DLL_API void set_uniform(const std::string &, std::array< GLfloat, 2 > const &data)
DLL_API void set_uniform(const std::string &, std::array< GLuint, 2 > const &data)
DLL_API void set_uniform_mat4(const std::string &, GLfloat const *)
DLL_API void add_uniform(const std::string &uniformVarName)
DLL_API void set_uniform(const std::string &, std::array< GLfloat, 4 > const &data)
std::unordered_set< std::string > m_uniform_var_names
Definition: shader.h:121
DLL_API void set_uniform(const std::string &, GLint, GLint, GLint)
void add_stage(Args &&... args)
Definition: shader.h:34
DLL_API void set_uniform(const std::string &, GLint)
DLL_API void set_uniform(const std::string &, std::array< GLuint, 3 > const &data)
DLL_API void set_uniform(const std::string &, GLuint, GLuint)
DLL_API void set_uniform_vec4(const std::string &, GLuint const *)
DLL_API void delete_shader()
std::unordered_set< std::string > m_attribute_var_names
Definition: shader.h:122
DLL_API void set_uniform(const std::string &, Vec2< GLfloat > const &)
DLL_API void set_uniform(const std::string &, std::array< GLint, 3 > const &data)
DLL_API void set_uniform(const std::string &, GLfloat, GLfloat, GLfloat, GLfloat)
DLL_API void set_uniform(const std::string &, GLuint)
DLL_API void set_uniform_vec2(const std::string &, GLint const *)
DLL_API void unbind() const
DLL_API void set_uniform_mat2(const std::string &, GLfloat const *)
DLL_API void set_uniform(const std::string &, GLint, GLint)
DLL_API void set_uniform(const std::string &, Vec3< GLuint > const &)
DLL_API GLint uniform(const std::string &uniformVarName)
DLL_API void set_uniform_vec2(const std::string &, GLuint const *)
DLL_API void set_uniform(const std::string &, Mat4< GLfloat > const &)
std::map< std::string, GLint > m_uniform_locations
Definition: shader.h:118
DLL_API void set_uniform_mat3(const std::string &, GLfloat const *)
DLL_API void set_uniform_vec2(const std::string &, GLfloat const *)
DLL_API void set_uniform(const std::string &, GLint, GLint, GLint, GLint)
DLL_API void set_uniform(const std::string &, Vec4< GLfloat > const &)
DLL_API void set_uniform(const std::string &, Mat3< GLfloat > const &)
DLL_API void set_uniform(const std::string &, GLuint, GLuint, GLuint, GLuint)
DLL_API void set_uniform(const std::string &, Vec3< GLint > const &)
DLL_API void set_uniform_vec4(const std::string &, GLfloat const *)
DLL_API void set_uniform(const std::string &, GLuint, GLuint, GLuint)
bool m_delete
Definition: shader.h:124
DLL_API void set_uniform(const std::string &, Vec4< GLint > const &)
DLL_API void set_uniform(const std::string &, Vec4< GLuint > const &)
std::map< std::string, GLint > m_attribute_locations
Definition: shader.h:119
DLL_API void set_uniform(const std::string &, std::array< GLuint, 4 > const &data)
DLL_API void set_uniform(const std::string &, GLboolean)
DLL_API void set_uniform(const std::string &, GLfloat, GLfloat)
Definition: ansiformat.h:6
Definition: idholder.h:31
Definition: mat.h:14
Definition: vec.h:12