1#ifndef GLK_GLSL_SHADER_HPP
2#define GLK_GLSL_SHADER_HPP
10#include <unordered_set>
11#include <unordered_map>
26 bool attach_source(
const std::vector<std::string>& filenames, GLuint shader_type);
28 bool attach_source(
const std::string& filename,
const std::unordered_set<std::string>& include_filenames,
const std::string& defines, GLuint shader_type);
29 bool attach_source(
const std::vector<std::string>& filenames,
const std::unordered_set<std::string>& include_filenames,
const std::string& defines, GLuint shader_type);
35 bool init(
const std::string& shader_path);
36 bool init(
const std::string& vertex_shader_path,
const std::string& fragment_shader_path);
37 bool init(
const std::vector<std::string>& vertex_shader_paths,
const std::vector<std::string>& fragment_shader_paths);
39 GLuint
id()
const {
return shader_program; }
40 void use()
const { glUseProgram(shader_program); }
41 void unuse()
const { glUseProgram(0); }
43 GLint
attrib(std::uint64_t name,
const char* debug_msg =
nullptr);
44 GLint
attrib(
const std::string& name);
45 GLint
uniform(std::uint64_t name,
const char* debug_msg =
nullptr);
47 GLint
subroutine(GLenum shader_type, std::uint64_t name,
const char* debug_msg =
nullptr);
48 GLint
subroutine(GLenum shader_type,
const std::string& name);
49 GLint
subroutine_uniform(GLenum shader_type, std::uint64_t name,
const char* debug_msg =
nullptr);
66 const auto found = std::find_if(uniform_variable_cache.begin(), uniform_variable_cache.end(), [=](
const auto& pair) { return pair.first == name; });
67 if (found == uniform_variable_cache.end()) {
68 std::cerr <<
"warning: failed to find uniform variable cache " << name << std::endl;
71 return *
reinterpret_cast<const T*
>(found->second.get());
76 const auto found = std::find_if(uniform_variable_cache.begin(), uniform_variable_cache.end(), [=](
const auto& pair) { return pair.first == name; });
77 if (found == uniform_variable_cache.end()) {
80 return *
reinterpret_cast<const T*
>(found->second.get());
84 void set_uniform(std::uint64_t name,
int value,
const char* debug_msg =
nullptr);
88 void set_uniform(std::uint64_t name,
float value,
const char* debug_msg =
nullptr);
92 void set_uniform(std::uint64_t name,
const Eigen::Vector2f& vector,
const char* debug_msg =
nullptr);
93 void set_uniform(
const std::string& name,
const Eigen::Vector2f& vector);
96 void set_uniform(std::uint64_t name,
const Eigen::Vector3f& vector,
const char* debug_msg =
nullptr);
97 void set_uniform(
const std::string& name,
const Eigen::Vector3f& vector);
100 void set_uniform(std::uint64_t name,
const Eigen::Vector4f& vector,
const char* debug_msg =
nullptr);
101 void set_uniform(
const std::string& name,
const Eigen::Vector4f& vector);
104 void set_uniform(std::uint64_t name,
const Eigen::Vector2i& vector,
const char* debug_msg =
nullptr);
105 void set_uniform(
const std::string& name,
const Eigen::Vector2i& vector);
108 void set_uniform(std::uint64_t name,
const Eigen::Vector3i& vector,
const char* debug_msg =
nullptr);
109 void set_uniform(
const std::string& name,
const Eigen::Vector3i& vector);
112 void set_uniform(std::uint64_t name,
const Eigen::Vector4i& vector,
const char* debug_msg =
nullptr);
113 void set_uniform(
const std::string& name,
const Eigen::Vector4i& vector);
116 void set_uniform(std::uint64_t name,
const Eigen::Matrix4f& matrix,
const char* debug_msg =
nullptr);
117 void set_uniform(
const std::string& name,
const Eigen::Matrix4f& matrix);
120 void set_uniform(std::uint64_t name,
const std::vector<int>& vectors,
const char* debug_msg =
nullptr);
121 void set_uniform(
const std::string& name,
const std::vector<int>& vectors);
124 void set_uniform(std::uint64_t name,
const std::vector<float>& vectors,
const char* debug_msg =
nullptr);
125 void set_uniform(
const std::string& name,
const std::vector<float>& vectors);
128 void set_uniform(std::uint64_t name,
const std::vector<Eigen::Vector2f>& vectors,
const char* debug_msg =
nullptr);
129 void set_uniform(
const std::string& name,
const std::vector<Eigen::Vector2f>& vectors);
132 void set_uniform(std::uint64_t name,
const std::vector<Eigen::Vector3f>& vectors,
const char* debug_msg =
nullptr);
133 void set_uniform(
const std::string& name,
const std::vector<Eigen::Vector3f>& vectors);
136 void set_uniform(std::uint64_t name,
const std::vector<Eigen::Vector4f>& vectors,
const char* debug_msg =
nullptr);
137 void set_uniform(
const std::string& name,
const std::vector<Eigen::Vector4f>& vectors);
139 void set_uniform(std::uint64_t name,
const Eigen::Matrix4d& matrix_,
const char* debug_msg =
nullptr);
140 void set_uniform(
const std::string& name,
const Eigen::Matrix4d& matrix_);
142 void set_subroutine(GLenum shader_type,
const std::string& loc,
const std::string& func);
145 GLuint read_shader_from_file(
const std::string& filename,
const std::unordered_map<std::string, std::string>& include_map,
const std::string& defines, GLuint shader_type);
147 template <
typename T>
148 void set_uniform_cache(std::uint64_t h,
const T& value) {
149 const auto found = std::find_if(uniform_variable_cache.begin(), uniform_variable_cache.end(), [&h](
const auto& pair) { return pair.first == h; });
150 if (found != uniform_variable_cache.end()) {
151 *
reinterpret_cast<T*
>(found->second.get()) = value;
158 std::vector<GLuint> shaders;
159 std::vector<std::string> feedback_varyings;
162 std::vector<std::pair<std::uint64_t, GLint>> attrib_cache;
163 std::vector<std::pair<std::uint64_t, GLint>> uniform_cache;
165 std::vector<std::pair<std::uint64_t, GLint>> subroutine_cache;
166 std::vector<std::pair<std::uint64_t, std::shared_ptr<void>>> uniform_variable_cache;
Definition glsl_shader.hpp:20
int get_uniformi(std::uint64_t name)
GLint subroutine_uniform(GLenum shader_type, std::uint64_t name, const char *debug_msg=nullptr)
void set_uniform(std::uint64_t name, const std::vector< float > &vectors, const char *debug_msg=nullptr)
GLint uniform(std::uint64_t name, const char *debug_msg=nullptr)
void set_subroutine(GLenum shader_type, const std::string &loc, const std::string &func)
void set_uniform(const std::string &name, const Eigen::Vector4i &vector)
void set_uniform(const std::string &name, int value)
T get_uniform_cache(std::uint64_t name) const
Definition glsl_shader.hpp:65
bool init(const std::string &shader_path)
GLint subroutine_uniform(GLenum shader_type, const std::string &name)
float get_uniformf(std::uint64_t name)
void set_uniform(std::uint64_t name, const Eigen::Vector3f &vector, const char *debug_msg=nullptr)
GLint attrib(std::uint64_t name, const char *debug_msg=nullptr)
void set_uniform(const std::string &name, const std::vector< int > &vectors)
GLint uniform(const std::string &name)
void set_uniform(const std::string &name, const Eigen::Vector3i &vector)
void set_uniform(std::uint64_t name, const Eigen::Vector4f &vector, const char *debug_msg=nullptr)
void set_uniform(std::uint64_t name, const Eigen::Matrix4d &matrix_, const char *debug_msg=nullptr)
bool init(const std::vector< std::string > &vertex_shader_paths, const std::vector< std::string > &fragment_shader_paths)
std::optional< T > get_uniform_cache_safe(std::uint64_t name) const
Definition glsl_shader.hpp:75
void set_uniform(const std::string &name, const Eigen::Matrix4f &matrix)
GLint subroutine(GLenum shader_type, std::uint64_t name, const char *debug_msg=nullptr)
Eigen::Matrix4f get_uniform_matrix4f(const std::string &name)
GLuint id() const
Definition glsl_shader.hpp:39
bool add_feedback_varying(const std::string &name)
void set_uniform(std::uint64_t name, const Eigen::Vector4i &vector, const char *debug_msg=nullptr)
void set_uniform(const std::string &name, const std::vector< float > &vectors)
void set_uniform(const std::string &name, const Eigen::Vector2f &vector)
bool attach_source(const std::string &filename, GLuint shader_type)
void set_uniform(std::uint64_t name, int value, const char *debug_msg=nullptr)
GLint subroutine(GLenum shader_type, const std::string &name)
GLint attrib(const std::string &name)
void set_uniform(const std::string &name, const std::vector< Eigen::Vector2f > &vectors)
void set_uniform(const std::string &name, const std::vector< Eigen::Vector4f > &vectors)
bool attach_source(const std::string &filename, const std::unordered_set< std::string > &include_filenames, const std::string &defines, GLuint shader_type)
void use() const
Definition glsl_shader.hpp:40
void set_uniform(std::uint64_t name, const Eigen::Vector3i &vector, const char *debug_msg=nullptr)
int get_uniformi(const std::string &name)
void set_uniform(const std::string &name, const Eigen::Vector4f &vector)
bool attach_source(const std::vector< std::string > &filenames, GLuint shader_type)
void set_uniform(const std::string &name, const Eigen::Vector3f &vector)
bool attach_source(const std::vector< std::string > &filenames, const std::unordered_set< std::string > &include_filenames, const std::string &defines, GLuint shader_type)
void set_uniform(std::uint64_t name, const std::vector< Eigen::Vector2f > &vectors, const char *debug_msg=nullptr)
void set_uniform(std::uint64_t name, const std::vector< Eigen::Vector3f > &vectors, const char *debug_msg=nullptr)
void set_uniform(const std::string &name, const std::vector< Eigen::Vector3f > &vectors)
void set_uniform(std::uint64_t name, const std::vector< Eigen::Vector4f > &vectors, const char *debug_msg=nullptr)
void set_uniform(const std::string &name, const Eigen::Matrix4d &matrix_)
Eigen::Matrix4f get_uniform_matrix4f(std::uint64_t name)
Eigen::Vector4f get_uniform4f(std::uint64_t name)
void set_uniform(const std::string &name, const Eigen::Vector2i &vector)
void set_uniform(const std::string &name, float value)
Eigen::Vector4f get_uniform4f(const std::string &name)
void set_uniform(std::uint64_t name, float value, const char *debug_msg=nullptr)
void set_uniform(std::uint64_t name, const Eigen::Vector2f &vector, const char *debug_msg=nullptr)
bool init(const std::string &vertex_shader_path, const std::string &fragment_shader_path)
void unuse() const
Definition glsl_shader.hpp:41
void set_uniform(std::uint64_t name, const Eigen::Vector2i &vector, const char *debug_msg=nullptr)
float get_uniformf(const std::string &name)
void set_uniform(std::uint64_t name, const std::vector< int > &vectors, const char *debug_msg=nullptr)
void set_uniform(std::uint64_t name, const Eigen::Matrix4f &matrix, const char *debug_msg=nullptr)
Definition async_buffer_copy.hpp:6
std::enable_if_t< needs_aligned_allocator< T >::value, std::shared_ptr< T > > make_shared(Args &&... args)
Definition make_shared.hpp:20