Brenta Engine 1.1
Loading...
Searching...
No Matches
shader.cpp
1/*
2 * MIT License
3 *
4 * Copyright (c) 2024 Giovanni Santini
5
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 all
15 * copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24 *
25 */
26
27#include "shader.hpp"
28
29using namespace brenta;
30
31std::unordered_map<types::shader_name_t, unsigned int> shader::shaders;
32
33unsigned int shader::get_id(types::shader_name_t shader_name)
34{
35 if (shader::shaders.find(shader_name) == shader::shaders.end())
36 {
37 return 0;
38 }
39 return shader::shaders.at(shader_name);
40}
41
42/* Use/activate the shader */
43void shader::use(types::shader_name_t shader_name)
44{
45 glUseProgram(shader::get_id(shader_name));
46 GLenum err;
47 if ((err = glGetError()) != GL_NO_ERROR)
48 {
49 ERROR("Error using shader: {}", shader_name);
50 std::cout << err << std::endl;
51 }
52}
53
54/* Utility uniform functions */
55void shader::set_bool(types::shader_name_t shader_name, const std::string &name,
56 bool value)
57{
58 glUniform1i(glGetUniformLocation(shader::get_id(shader_name), name.c_str()),
59 (int) value);
60 if (glGetError() != GL_NO_ERROR)
61 {
62 ERROR("Error setting bool value for shader: {} and name: {}", shader_name, name);
63 }
64}
65
66void shader::set_int(types::shader_name_t shader_name, const std::string &name,
67 int value)
68{
69 glUniform1i(glGetUniformLocation(shader::get_id(shader_name), name.c_str()),
70 value);
71 if (glGetError() != GL_NO_ERROR)
72 {
73 ERROR("Error setting int value for shader: {} and name: {}", shader_name, name);
74 }
75}
76
77void shader::set_float(types::shader_name_t shader_name,
78 const std::string &name, float value)
79{
80 glUniform1f(glGetUniformLocation(shader::get_id(shader_name), name.c_str()),
81 value);
82 if (glGetError() != GL_NO_ERROR)
83 {
84 ERROR("Error setting float value for shader: {} and name: {}", shader_name, name);
85 }
86}
87
88void shader::set_mat4(types::shader_name_t shader_name, const GLchar *name,
89 glm::mat4 value)
90{
91 unsigned int matLoc =
92 glGetUniformLocation(shader::get_id(shader_name), name);
93 glUniformMatrix4fv(matLoc, 1, GL_FALSE, glm::value_ptr(value));
94 if (glGetError() != GL_NO_ERROR)
95 {
96 ERROR("Error setting mat4 value for shader: {} and name: {}", shader_name, name);
97 }
98}
99
100void shader::set_vec3(types::shader_name_t shader_name, const GLchar *name,
101 float x, float y, float z)
102{
103 unsigned int vecLoc =
104 glGetUniformLocation(shader::get_id(shader_name), name);
105 glUniform3f(vecLoc, x, y, z);
106 if (glGetError() != GL_NO_ERROR)
107 {
108 ERROR("Error setting vec3 value for shader: {} and name: {}", shader_name, name);
109 }
110}
111
112void shader::set_vec3(types::shader_name_t shader_name, const GLchar *name,
113 glm::vec3 value)
114{
115 unsigned int vecLoc =
116 glGetUniformLocation(shader::get_id(shader_name), name);
117 glUniform3f(vecLoc, value.x, value.y, value.z);
118 if (glGetError() != GL_NO_ERROR)
119 {
120 ERROR("Error setting vec3 value for shader: {} and name: {}", shader_name, name);
121 }
122}
123
124/* utility function for checking shader
125 * compilation/linking errors. */
126void shader::check_compile_errors(unsigned int shader, std::string type)
127{
128 int success;
129 char infoLog[1024];
130 if (type != "PROGRAM")
131 {
132 glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
133 if (!success)
134 {
135 glGetShaderInfoLog(shader, 1024, NULL, infoLog);
136 std::cout << "ERROR::SHADER_COMPILATION_ERROR of type: " << type
137 << "\n"
138 << infoLog << std::endl;
139 }
140 }
141 else
142 {
143 glGetProgramiv(shader, GL_LINK_STATUS, &success);
144 if (!success)
145 {
146 glGetProgramInfoLog(shader, 1024, NULL, infoLog);
147 std::cout << "ERROR::PROGRAM_LINKING_ERROR of type: " << type
148 << "\n"
149 << infoLog << std::endl;
150 }
151 }
152}
Shader class.
Definition shader.hpp:66
static void set_bool(types::shader_name_t shader_name, const std::string &name, bool value)
Set a boolean in the shader.
Definition shader.cpp:55
static std::unordered_map< types::shader_name_t, unsigned int > shaders
Map of shaders.
Definition shader.hpp:75
static void use(types::shader_name_t shader_name)
Use the shader.
Definition shader.cpp:43
static void set_int(types::shader_name_t shader_name, const std::string &name, int value)
Set an integer in the shader.
Definition shader.cpp:66
static void set_vec3(types::shader_name_t shader_name, const GLchar *name, float x, float y, float z)
Set a 3D vector in the shader.
Definition shader.cpp:100
static unsigned int get_id(types::shader_name_t shader_name)
Get the ID of a shader.
Definition shader.cpp:33
static void set_mat4(types::shader_name_t shader_name, const GLchar *name, glm::mat4 value)
Set a 4x4 matrix in the shader.
Definition shader.cpp:88
static void set_float(types::shader_name_t shader_name, const std::string &name, float value)
Set a float in the shader.
Definition shader.cpp:77